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

问题描述 投票:1回答:2

我使用了一些借来的代码,并担心它容易受到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);

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

谢谢

php mysqli utf-8 sql-injection
2个回答
0
投票

问题1:$ mysqli-> query(“ SET NAMES'utf8'”);有任何形式的sql注入协助吗?

以这种方式措词-绝对没有。但是请参阅底部的注释。

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

您出于妄想而问,转义与注射有关,而实际上与注射无关。因此,让我们改写您的问题:

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

是。您有三个选择。

  1. 由于$ userID是一个数字,您可以将其显式转换为该类型,$userID = intval($_POST['userID'];)
  2. Mysql(当不在STRICT MODE时)让您将数字作为字符串发送。字符串必须按照以下两个简单规则进行格式化,如Rob的答案所示:
    • 必须用单引号分隔
    • 这些引号必须转义。
  3. 您可以使用准备好的语句。要使用这种时尚的方式运行sql查询,您必须使用prepare() + execute()方法而不是query(),并使用bind_param()绑定变量。

关于标题问题的注释。

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

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


2
投票

转义$userId是不够的。

您还必须在查询中引用值,或过滤$userId(仅允许数字)。

if($result = $mysqli->query("SELECT * FROM towns WHERE userID='".$userID."'")) {
//                                                            ^         ^^^^
© www.soinside.com 2019 - 2024. All rights reserved.