理解PHP中的输入转义

Phi*_*ton 4 php mysql sql-injection escaping magic-quotes

总是让我困惑的一件事是输入转义以及你是否受到保护免受SQL注入等攻击.

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

"Hello", said Jimmy O'Toole.
Run Code Online (Sandbox Code Playgroud)

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

\"Hello\", said Jimmy O\'Toole.
Run Code Online (Sandbox Code Playgroud)

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

如果我接受输入字符串并调用类似的东西mysqli real_escape_string,它就像这样:

\\"Hello\\", said Jimmy O\\'Toole.
Run Code Online (Sandbox Code Playgroud)

因此,当它通过(My)SQL进入数据库时​​,最终会:

\"Hello\", said Jimmy O\'Toole.
Run Code Online (Sandbox Code Playgroud)

这显然有太多的斜线.

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

在此先感谢您的帮助.

Hen*_*aul 11

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

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

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