不使用prepared statements and parameterized queries就可以防止恶意sql语句吗?
简化后的示例:
<?php
$con = mysqli_connect($_POST['db_server'], $_POST['db_user'],
$_POST['db_password'], $_POST['db_database']) or die(mysql_error());
$result = mysqli_query($con, $_POST['query_message']);
?>
是否可以检查参数$_POST['query_message']是否安全?
最佳答案
您应该始终在代码中构建查询,然后清除要在其中使用的任何变量。永远不要通过$_POST
传递查询或数据库连接变量,除非您的用户通过该表单查询数据库,在这种情况下,我建议您只安装phpMyAdmin。
至于清理变量,如果您真的不想使用PDO的prepared语句,可以按如下方式清理传入的整数:
$id = (isset($_POST['id']) ? (int)$_POST['id'] : null);
if ($id) {
$sql = "SELECT *
FROM `table`
WHERE `id` = {$id}";
}
对于字符串,请使用:
$username = (isset($_POST['username']) ? mysqli_real_escape_string($con, $_POST['username']) : null);
if ($username) {
$sql = "SELECT *
FROM `table`
WHERE `username` = {$username}";
}
您还可以直接在
real_escape_string()
对象上调用$con
,如下所示:$username = (isset($_POST['username']) ? $con->real_escape_string($con, $_POST['username']) : null);
但是,和上面的@Shankar Damodaran一样,我强烈建议您使用PDO准备的语句来查询数据库。
关于php - 保护通用SQL查询语句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22316074/