从历史上看,我一直在用
mysql_real_escape_string()对于从用户派生的最终接触数据库的所有输入。
现在,我已经完全转换为MySQLi,并且我正在使用带绑定参数的预准备查询,我是否有效地消除了SQL注入攻击的可能性?
我说我不再需要
mysql_real_escape_string()?这是我的理解,也是我一个项目的基础:http://sourceforge.net/projects/mysqldoneright/files/Base/MysqlDoneRight-0.23.tar.gz/download
这不是我想犯的错误,因为现在我已经发布了它,它可能也会影响其他人。
用户提供的所有输入现在都将以bind_parms格式结束。
准备阶段提供的查询是静态的。
发布于 2009-10-13 18:02:04
事情并不是那么简单。您可以使用绑定参数,而不是仅将应用程序变量插入到SQL表达式中,以代替文字值:
$sql = "SELECT * FROM MyTable WHERE id = ".$_GET["id"]; // not safe
$sql = "SELECT * FROM MyTable WHERE id = ?"; // safe但是,如果除了文字值之外,还需要使查询的一部分成为动态的,该怎么办呢?
$sql = "SELECT * FROM MyTable ORDER BY ".$_GET["sortcolumn"]; // not safe
$sql = "SELECT * FROM MyTable ORDER BY ?"; // doesn't work!该参数将始终被解释为值,而不是列标识符。您可以使用ORDER BY 'score'运行查询,这与ORDER BY score不同,使用参数将被解释为前者--一个常量字符串'score',而不是名为score的列中的值。
因此,在很多情况下,您必须使用动态SQL并将应用程序变量插入到查询中才能获得您想要的结果。在这种情况下,查询参数对您没有帮助。您仍然需要保持警惕,编写防御性的代码,以防止SQL注入缺陷。
没有任何框架或数据访问库可以为您完成这项工作。您始终可以构造包含SQL注入缺陷的SQL查询字符串,并且在数据访问库看到SQL查询之前执行此操作。那么,它如何知道什么是故意的,什么是缺陷呢?
以下是实现安全SQL查询的方法:
跟踪插入到
mysql_real_escape_string()一样。找人来做另一双眼睛,检查你的SQL代码,帮助你找出你遗漏使用上述两种技术的地方。发布于 2009-10-14 01:04:03
是。使用准备好的查询将对参数进行转义。
发布于 2009-10-13 17:04:45
当您将参数绑定到预准备语句时,它会自动对数据进行转义,因此您不应该在发送数据之前对其进行转义。双重转义通常是一件坏事。至少,它会在以后产生带有额外转义字符的丑陋结果。
https://stackoverflow.com/questions/1561586
复制相似问题