4

一直让我感到困惑的一件事是输入转义以及您是否受到保护免受 SQL 注入等攻击。

假设我有一个使用 HTTP POST 将数据发送到 PHP 文件的表单。我在输入字段中输入以下内容并提交表单:

"Hello", said Jimmy O'Toole.

如果您在接收此 POST 数据的 PHP 页面上打印/回显输入,则会显示为:

\"Hello\", said Jimmy O\'Toole.

这是令人困惑的地方。如果我将此输入字符串放入 (My)SQL 并执行它,它会很好地进入数据库(因为引号被转义),但这会停止 SQL 注入吗?

如果我接受输入字符串并在其上调用类似mysqli real_escape_string的东西,结果如下:

\\"Hello\\", said Jimmy O\\'Toole.

所以当它通过 (My)SQL 进入数据库时​​,它最终会变成:

\"Hello\", said Jimmy O\'Toole.

这显然有太多的斜线。

因此,如果输入通过 HTTP POST 转义,您是否必须再次转义以使其对(My)SQL 安全?或者我只是在这里没有看到明显的东西?

提前感谢您的帮助。

4

5 回答 5

11

啊,魔术语录的奇迹。它正在从您的 POST 表单中进行那些不必要的转义。你应该禁用(或中和)它们,你的许多头痛就会消失。

这是该主题的示例性文章:http ://www.sitepoint.com/blogs/2005/03/02/magic-quotes-headaches/

回顾:禁用魔术引号,使用real_escape_string().

于 2009-01-19T09:38:55.973 回答
3

我不会依赖转义,而是使用参数化的 SQL 查询,让 mysql 驱动程序做它需要的任何转义。

于 2009-01-19T09:42:32.127 回答
1

发生的事情是您在 PHP 配置中打开了Magic Quotes 。

强烈建议您关闭魔术引号 - 事实上,它们已从 PHP 6 中完全删除。

禁用魔术引号后,您将看到与您在表单中输入时完全相同的 POSTed 文本:"Hello", said Jimmy O'Toole. 现在很明显,您需要使用 mysql 转义函数甚至更好的准备好的语句(使用准备好的语句,您可以'不要忘记转义字符串,因为它已为您完成)。

于 2009-01-19T09:44:37.257 回答
1

看起来您的 PHP 服务器启用了魔术引号功能 - 这就是您的第一组斜杠的来源。从理论上讲,应该没有必要调用转义函数——但是当应用程序在禁用魔术引号的服务器上运行时,你突然对 SQL 注入敞开了大门,而你却认为你不是。

正如 chakrit 所写,转义并不是保护自己的最佳方式 - 用户参数化查询更安全。

于 2009-01-19T09:45:13.697 回答
0

明显是黑客的关键词。

我认为正常转义就足够了,但仅仅保护引号可能还不够。

请参阅此SQL Injection cheatsheet,这是一个很好的测试列表,您可以运行它来查看过多的斜杠是否是一件好事。

并且不要忘记转义其他类型的值,即数字字段和日期时间字段都可以像字符串一样容易地注入。

于 2009-01-19T09:36:27.163 回答