php - 删除所有不需要的字符

标签 php mysql error-handling strip-tags

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

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

我应该使用什么代码来删除任何可能导致 MySQL 错误的内容?

我收到的消息是:

错误消息:SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在“天哪,就是这个”附近使用的正确语法。我们真正喜欢的 Logo 之一是 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 注入(inject)攻击。

您还可以重复使用准备好的语句来提高性能:[相对于未准备的语句,因为 SQL 只需要解析一次,而不是每个查询一次]

$query = "INSERT INTO foo VALUES (?)";
$stmt = $dbh->prepare($query);
foreach( $bars as $bar ) {
  $stmt->execute(array($bar));
}

关于php - 删除所有不需要的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29374813/

相关文章:

java - org.hibernate.AnnotationException : Unknown Id. 生成器:GenreIdGenerator

mysql - 是mysql还是mysqld?

php - Yii2自定义errorHandler组件

javascript - 可以将 Wordpress 插件转换为在非 WP 网站上使用吗?

PHP 密码验证总是返回 false

php mysql避免单个插入查询中的多次/重复插入

mysql - 更新 MySQL 表不适用于 jquery

java - 需要帮助查找错误

c# - 在 .Net 中是否有可能在类中的任何方法传递给调用堆栈之前捕获所有未处理的异常?

php - LiveSearch PHP、JavaScript 多领域使用