我正在使用 php 开发我的个人网站。一切都很好,但我刚刚阅读了php.netmysql_real_escape_string
中的手册,发现了两件事:
- 在向 MySQL 发送查询之前,必须始终(除了少数例外)使用此函数来确保数据安全。
- mysql_real_escape_string()不会转义 % 和 _。如果与 LIKE、GRANT 或 REVOKE 结合使用,这些是 MySQL 中的通配符。
我有两个问题:
1-这些例外是什么?
2-如何转义这些字符?
在向 MySQL 发送查询之前,必须始终(除了少数例外)使用此函数来确保数据安全。
令我非常失望的是,手册页说完全是垃圾,他们拒绝纠正。
因此,恰恰相反,只有少数情况下您需要此功能。所以只能说一个:当您将字符串添加到 SQL 查询中时。
mysql_real_escape_string() 不会转义 % 和 _。如果与 LIKE、GRANT 或 REVOKE 结合使用,这些是 MySQL 中的通配符。
没关系。只要您故意使用 LIKE 运算符,这些字符就不会造成任何伤害。
但是如果你想转义字符串去 LIKE 语句,你可以使用这个代码
$like = addCslashes($like,'\%_');
(注意斜线 - 它也需要作为手册说明它进行转义。还请注意C
函数名称中的字母)。
在此过程之后,您可以以$like
任何方式使用生成的变量来构建查询 - 引用并转义它们或在准备好的语句中使用。
我不确定手册在谈论使数据安全时所指的例外情况。您可以说例外情况是已知数据是安全的。例如,下面是一些我想到的案例:
例如,如果您有,$id = intval($_GET['id'])
那么您不需要$id
在将其注入查询之前转义。
然而!转义所有输入永远不会对您造成伤害,并且这样做可以消除您在代码中引入漏洞的机会(例如,如果您忘记转义,如果需求发生变化,或其他任何事情)。所以我建议养成逃避一切并忘记“例外”的习惯。
至于作为输入一部分的%
和_
字符,这些不需要转义,除非您将此输入提供给识别它们的命令。例如,如果您有这样的查询:
$term = $_GET['term'];
$sql = sprintf("SELECT FROM table WHERE column LIKE '%%s%'",
mysql_real_escape_string($term));
在这种情况下,如果用户键入 a%
作为其中的一部分,$term
则可以合理地假设他们想要实际搜索文字%
。因此,在这种情况下,您应该%
通过将其替换为\%
(\
是默认转义字符) 来进行转义。str_replace
或者strtr
是两个不错的选择。