正在将命名空间设置为utf-8任何形式的sql注入保护


is setting namespace to utf-8 any form of sql injection protection?

我使用了一些借来的代码,并担心它容易受到SQL注入的攻击。。。

// Set the default namespace to utf8
$mysqli->query("SET NAMES 'utf8'");
$userID = $_POST['userID'];
$json   = array();
if($result = $mysqli->query("SELECT * FROM towns WHERE userID=".$userID)) {
while ($row=$result->fetch_assoc()) {
    $json[]=array(
        'townID'=>$row['townID'],
        'townName'=>$row['townName']
    );
}
}
$result->close(); 
header("Content-Type: text/json");
echo json_encode(array( 'towns'  =>   $json ));

问题1:$mysqli->query("SET NAMES 'utf8'");有任何形式的sql注入帮助吗?问题2:我应该使用某种形式的real_escape_string吗?

如果我需要使用real_escape_string,我应该这样设置var吗:

$userID = $_POST['userID'];
$userID = $mysqli->real_escape_string($userID);

然后,我可以像当前在查询中一样使用它吗?

感谢

仅逃离$userId是不够的。

您还必须在查询中引用值,或筛选$userId(只允许使用数字)。

if($result = $mysqli->query("SELECT * FROM towns WHERE userID='".$userID."'")) {
//                                                            ^         ^^^^

问题1:$mysqli->是否查询("SET NAMES'utf8'");有任何形式的sql注入帮助吗?

这样说-绝对不是。
但请看底部的注释。

问题2:我应该使用某种形式的real_escape_string吗?

你是在妄想逃跑与注射有关,而事实并非如此。因此,让我们重新表述您的问题:

问题2a:我应该对SQL注入采取一些预防措施吗?

是的
你有三个选择。

  1. 由于$userID是一个数字,您可以显式地将其强制转换为该类型$userID = intval($_POST['userID'];)
  2. Mysql(当不处于严格模式时)允许您将数字作为字符串发送。字符串必须根据以下两条简单规则进行格式化,如Rob的回答所示:
    • 必须用单引号分隔
    • 这些引号必须转义
  3. 你可以使用事先准备好的语句。要使用这样一种流行的运行sql查询的方式,您必须使用prepare()+execute()方法而不是query(),并使用bind_param()绑定变量

关于标题问题的说明。

将名称空间设置为utf-8是否有任何形式的sql注入保护?

是的,在某种程度上
在某些极为罕见的情况下,确实如此。
对于某些罕见的编码,real_escape_string族函数可能无法正确进行分隔符转义。为了避免这种情况,必须使用set_charset家族函数设置客户端编码,在您的情况下为mysqli->set_charset()