我使用了一些借来的代码,并担心它容易受到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注入采取一些预防措施吗?
是的
你有三个选择。
- 由于$userID是一个数字,您可以显式地将其强制转换为该类型
$userID = intval($_POST['userID'];)
- Mysql(当不处于严格模式时)允许您将数字作为字符串发送。字符串必须根据以下两条简单规则进行格式化,如Rob的回答所示:
- 必须用单引号分隔
- 这些引号必须转义
- 你可以使用事先准备好的语句。要使用这样一种流行的运行sql查询的方式,您必须使用
prepare()
+execute()
方法而不是query()
,并使用bind_param()
绑定变量
关于标题问题的说明。
将名称空间设置为utf-8是否有任何形式的sql注入保护?
是的,在某种程度上
在某些极为罕见的情况下,确实如此。
对于某些罕见的编码,real_escape_string
族函数可能无法正确进行分隔符转义。为了避免这种情况,必须使用set_charset
家族函数设置客户端编码,在您的情况下为mysqli->set_charset()
。