我正在使用php开发我的个人网站。一切都还可以,但我只是阅读php.net中的mysql_real_escape_string
手册,发现了两件事:
- 在向MySQL发送查询之前,必须始终使用此函数(少数例外)使数据安全。
- mysql_real_escape_string()不会转义%和_ 。如果与LIKE,GRANT或REVOKE结合使用,则这些是MySQL中的通配符。
醇>
我有两个问题:
1 - 这些例外是什么?
2-如何逃避这些角色?
答案 0 :(得分:5)
在向MySQL发送查询之前,必须始终使用此函数(少数例外)使数据安全。
令我非常失望的是,手册页上写着完整的垃圾,they refuse to make it correct 因此,相反,只有少数情况需要此功能。所以说只有一个:当你将一个字符串添加到SQL查询中时。
mysql_real_escape_string()不会转义%和_。如果与LIKE,GRANT或REVOKE结合使用,这些是MySQL中的通配符。
没关系太多。只要您故意使用LIKE运算符,这些字符就不会造成任何伤害。
但是如果要转义转到LIKE语句的字符串,可以使用此代码
$like = addCslashes($like,'\%_');
(注意斜杠 - 它也需要作为手动说明进行转义。还要注意函数名称中的C
字母。)
在此过程之后,您可以使用生成的$like
变量以任何方式构建查询 - 引用和转义它们或在预准备语句中使用。
答案 1 :(得分:3)
在讨论使数据安全时,我不确定手册指的是什么例外。您可以说异常是指已知数据是安全的。例如,以下是一些可以想到的案例:
例如,如果您有$id = intval($_GET['id'])
,则在将其注入查询之前无需转义$id
。
然而! 所有输入永远不会让您受到伤害,这样做可以消除您在代码中引入漏洞的可能性(例如,如果您忘记逃脱,如果要求改变,或任何真正的)。因此,我建议养成逃避一切并忘记“例外”的习惯。
作为输入的一部分,%
和_
字符不需要转义,除非您要将此输入提供给识别它们的命令。例如,如果您有这样的查询:
$term = $_GET['term'];
$sql = sprintf("SELECT FROM table WHERE column LIKE '%%s%'",
mysql_real_escape_string($term));
在这种情况下,如果用户在%
中键入$term
,则可以合理地假设他们想要实际搜索文字%
。因此,在这种情况下,您应该通过将%
替换为\%
来逃避\
(str_replace
是默认的转义字符)。 strtr
或{{1}}是两个不错的选择。
答案 2 :(得分:1)
您可以write your own function
;)有关详细信息,请参阅this thread。
否则,您可以使用PDO library或任何其他此类库。