我用的方法是使用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')");
Run Code Online (Sandbox Code Playgroud)
每当您与内部数据库进行交互时,php您需要记住一个清单:
正确设置连接,例如,确保在使用pdo时将错误模式设置为异常并告诉它不要模拟预准备语句.使用以下代码设置连接属性:
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Run Code Online (Sandbox Code Playgroud)在获取数据时使用预准备语句和参数化查询.
使用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
}
Run Code Online (Sandbox Code Playgroud)
使用PDO:
$stment = $pdo->prepare('SELECT * FROM users WHERE name = :name');
$stment->execute(array('name' => $name));
foreach ($stment as $row) {
// do something with $row
}
Run Code Online (Sandbox Code Playgroud)
准备好的查询背后的想法非常简单 - 查询和数据分别发送到SQL服务器.当我们发送数据库查询以及数据时,数据可用于执行潜在的恶意查询.有关详细信息,请参阅此答案.
如果要动态添加标识符和语法关键字,请使用白名单.它主要涉及检查用户输入是否是预期的输入,如下所示:
$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
Run Code Online (Sandbox Code Playgroud)
mysqli_real_escape_string如果由于某种原因未使用预准备语句,请在使用函数插入/搜索数据库之前清理用户的输入.