清理输出数据

Sanitizing Output data

我在我的代码中使用 PDO 和准备好的语句,我想知道如何更好地输出我的数据,因为我也在使用 WYSIWYG 编辑器。 使用 strip_tags、htmlentities 或 htmlspecialchars 未正确显示文本样式。

这是将数据输入数据库的代码:

$sql    = "INSERT INTO posts(post_title, post_content, post_author, post_category, post_tags, post_image)";
                $sql   .= "VALUES(:title, :content, :author, :category, :tags, :image)";
                $stmt   = $dbConn->prepare($sql);
                $result = $stmt->execute([
                    ':title'    => $postTitle,
                    ':content'  => $postContent,
                    ':author'   => $postAuthor,
                    ':category' => $postCategory,
                    ':tags'     => $postTags,
                    ':image'    => $imageFullName
                ]);

您请求的这个内置功能将很难获得。他们有很多解决方法

1.) 你可以使用像 htmlpurifier 这样的外部库 http://htmlpurifier.org/

2.) 使用strip_tags()

您可以使用 strip_tags() 允许某些标签通过,同时去除其他 html 危险标签

例如只允许 <h1> and <b> 而去掉其他标签你可以这样做

$text_strip = '<h1>Am nancy.</h1><div>hhhh</div> <b>Mooree</b> <a href="">remove me</a>';
// Allow only <h1> and <a>
echo strip_tags($text_strip , '<h1><b>');

查看可用的数据过滤方法列表 data filtering: https://www.php.net/manual/en/book.filter.php

3.) 使用FILTER_SANITIZE_STRING()

您还可以使用 FILTER_SANITIZE_STRING() 过滤掉危险的文本输入

echo filter_var ($text_text, FILTER_SANITIZE_STRING); 

查看所有可用消毒方法的列表 sanitization: https://www.php.net/manual/en/filter.filters.sanitize.php

更新

还有一件事。即使您使用 pdo,您仍然容易受到 sql 注入攻击。这是因为 pdo 通过模拟已弃用的 mysql_real_escape_string() 函数来执行清理。您将需要强制 pdo 禁用仿真并使用直接准备好的语句。我会更新我的答案

要解决此问题,请参阅下面的数据库连接代码。字符集设置为 utf8

$db = new PDO ('mysql:host=localhost;dbname=mydb;charset=utf8', 
    'root', // username
        'root123' // password
);

//Disable Emulates pdo and thus forces PDO to use real prepared statement.
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

有了上面的这个,你就可以 100% 安全地抵御各种 sql 注入攻击。如果您对此表示赞赏,请在评论中大声疾呼