【问题标题】:Function to check if a string is backslashed for mysql用于检查字符串是否为 mysql 反斜杠的函数
【发布时间】:2010-01-14 16:28:08
【问题描述】:

由于在将字符串输入数据库之前没有检查字符串是否被转义的功能,我该如何使用正则表达式来做到这一点?

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

php手册:

mysqli_real_escape_string 反斜杠编码为 NUL (ASCII 0)、\n、\r、\、'、" 和 Control-Z 的字符。

【问题讨论】:

  • 不难检查某些字符前是否有反斜杠,但不可能检查一段文本中的反斜杠是否适用于任意应用程序。
  • 这个先前的答案是正确的。 stackoverflow.com/questions/2065391/…
  • 拜托,拜托,拜托,只是构造你的代码,这样你调用 mysqli_real_escape_string 的唯一地方就在你创建你的 sql 语句之前。那么你就不需要知道它是否已经完成了。

标签: php mysql regex escaping


【解决方案1】:

不要尝试这样做。

如果您尝试想出一种方法来确定字符串是否被转义,那么有人可以进来并制作一个可以欺骗您的检测方法的字符串。

例如,如果您使用“\”作为测试以确保斜杠被转义,我可以给您一个类似"'; DROP DATABASE dbname(); --\\" 的字符串,它通过了您的检查,但仍然非常错误。

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

【讨论】:

    【解决方案2】:

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

    It\'s nice
    

    这是逃跑了吗?你怎么知道的?它是转义的撇号,还是未转义的反斜杠和撇号?

    转义是一个过程,而不是字符串的属性。您必须始终知道您是否已经为特定上下文转义了字符串。最好的方法是让你的字符串保持原始和未转义,直到它们离开另一个上下文。所以在你真正连接成一个 SQL 字符串之前,不要调用mysql_real_escape_string。在您回显到 HTML 输出之前,不要调用 htmlspecialchars

    【讨论】:

      【解决方案3】:

      你没有。 使用准备好的语句和绑定变量。参考mysqli_preparemysqli_stmt_bind_param

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-11
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 2017-06-20
        • 2018-02-27
        • 1970-01-01
        • 2011-02-23
        相关资源
        最近更新 更多