2010-01-14 64 views
1

由于没有函数来检查一个字符串是否在输入到数据库之前被转义,我怎么能用正则表达式来做到这一点?功能来检查一个字符串是否为mysql的反斜杠

$string = 'some" string'; 
if(!preg_match('//',$string)) 
{ 
    $string = mysqli_real_escape_string($string); 
} 

PHP手册:

编码NUL mysqli_real_escape_string反斜线字符(ASCII 0),\ N,\ r \,”,”,与控制-Z

+1

在某些字符之前检查是否有反斜杠并不难,但不可能检查大块文本中的反斜杠是否适用于任何任意应用程序。 – 2010-01-14 16:35:16

+0

请结合您的代码,让您唯一称呼mysqli_real_escape_string的地方就在您创建sql语句之前。那么你不需要知道它是否已经完成。 – jmucchiello 2010-01-14 16:39:36

+0

这个以前的答案是正确的。 http://stackoverflow.com/questions/2065391/php-what-happens-when-a-string-is-double-times-mysqlirealescapestring/2065428#2065428 – 2010-01-14 16:39:11

回答

3

不要试图做到这一点。

如果您试图想出一种方法来确定字符串是否被转义,那么有人可以进入并制作一个会欺骗您的检测方法的字符串。例如,如果您使用“\”作为测试来确保斜杠被转义,我可以给您一个像"'; DROP DATABASE dbname(); --\\"这样的字符串,它可以通过您的检查,但仍然是可怕的错误。

如果无论出于何种原因无法使用存储过程和/或正确的参数处理,确保字符串干净的唯一方法是清理每个不可信源的每个字符串。

3

有。没有函数来检查一个字符串是否被转义,因为没有逻辑方法来判断一个字符串是否被转义了。

It\'s nice 

逃脱了吗?你怎么知道的?它是一个逃脱的撇号,还是一个非转义的反斜杠和撇号?

转义是一个进程,而不是一个字符串的属性。您必须始终知道您是否已针对特定上下文转义了字符串。做到这一点的最好方法是让字符串保持原始和未转义状态,直到它们离开另一个上下文为止。因此,除非实际连接成一个SQL字符串,否则不要调用mysql_real_escape_string。不要致电htmlspecialchars,直到您回应HTML输出为止。