【问题标题】:Sanitizing Output data清理输出数据
【发布时间】:2019-10-03 11:03:18
【问题描述】:

我在我的代码中使用 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
                ]);

【问题讨论】:

  • 输出与PDO有什么关系?您只向我们展示了插入代码。怎么输出?
  • 输出我正在使用 htmlentities:

标签: php strip-tags


【解决方案1】:

您要求的这个内置功能将很难获得。他们有很多变通方法

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 注入攻击。如果您对此表示赞赏,请在评论中大声疾呼

【讨论】:

  • 非常有用。我试图允许一些标签,它的工作。
  • 还有一件事。即使您使用 pdo,您仍然容易受到 sql 注入攻击。这是因为 pdo 通过模拟已弃用的 mysql_real_escape_string() 函数来执行清理。您将需要强制 pdo 禁用仿真并使用直接准备好的语句。我会更新我的答案
  • 查看更新的答案以获取有关 pdo @Pitshou 上 sql 注入的更多信息
  • 这就是我连接 pdo 的方式:这样安全吗? PDO::ATTR_PERSISTENT => 真,PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION @Nancy Mooreen
  • 在生产中,如果你愿意,你可以在代码中注释掉或这一行,你会没事的 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::EXCEPTION。你可以改变 $ db 变量到您选择的任何变量。你会没事的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多