我有一个输入字段(文本区域),需要允许撇号。
if (!empty($_POST["adv"]) && !preg_match("#^[a-zA-Z0-9 \.,\?_/'!£\$%&*()+=\r\n-]+$#",$_POST["adv"])){
$addErr = "Please use letters, numbers, and common punctuation only"; $valid = false;
}
if (!empty($_POST["adv"]) && mb_strlen($_POST["adv"], 'UTF-8') > 500){
$addErr = "Ad must not exceed 500 characters"; $valid = false;
}
$add = htmlspecialchars($_POST['adv']);如果文本输入中包含一个撇号,代码就会中断,不会更新数据库。如果文本不包含撇号,则preg match将进行准确的验证,并更新数据库。
我试过逃避,双重逃避,移动撇号,但没有成功。有什么想法吗?
发布于 2014-06-13 21:05:15
我想您的问题不在于regex,而在于SQL语句本身:您应该正确地转义DB查询,或者使用像字符串这样的函数,或者更好地使用准备好的陈述。
撇号用于引用SQL语句中的字符串;如果字符串中有一个未转义的撇号,则整个查询将中断。请参阅关于如何正确转义SQL语句的PHP手册 --这对您的站点也是一个严重的安全风险。
您已经尝试过用htmlspecialchars转义字符串,如果要将字符串输出到HTML中,这对防止XSS很好,但它不是DB上下文的正确工具。始终使用正确的工具来转义数据,以便插入它的上下文。
发布于 2014-06-13 21:14:20
如果使用的是PDO,请在使用quote()之前使用INSERT方法。
$db->引号($mystring).
或准备好的陈述.
为什么插入中断?
在我看来,您是通过粘贴各种字符串和代码来构建INSERT查询的。如果这些位元中有一个不是转义的,那么整个查询就有了新的含义,不能再被MySQL解析。
Tip
对于破坏代码的查询,打印查询,这样您就可以看到出了什么问题。您还可能希望将其转储到可以突出显示MySQL语法的工具中,如SQLYog、HeidiSQL和其他。
您的Regex
除此之外,你的牢笼可以被清理干净。这相当于您正在使用的正则表达式,但在眼睛上更容易:
$regex = "~^[\w .,?'!£$%&*()+=\r\n-]+$~";\w将匹配所有字母、数字和下划线字符。https://stackoverflow.com/questions/24213711
复制相似问题