我看到了Kohana框架,允许用户选择使用HTMLPurifier来对抗任何可能的XSS攻击.
我认为HTMLPurifier旨在允许HTML的标准兼容输出.
它是否有助于避免XSS攻击100%或可能在很大程度上?或者你会建议其他的东西.
谢谢
我$this->escape()在zend视图中做了很多.这足以阻止XSS吗?
Zend Framework之外还有HTMLPurifier.我想知道zend $this->escape()与HTMLPurifier 的比较.
我如何在HTMLPurifier中允许"class"?我试图净化这个:
<div class="txt_r" id="test">Blah</div>
Run Code Online (Sandbox Code Playgroud)
我得到:
<div id="test">Blah</div>
Run Code Online (Sandbox Code Playgroud)
为什么上课消失了?我正在使用下一个配置:
$config->set('Attr.EnableID', true);
$config->set('CSS.Trusted', true);
$config->set('HTML.AllowedAttributes', 'style, src, class');
Run Code Online (Sandbox Code Playgroud) 我想允许用户可以在我的论坛中使用的HTML标签的有限白名单.所以我已经像这样配置了HTML Purifier:
$config = HTMLPurifier_Config::createDefault();
$config->set('HTML.Allowed', 'p,a[href|rel|target|title],img[src],span[style],strong,em,ul,ol,li');
$purifier = new HTMLPurifier($config);
Run Code Online (Sandbox Code Playgroud)
我想知道的是,HTML Purifier的默认配置是否仍然适用,但接受的HTML标签数量减少或者我是否需要手动重新设置每个可能的配置参数?
另外,我应该以任何方式调整默认配置以保证安全吗?我是整个XSS保护的新手,是HTML Purifier的新手,并没有发现手册提供了很多"基本"提示和提示.
我正在使用此代码来配置 HTML Purifier:
$config = \HTMLPurifier_Config::createDefault();
$config->set('HTML.Allowed', 'div,p,ol,ul,li,br'); // only allow these tags
$purifier = new \HTMLPurifier($config);
Run Code Online (Sandbox Code Playgroud)
我发现,虽然 HTMLPurifier 确实去除了诸如styleand 之类的标签table,但这些标签内的内容仍包含在纯化后的输出中。
如何让 HTML Purifier 不返回不允许的标签中的内容?
编辑:
我找到了Core.HiddenElements设置,这使得style标签上的内容似乎不应该显示在输出中,但根据我的配置,它们是。
我尝试将以下内容添加到我的代码中,但没有任何区别(style仍然显示标签的内容):
$config->set('Core.HiddenElements', array (
'script' => true,
'style' => true,
'table' => true
));
Run Code Online (Sandbox Code Playgroud) 我正在使用名为summernote的wysiwyg,我发送给服务器的值,我用HTML Purifier净化它.之后我将它保存到DB(mysql).然后我需要在wysiwyg中显示纯化的html,因此将其写为textarea值(textarea在js中与summernote链接).但它显示转义的html而不是格式化文本.编辑器正常工作,js控制台显示没有错误.
Javascript我用来初始化summernote
$('.summernote').summernote({
lang: 'cs-CZ',
height: 100,
airMode: true,
prettifyHtml: true
});
Run Code Online (Sandbox Code Playgroud)
这是wysiwyg的屏幕截图(在空中模式下,因此未显示工具),控制台检查其值.
所见即所得的拿铁模板:
<textarea name="{$key}" class="summernote form-control" >{$value->value|noescape}</textarea>
Run Code Online (Sandbox Code Playgroud) 根据HTML Purifier smoketest,偶尔会丢弃"格式错误"的URI以留下无属性的锚标记,例如
<a href="javascript:document.location='http://www.google.com/'">XSS</a> 变 <a>XSS</a>
...以及偶尔被剥离到协议,例如
<a href="http://1113982867/">XSS</a> 变 <a href="http:/">XSS</a>
虽然这本身没有问题,但它有点难看.我没有试图用正则表达式去除这些,而是希望使用HTML Purifier自己的库功能/注入器/插件/ whathaveyou.
有条件地删除HTMLPurifier中的属性很容易.这里的库为类HTMLPurifier_AttrTransform提供了方法confiscateAttr().
虽然我不亲自使用的功能confiscateAttr(),我使用HTMLPurifier_AttrTransform按照这个线程添加target="_blank"到所有的锚.
// more configuration stuff up here
$htmlDef = $htmlPurifierConfiguration->getHTMLDefinition(true);
$anchor = $htmlDef->addBlankElement('a');
$anchor->attr_transform_post[] = new HTMLPurifier_AttrTransform_Target();
// purify down here
Run Code Online (Sandbox Code Playgroud)
HTMLPurifier_AttrTransform_Target 当然,这是一个非常简单的课程.
class HTMLPurifier_AttrTransform_Target extends HTMLPurifier_AttrTransform
{
public function transform($attr, $config, $context) {
// I could call $this->confiscateAttr() here to throw away an
// undesired …Run Code Online (Sandbox Code Playgroud) 我需要编写一个PHP函数来删除字符串中的开始和结束段落标记,但前提是它们位于开头/结尾.所以字符串:
"Simple Test"
"<p>Here</p>"
"<p>Test <p>Nested</p> Outside </p>"
Run Code Online (Sandbox Code Playgroud)
输出:
"Simple Test"
"Here"
"Test <p>Nested</p> Outside"
Run Code Online (Sandbox Code Playgroud)
HTMLPurifier可以这样做,还是应该使用substr?我的第一次尝试是:
if(strpos($str,'<p>') === 0 && strcmp(substr($str,-1,4),'</p>'))
$str = substr($str,3,strlen($str)-4);
Run Code Online (Sandbox Code Playgroud) 我遇到了HTML Purifier的问题,尽管使用配置选项来避免此类行为,但它会删除标题元素上的ID.
现在我正在使用:
// set up HTML Purifier for user inputs
require_once 'htmlpurifier/library/HTMLPurifier.auto.php';
$config = HTMLPurifier_Config::createDefault();
$config->set('Core.Encoding', 'UTF-8');
$config->set('HTML.Doctype', 'HTML 4.01 Transitional');
$config->set('Attr.EnableID', true);
$config->set('HTML.Trusted', true);
$purifier = new HTMLPurifier($config);
Run Code Online (Sandbox Code Playgroud)
然后我给它喂了一个字符串,如:
<h6 id="1843804297">This is a title</h6><h5 id="1979691494">This one too.</h5><h3 id="932393874">I think you see where this is going.</h3>
Run Code Online (Sandbox Code Playgroud)
我还尝试为ID标题创建列入白名单的条目无效,甚至直接操作存储在$ config对象中的默认值.
$config->def->defaults['Attr.EnableID'] = true;
Run Code Online (Sandbox Code Playgroud)
ID非常重要,因为它们是由PHP脚本分配的,存储在MySQL中,后来由JS导航系统选取.它们需要从用户输入,因为它们通常会保持静态以用于后续内容更新.
我正在使用HTML净化器删除所有不必要的/恶意的html标签.
$html = 'dirty html provided by user';
$config = HTMLPurifier_Config::createDefault();
$config->set('HTML.Allowed', 'p,a[href], ... other tags);
$purifier = new HTMLPurifier($config);;
$output = $purifier->purify($html);
Run Code Online (Sandbox Code Playgroud)
它的工作非常好,但我想多做一点.我想把我所有的<a href='link'>...</a>东西改成别的东西<a href='somefunc(link)' rel="nofollow" target="_blank"> ... </a>.
在搜索了一下后,我找到了以下相关链接,但问题是它需要修补一个复杂的库(这不是一个好主意,解决方案也有点复杂).
通过他们的论坛帖子阅读,看起来有添加nofollow参数的解决方案$config->set("HTML.Nofollow", true);,但我仍然无法找到如何修改每个链接.
我目前的解决方案是自己解析纯化的HTML并修改链接,但我认为有一种方法可以做到这一点HTML Purifier.
htmlpurifier ×10
php ×6
html ×5
xss ×2
filtering ×1
html-parsing ×1
jquery ×1
nette ×1
security ×1
strip-tags ×1
substr ×1
summernote ×1
user-input ×1