我使用了一些借用的代码,并担心其易受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,我应该像这样设置变量:
$userID = $_POST['userID'];
$userID = $mysqli->real_escape_string($userID);那么,我可以像在我的查询中一样使用它吗?
谢谢
发布于 2012-03-26 15:54:39
问题1:$mysqli->query("SET NAMES‘sql’“);有任何形式的utf8注入辅助功能吗?
用这种方式表达--绝对不是。
但请看底部的注释。
问题2:我应该使用某种形式的real_escape_string吗?
所以,让我们重新表述你的问题:
问题2a:我应该对SQL注入采取一些预防措施吗?
是。
你有三个选择。
由于$userID = intval($_POST['userID'];)
关于标题问题的注释。
正在将名称空间设置为utf-8任何形式的sql注入保护?
是的,在某种程度上,。
在某些极其罕见的情况下,确实如此。
对于某些罕见的编码,real_escape_string系列函数可能无法正确地对分隔符进行转义。为了避免这种情况,必须使用set_charset家族函数(在本例中为mysqli->set_charset() )设置客户端编码。
发布于 2012-03-26 03:24:00
转义$userId是不够的。
您还必须在查询中引用该值,或者过滤$userId (只允许数字)。
if($result = $mysqli->query("SELECT * FROM towns WHERE userID='".$userID."'")) {
// ^ ^^^^https://stackoverflow.com/questions/9863224
复制相似问题