如何在PHP中取消引用字符串

时间:2014-03-24 20:03:30

标签: php string quotes

如果我引用一个变量来防止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);

我仍然用引号

打印出字符串

这里似乎有什么问题?它仍然在引号中打印

3 个答案:

答案 0 :(得分:2)

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

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

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

话虽如此,涵盖大多数情况,但远不能保证始终产生正确的结果:

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

答案 1 :(得分:0)

这样的事情出了什么问题?

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

你的问题让我担心。请阅读PDO,绑定参数,晚上休息更容易。你似乎走下去的道路是一个安全隐患,并且可能不会很好。

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

好吧,因为您似乎对正确的方式不感兴趣

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

答案 2 :(得分:0)

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

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

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