首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >此查询是否易受sql注入的攻击?

问此查询是否易受sql注入的攻击?
EN

Stack Overflow用户
提问于 2010-03-17 00:24:11
回答 8查看 1K关注 0票数 5
代码语言:javascript
复制
$myq = sprintf("select user from table where user='%s'", $_POST["user"]);

我想知道是否可以使用SQL注入来利用上面的查询。对于这个特定的查询,有没有什么高级的SQL注入技术可以破坏sprintf?

EN

回答 8

Stack Overflow用户

发布于 2010-03-17 00:25:22

我不认为它需要特别先进...尝试输入

代码语言:javascript
复制
' OR 1 = 1 OR user='

换句话说,你将得到SQL:

代码语言:javascript
复制
select user from table where user='' OR 1 = 1 OR user=''

这看起来像是你真的想要执行的查询吗?(现在考虑它删除表的可能性,或者类似的东西。)

底线是您应该使用参数化查询。

票数 25
EN

Stack Overflow用户

发布于 2010-03-17 00:27:06

使用 的不会比使用简单的字符串连接提供更多的保护。与使用简单的sprintf字符串连接相比,PHP的优点只是更具可读性。但是在使用%s格式时,sprintf只做简单的字符串连接:

代码语言:javascript
复制
$str = implode('', range("\x00", "\xFF"));        // string of characters from 0x00 – 0xFF
var_dump(sprintf("'%s'", $str) === "'".$str."'"); // true

您需要使用转义要插入数据的上下文特殊字符的函数(在本例中是一个string declaration in MySQL,假设您使用的是MySQL),就像**mysql_real_escape_string**一样:

代码语言:javascript
复制
$myq = sprintf("select user from table where user='%s'", mysql_real_escape_string($_POST["user"]));
票数 8
EN

Stack Overflow用户

发布于 2010-03-17 00:31:37

是的,我会说你有一个潜在的问题:)

You need to escape:\x00, \n, \r, \, ', "和\x1a。sprintf() does not do that,sprintf()不会修改字符串,它只是根据指定的格式,将您提供的变量参数扩展到您提供的缓冲区中。

如果字符串正在转换,很可能是由于magic quotes (正如Rob在注释中指出的),而不是sprintf()。如果是这种情况,我强烈建议禁用它们。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2456123

复制
相关文章

相似问题

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