我是否正确插入数据(php+ MySQLi)?
Do I insert data right (php+ MySQLi)?
我用MySQLi插入数据的方法对吗?它有效,但它足够安全吗?
$login = stripslashes($login);
$login = htmlspecialchars($login);
$password = stripslashes($password);
$password = htmlspecialchars($password);
$login = trim($login);
$password = trim($password);
$result2=mysqli_query($db,"INSERT INTO users (login,password) VALUES('$login','$password')");
使用PDO
。被认为比过时的 MySqli 更安全。
每当您与 php
中的数据库交互时,您需要记住一个清单:
正确设置连接,例如确保在使用pdo
时,将错误模式设置为异常并告诉它不模拟准备好的陈述。使用以下代码设置连接属性:
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
在获取数据时使用准备好的语句和参数化查询。
使用 mysqli:
$stment = $dbConnection->prepare('SELECT * FROM users WHERE name = ?');
$stment->bind_param('s', $name);
$stment->execute();
$result = $stment->get_result();
while ($row = $result->fetch_assoc()) {
// do something with $row
}
使用 PDO:
$stment = $pdo->prepare('SELECT * FROM users WHERE name = :name');
$stment->execute(array('name' => $name));
foreach ($stment as $row) {
// do something with $row
}
准备好的查询背后的想法非常简单 - 查询和数据分别发送到 SQL 服务器。当我们将数据库查询与数据一起发送时,数据可用于执行潜在的恶意查询。有关详细信息,请参阅 this 答案。
如果您想动态添加标识符和语法关键字,请使用白名单。它主要涉及检查用户输入是否符合预期,如下所示:
$orders = array("name","price","qty"); //field names
$key = array_search($_GET['sort'],$orders)); // see if we have such a name
$orderby = $orders[$key]; //if not, first one will be set automatically. smart enuf :)
$query = "SELECT * FROM `table` ORDER BY $orderby"; //value is safe
- 在 inserting/searching 数据库之前 清理来自用户的输入
mysqli_real_escape_string
如果您出于某种原因没有使用准备好的语句。
- 确保处理好异常和错误。
你也可以使用下面的函数来做同样的事情。您可以使用以下函数准备直接用于数据库查询的最终字符串。此功能将处理几乎所有阻止 sql 注入的事情,并从您的输入中清除有害或不需要的内容。
function cleanInputs($data) {
$clean_input = array();
if (is_array($data)) {
foreach($data as $k = > $v) {
$clean_input[$k] = cleanInputs($v);
}
} else {
if (get_magic_quotes_gpc()) {
$data = trim(stripslashes($data));
}
$data = strip_tags($data);
$clean_input = trim($data);
}
return $clean_input;
}
事情取决于需求你甚至可以相应地修改定义或逻辑。
我用MySQLi插入数据的方法对吗?它有效,但它足够安全吗?
$login = stripslashes($login);
$login = htmlspecialchars($login);
$password = stripslashes($password);
$password = htmlspecialchars($password);
$login = trim($login);
$password = trim($password);
$result2=mysqli_query($db,"INSERT INTO users (login,password) VALUES('$login','$password')");
使用PDO
。被认为比过时的 MySqli 更安全。
每当您与 php
中的数据库交互时,您需要记住一个清单:
正确设置连接,例如确保在使用
pdo
时,将错误模式设置为异常并告诉它不模拟准备好的陈述。使用以下代码设置连接属性:$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
在获取数据时使用准备好的语句和参数化查询。
使用 mysqli:
$stment = $dbConnection->prepare('SELECT * FROM users WHERE name = ?');
$stment->bind_param('s', $name);
$stment->execute();
$result = $stment->get_result();
while ($row = $result->fetch_assoc()) {
// do something with $row
}
使用 PDO:
$stment = $pdo->prepare('SELECT * FROM users WHERE name = :name');
$stment->execute(array('name' => $name));
foreach ($stment as $row) {
// do something with $row
}
准备好的查询背后的想法非常简单 - 查询和数据分别发送到 SQL 服务器。当我们将数据库查询与数据一起发送时,数据可用于执行潜在的恶意查询。有关详细信息,请参阅 this 答案。
如果您想动态添加标识符和语法关键字,请使用白名单。它主要涉及检查用户输入是否符合预期,如下所示:
$orders = array("name","price","qty"); //field names
$key = array_search($_GET['sort'],$orders)); // see if we have such a name
$orderby = $orders[$key]; //if not, first one will be set automatically. smart enuf :)
$query = "SELECT * FROM `table` ORDER BY $orderby"; //value is safe
- 在 inserting/searching 数据库之前 清理来自用户的输入
mysqli_real_escape_string
如果您出于某种原因没有使用准备好的语句。 - 确保处理好异常和错误。
你也可以使用下面的函数来做同样的事情。您可以使用以下函数准备直接用于数据库查询的最终字符串。此功能将处理几乎所有阻止 sql 注入的事情,并从您的输入中清除有害或不需要的内容。
function cleanInputs($data) {
$clean_input = array();
if (is_array($data)) {
foreach($data as $k = > $v) {
$clean_input[$k] = cleanInputs($v);
}
} else {
if (get_magic_quotes_gpc()) {
$data = trim(stripslashes($data));
}
$data = strip_tags($data);
$clean_input = trim($data);
}
return $clean_input;
}
事情取决于需求你甚至可以相应地修改定义或逻辑。