Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何安全地输出包含HTML标记的内容?_Php_Html - Fatal编程技术网

Php 如何安全地输出包含HTML标记的内容?

Php 如何安全地输出包含HTML标记的内容?,php,html,Php,Html,我有一个博客系统,用户必须将内容输入html文本区域,包括html标记,如。这存储在数据库中。如果使用php将此输入回送到web页面,我如何转义输出以防止XSS,但保留html标记的含义,以便正确格式化博客文章?如果我使用htmlentities($blog\u content)它会将html标记打印到页面上,因此您可以看到您好,这是一个blog 这可能吗 好吧,您可以使用strip_tags()来剥离标签。这不是一个防弹的解决方案,但您可以通过允许一些标签(基本上是粗体、斜体、链接等)来提高安

我有一个博客系统,用户必须将内容输入html文本区域,包括html标记,如
。这存储在数据库中。如果使用php将此输入回送到web页面,我如何转义输出以防止XSS,但保留html标记的含义,以便正确格式化博客文章?如果我使用
htmlentities($blog\u content)
它会将html标记打印到页面上,因此您可以看到
您好,这是一个blog


这可能吗

好吧,您可以使用
strip_tags()
来剥离
标签。这不是一个防弹的解决方案,但您可以通过允许一些标签(基本上是粗体、斜体、链接等)来提高安全性

然后,您可以轻松打印内容并避免执行javascript

$text = '<p>Test paragraph.</p><!-- Comment --> <a href="#fragment">Other text</a>';
echo strip_tags($text);
echo "\n";

// Allow <p>, <a> and some formatting
echo strip_tags($text, '<p><a><i><em><b><strong>');
$text=”测试段落。

; 回音条标签($text); 回音“\n”; //允许,以及一些格式设置 回音条标签($text,);
您需要的是选择性过滤或消毒。换句话说,您希望允许一些HTML,但不允许其他可能的恶意标记。这是一项非常棘手的业务,特别是因为HTML语法非常复杂,而且过于简单的清理尝试容易出错,从而允许通过格式错误的HTML注入标记

如果可能的话,你应该避免让你的用户提交HTML。使用特殊的标记语言,如Wiki标记、Markdown、BBcodes或类似语言


如果你确定你在做什么,你应该选择一个好的,经过良好测试的,健壮的库来提供这样的消毒功能。是我所知道的唯一符合此描述的。

您测试过htmlentities()吗?
strip\u标记的可能重复项是不够的,因为它不会从元素中删除属性。考虑<代码> <代码>这部分不是一个防弹解决方案,你错过了吗?)你提到你可以“通过允许一些标签来提高安全性”,但事实并非如此。通过实现允许标记的白名单,您根本无法真正提高安全性。您还提到,您可以“避免javascript执行”,这是使用此方法无法做到的。顺便说一句:否决票不是我投的。别难过。我只是建议改进。+1因为我发现这个答案帮助我更好地理解了整个主题,而你也明确表示这不是一个完美的解决方案。这是所有可用解决方案中最好的。我自己很犹豫回答这个问题,因为他们似乎已经接受HTML了,我不想建议更改。但是如果使用另一种标记语言是可行的,那就去做吧。谢谢你,在这种情况下,HTML净化器似乎是最好的解决方案。由于输入数据的能力将在密码保护区内,并且仅限于极少数用户,我很高兴他们能够输入html。