我使用以下代码删除不需要的字符,但它并没有删除所有内容并抛出MySQL错误:
$commentmessage = strip_tags($commentmessage);
$commentmessage = htmlentities($commentmessage, ENT_QUOTES);
我会使用哪些代码删除任何可能导致MySQL错误的代码?
我收到的信息是:
错误消息:SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法中出错;检查与你的MySQL服务器版本相对应的手册,以便在“omg那个”附近使用正确的语法。我们真正喜欢的一个徽标是1049859,其中f'在第2行**
答案 0 :(得分:2)
显然你正在构建你的查询:
$query = "INSERT INTO foo VALUES ('$bar')";
因为$bar
的文字包含单引号而中断。 '
不。 *点击报纸* 糟糕的开发者。
我可以只是抛出一个字符串转义函数,或者我可以告诉你这样做:
$bar = "I am a problematic string!'; DROP TABLE USERS -- "
$query = "INSERT INTO foo VALUES (?)";
$stmt = $dbh->prepare($query);
$stmt->execute(array($bar));
或者:
$bar = "I am a problematic string!'; DROP TABLE USERS -- "
$query = "INSERT INTO foo VALUES (:bar)";
$stmt = $dbh->prepare($query);
$stmt->execute(array('bar'=>$bar));
准备这样的查询时,PHP / PDO / MySQL会聚在一起并预先确定占位符的类型。所以你的字符串被视为字符串而不需要转义字符。这既可以防止恶意单引号破坏您的查询,也可以帮助保护您免受SQL注入攻击。
您还可以重复使用预准备语句来提高性能:[相对于未准备好的语句,因为SQL只需要解析一次,而不是每次查询一次]
$query = "INSERT INTO foo VALUES (?)";
$stmt = $dbh->prepare($query);
foreach( $bars as $bar ) {
$stmt->execute(array($bar));
}