首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将名称空间设置为utf-8是任何形式的sql注入保护吗?

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

Stack Overflow用户
提问于 2012-03-26 03:20:47
回答 2查看 812关注 0票数 1

我使用了一些借用的代码,并担心其易受SQL注入的攻击……

代码语言:javascript
复制
// 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,我应该像这样设置变量:

代码语言:javascript
复制
$userID = $_POST['userID'];
$userID = $mysqli->real_escape_string($userID);

那么,我可以像在我的查询中一样使用它吗?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-26 15:54:39

问题1:$mysqli->query("SET NAMES‘sql’“);有任何形式的utf8注入辅助功能吗?

用这种方式表达--绝对不是。

但请看底部的注释。

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

所以,让我们重新表述你的问题:

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

是。

你有三个选择。

由于$userID = intval($_POST['userID'];)

  • Mysql是一个数字,您可以显式地将其转换为该类型,
  1. (当不在严格模式下时)允许您将$userID作为字符串发送。字符串必须根据这两个简单的规则格式化,如Rob的答案所示:
    • it be be delimited by single
    • quotes has be be escaped.

  1. 您可以使用预准备语句。

关于标题问题的注释。

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

是的,在某种程度上,

在某些极其罕见的情况下,确实如此。

对于某些罕见的编码,real_escape_string系列函数可能无法正确地对分隔符进行转义。为了避免这种情况,必须使用set_charset家族函数(在本例中为mysqli->set_charset() )设置客户端编码。

票数 0
EN

Stack Overflow用户

发布于 2012-03-26 03:24:00

转义$userId是不够的。

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

代码语言:javascript
复制
if($result = $mysqli->query("SELECT * FROM towns WHERE userID='".$userID."'")) {
//                                                            ^         ^^^^
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9863224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档