删除所有不需要的字符

Strip Out All Unwanted Characters

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

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

我将使用什么代码去除任何可能导致 MySQL 错误的内容?

我收到的消息是:

错误消息:SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有误;查看与您的 MySQL 服务器版本相对应的手册,了解在“omg that's the one”附近使用的正确语法。我们真正喜欢的徽标之一是 1049859,其中第 2 行的 f'**

显然您正在像这样构建查询:

$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));
}