可能重复:
在 PHP 中防止 SQL 注入的最佳方法
我想知道 sql 注入并想知道何时使用 mysqli_real_escape_string。
每次我的查询中有 WHERE 子句时都需要使用它吗?
可能重复:
在 PHP 中防止 SQL 注入的最佳方法
我想知道 sql 注入并想知道何时使用 mysqli_real_escape_string。
每次我的查询中有 WHERE 子句时都需要使用它吗?
对于来自用户或不可信的任何数据,您应该使用 mysqli_real_escape_string。
当您在查询中包含 $_REQUEST "vars" 时,您必须使用它,例如。
$query = "UPDATE foo set bar = '{$_GET['var']}' ..."
$query = "INSERT INTO foo ('{$_POST['var']}',) ..."
$query = "SELECT bla from foo WHERE bar = '{$_COOKIE['var']}'"
每个查询都必须是 mysqli_real_escape_string 才能提供注入...
您使用mysqli_real_escape_string
它或它的任何变体来确保来自任何用户输入字段的数据被正确转义。
例如,您有一个包含几个输入的表单。您单击提交,数据将作为请求发送到您的 PHP 脚本。在您的脚本中,您将用户发布的值插入数据库。
例如,如果用户在用户登录时在输入字段中键入以下内容:
' WHERE `username` = {x} AND password > 1;
该人有可能拥有您正在使用的表中的所有数据。使用:
mysqli_real_escape_string($input)
将产生上述内容:
\' WHERE `username` = {x} AND password > 1;
' 上的转义字符串将阻止可能的 SQL 注入攻击。
也就是说,您没有理由使用mysqli_real_escape_string()
PDO,并且绑定参数在转移许多不同的 SQL 攻击/注入方法方面要优越得多。学习并使用它!
因评论而编辑
%
并且_
还需要特殊处理mysqli_real_escape_string()
function escape_extra_chars ( $string )
{
$string = preg_replace("/\%/", "\%", $string);
$string = preg_replace("/\_/", "\_", $string);
return $string;
}
无论如何(该功能未经测试)