首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有绑定参数的PHP MySQLi预置查询安全吗?

问带有绑定参数的PHP MySQLi预置查询安全吗?
EN

Stack Overflow用户
提问于 2009-10-13 17:02:48
回答 3查看 2.1K关注 0票数 5

从历史上看,我一直在用

代码语言:javascript
复制
mysql_real_escape_string()

对于从用户派生的最终接触数据库的所有输入。

现在,我已经完全转换为MySQLi,并且我正在使用带绑定参数的预准备查询,我是否有效地消除了SQL注入攻击的可能性?

我说我不再需要

代码语言:javascript
复制
mysql_real_escape_string()?

这是我的理解,也是我一个项目的基础:http://sourceforge.net/projects/mysqldoneright/files/Base/MysqlDoneRight-0.23.tar.gz/download

这不是我想犯的错误,因为现在我已经发布了它,它可能也会影响其他人。

用户提供的所有输入现在都将以bind_parms格式结束。

准备阶段提供的查询是静态的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-10-13 18:02:04

事情并不是那么简单。您可以使用绑定参数,而不是仅将应用程序变量插入到SQL表达式中,以代替文字值:

代码语言:javascript
复制
$sql = "SELECT * FROM MyTable WHERE id = ".$_GET["id"]; // not safe

$sql = "SELECT * FROM MyTable WHERE id = ?"; // safe

但是,如果除了文字值之外,还需要使查询的一部分成为动态的,该怎么办呢?

代码语言:javascript
复制
$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查询的方法:

跟踪插入到

  • Filter查询中的任何变量数据。使用input filters删除非法字符。例如,如果需要整数,请确保输入被约束为integer.
  • Escape输出。此上下文中的输出可以是您发送到数据库服务器的SQL查询。您知道可以对值使用SQL查询参数,但是列名呢?你需要一个标识符的转义/引号函数,就像旧的用于字符串values.
  • Code审查的mysql_real_escape_string()一样。找人来做另一双眼睛,检查你的SQL代码,帮助你找出你遗漏使用上述两种技术的地方。
票数 6
EN

Stack Overflow用户

发布于 2009-10-14 01:04:03

是。使用准备好的查询将对参数进行转义。

票数 13
EN

Stack Overflow用户

发布于 2009-10-13 17:04:45

当您将参数绑定到预准备语句时,它会自动对数据进行转义,因此您不应该在发送数据之前对其进行转义。双重转义通常是一件坏事。至少,它会在以后产生带有额外转义字符的丑陋结果。

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

https://stackoverflow.com/questions/1561586

复制
相关文章

相似问题

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