如果我引用一个变量来防止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);
我仍然用引号
打印出字符串这里似乎有什么问题?它仍然在引号中打印
答案 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))
。