【问题标题】:How to unquote a string in PHP如何在 PHP 中取消引用字符串
【发布时间】:2014-03-24 20:03:29
【问题描述】:

如果我引用一个变量来防止 SQL 注入:

$safe_email = $db->quote($_POST['email']);

如果$_POST['email'] = abc@example.com

然后我会执行以下操作:

  echo $safe_email;

我明白了:

 "abc@example.com" 

PHP Documentation 表示stripslashes 函数“取消引用带引号的字符串”。

但是,当我在引用的字符串上使用它时:

echo stripslashes($safe_email);

我仍然得到用引号打印出来的字符串

这里似乎有什么问题?它仍然用引号打印出来

【问题讨论】:

  • 参数化查询:$stmt = $dbh->prepare("INSERT INTO emails (email) VALUES (?)"); $stmt->execute(array($_POST['email'])); Done.
  • 斜杠和引号不是一回事,为什么一个叫做“strip slashes”的函数会去掉引号?
  • 这似乎是一个不幸的选择。这肯定不是你的 quote 函数的反面。
  • 如果使用 PDO 之类的东西来传递绑定参数,为什么还要担心呢?如果您愿意,您可以在装订前进行消毒。
  • 不,这就是问题所在

标签: php string quotes


【解决方案1】:

quote 函数不一定是直接逆函数(假设这里是 PDO::quote)。它用引号将值括起来并转义字符串中的特殊字符以根据数据库的底层驱动程序形成有效的SQL字符串文字。这可能会因数据库和连接的具体情况而有所不同。您也永远不需要取消引用字符串,因为除了 SQL 查询之外,您不应该在任何其他地方使用带引号的字符串:

sprintf('SELECT ... WHERE foo = %s', $pdo->quote($value))

没有任何理由引用该值,然后再次取消引用它以在除 SQL 查询之外的任何其他地方使用它。只需使用原始的 $value 而不是引用的值。当然,您应该使用带有绑定参数的准备好的语句而不是手动引用,因此您几乎没有任何理由接触此函数。

话虽如此,这应该涵盖大多数情况,但远不能保证总是产生正确的结果:

$unquoted = stripslashes(substr($quoted, 1, -1));

【讨论】:

    【解决方案2】:

    这样的事情有什么问题?

    filter_var($_POST['email'], FILTER_SANITIZE_EMAIL)

    你的问题让我很担心。请阅读 PDO,绑定你的参数,晚上更容易休息。您似乎要走的路是安全风险之一,可能不会有好的结局。

    旁注:我喜欢清理客户端和服务器端,并适当地绑定参数。也许我是偏执狂,但一盎司的预防胜过一磅的治疗 IMO。

    好吧,既然你似乎对正确的方式不感兴趣

    $email = str_replace('"','',$email);

    【讨论】:

      【解决方案3】:

      有时您只想从字符串的开头和结尾删除引号,并在 PHP 中恢复用“\”转义的字符。这就是“取消引用字符串”的直观含义。

      例如,表达式var_export($value,true) 总是将其结果单引号并转义某些字符。

      这个表达式将很好地“取消引用”这样的字符串:stripslashes(substr(substr($str,1),0,-1))

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-22
        • 2016-09-28
        • 1970-01-01
        • 2016-06-05
        • 2020-07-04
        相关资源
        最近更新 更多