关于mysql_real_escape_string的问题

时间:2012-04-21 14:28:52

标签: php mysql escaping wildcard

我正在使用php开发我的个人网站。一切都还可以,但我只是阅读php.net中的mysql_real_escape_string手册,发现了两件事:

  
      
  1. 在向MySQL发送查询之前,必须始终使用此函数(少数例外)使数据安全。
  2.   
  3. mysql_real_escape_string()不会转义%和_ 。如果与LIKE,GRANT或REVOKE结合使用,则这些是MySQL中的通配符。
  4.   

我有两个问题:
1 - 这些例外是什么?
2-如何逃避这些角色?

3 个答案:

答案 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或任何其他此类库。