清理输出数据
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 注入攻击。如果您对此表示赞赏,请在评论中大声疾呼
我在我的代码中使用 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 注入攻击。如果您对此表示赞赏,请在评论中大声疾呼