首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一种在一个函数中停止所有SQL注入的方法?

一种在一个函数中停止所有SQL注入的方法?
EN

Stack Overflow用户
提问于 2011-11-02 23:37:20
回答 2查看 677关注 0票数 0

给定1000个字符串格式的mysql查询,有没有办法在运行查询之前分析并删除这些字符串中的任何SQL注入?

我的一个想法是检查字符串中sql注入中使用的常见词/短语,这些常见词/短语在运行查询的应用程序中从未使用过。如果找到,请不要运行查询并提醒管理员。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-02 23:43:15

mySQL鼓励使用mysql_real_escape_string来清理查询。

避开unescaped_string中的特殊字符,并考虑到连接的当前字符集,以便可以安全地将其放在mysql_query()中。如果要插入二进制数据,则必须使用此函数。

mysql_real_escape_string()调用MySQL的库函数mysql_real_escape_string,该函数将反斜杠添加到以下字符前面:\x00、\n、\r、\、‘、“和\x1a。

在向MySQL发送查询之前,必须始终(少数例外情况下)使用此函数来确保数据安全。

PS:这是对addslashes/mysql_real_escape_string争论的一个很好的回答:http://www.sitepoint.com/forums/showthread.php?337881-addslashes()-vs-mysql_real_escape_string()...the-final-debate&s=7cabb6e5fd909f2c787d47cd01471dfb&p=2439889&viewfull=1#post2439889

票数 2
EN

Stack Overflow用户

发布于 2011-11-03 00:34:35

我的一个想法是检查字符串中是否有在

注入中使用的常用词/短语,而这些常见词/短语在运行查询的应用程序中从未使用过。如果找到,请不要运行查询并提醒管理员。

非常糟糕的主意。

解决方案是使用PDO:http://php.net/manual/en/ref.pdo-mysql.php

并使用参数将所有 $vars传递给

如果必须使用动态SQL,请确保根据白名单检查注入的内容。

关于如何安全地做到这一点,请参阅这个问题:How to prevent SQL injection with dynamic tablenames?

现在你被保存了。

如果不能使用PDO,可以使用mysql_real_escape_string()

下面是一个例子:

代码语言:javascript
复制
$var = mysql_real_escape_string($_POST['unsafe_value']);
$query = "SELECT * FROM user WHERE username = '$var' ";
// The quotes are vital, without them         ^    ^  
//you will may get syntax errors and mysql_real.... will not protect you!

您只能将其用于参数,而不能用于表、列、数据库名称或SQL构造,还要记住始终使用引号引用您的'$vars'

对于值以外的任何内容,都必须使用白名单。

请注意,addslashes不起作用,不应该使用!

对于整数值,您可以使用intval(),但我建议您不要使用它,它不会节省时间,使您的代码更难阅读,而且它违反了总是使用mysql_real_escape_string()的规则。

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

https://stackoverflow.com/questions/7983070

复制
相关文章

相似问题

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