我使用了一些借来的代码,并担心它容易受到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);
然后,就可以像当前在查询中一样使用它?
谢谢
问题1:$ mysqli-> query(“ SET NAMES'utf8'”);有任何形式的sql注入协助吗?
以这种方式措词-绝对没有。但是请参阅底部的注释。
问题2:我应该使用某种形式的real_escape_string吗?
您出于妄想而问,转义与注射有关,而实际上与注射无关。因此,让我们改写您的问题:
问题2a:我应该采取一些预防措施以防止SQL注入吗?
是。您有三个选择。
$userID = intval($_POST['userID'];)
prepare()
+ execute()
方法而不是query()
,并使用bind_param()
绑定变量。 关于标题问题的注释。
是否将名称空间设置为utf-8任何形式的SQL注入保护?
是,在某种程度上。在某些极为罕见的情况下,确实如此。对于某些罕见的编码,real_escape_string
系列功能可能无法正确进行定界符转义。为避免这种情况,必须使用set_charset
系列功能(在您的情况下为mysqli->set_charset()
)设置客户端编码。
转义$userId
是不够的。
您还必须在查询中引用值,或过滤$userId
(仅允许数字)。
if($result = $mysqli->query("SELECT * FROM towns WHERE userID='".$userID."'")) {
// ^ ^^^^