去除所有不需要的字符

时间:2015-03-31 17:30:19

标签: php mysql error-handling strip-tags

我使用以下代码删除不需要的字符,但它并没有删除所有内容并抛出MySQL错误:

    $commentmessage = strip_tags($commentmessage);
    $commentmessage = htmlentities($commentmessage, ENT_QUOTES);

我会使用哪些代码删除任何可能导致MySQL错误的代码?

我收到的信息是:

错误消息:SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法中出错;检查与你的MySQL服务器版本相对应的手册,以便在“omg那个”附近使用正确的语法。我们真正喜欢的一个徽标是1049859,其中f'在第2行**

1 个答案:

答案 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));
}