单引号是 SQL 语句的分隔符,与 PHP 无关。它们告诉 MySQL 该字段的值从哪里开始,在哪里停止。
考虑一下:
SELECT * FROM mytable WHERE field=new order by name desc
查询应该限制 where field
= "new order by name desc" 还是应该限制 where field
= "new" 然后按 "name" 字段以降序排列结果?
引号明确表示:
SELECT * FROM mytable WHERE field='new order by name desc'
此外:这就是您应该在 MySQL 中转义您的值的原因。如果用户' OR 1 = 1; --
在您的用户名字段中键入,并且您的身份验证查询是:
SELECT * FROM users WHERE username = '$_POST['username']' AND password = '$_POST['password']'
你最终得到:
SELECT * FROM users WHERE username = '' OR 1 = 1 -- ' AND password = 'asfd'
这是有效的 SQL 并将选择表中的所有用户(因为输入$_POST['username']
已将查询的其余部分注释掉。但是,如果您正确转义值,您最终会得到:
SELECT * FROM users WHERE username = '\' OR 1 = 1 -- ' AND password = 'asfd'
这意味着 MySQL 将查找具有username
=\' OR 1 = 1 --
和匹配密码的用户。您可以使用简单的 . 进行转义mysqli_real_escape_string
,但始终建议使用 PDO 和参数化查询。
我强烈建议您在使用任何 Web 应用程序中的数据库之前阅读一些关于 PDO、参数和 SQL 注入的教程。以后你会感谢自己的。