我正在为我的网页创建一个“HTML编辑器”。目前,我只希望编辑器允许输入HTML和CSS元素以及 not Javascript(或者Jquery)。
我正试图找到一种方法来禁用使用PHP的<script>
或<script type="text/javascript"> </script>
。然而,目前的方式输出了一个混乱的结果!
$content_in_before = str_replace('<script','',$content_in_before);
$content_in_before = str_replace('script>','',$content_in_before);
它的编码也不是很好!
是否有更加防弹的编码方式,阻止所有类型的Javascript输入此表单? (虽然仍然允许CSS和HTML)?
提前致谢!
答案 0 :(得分:2)
我建议使用清理库,例如HTML Purifier,因为仅剥离<script>
标记不足以阻止XSS攻击,因为JS可以使用{{1}等属性自动执行},onLoad
,onMouseOver
等
要删除标签,并允许一些,您可以使用PHP的strip_tags()
功能,但它不会删除属性,因此我建议使用HTML清理库。如果您能够运行它,也许最好的选择之一是Google的Caja库,虽然它不能在共享托管环境中工作,因为它是用Java编写的,但它可以托管在Google的AppEngine上。 / p>
此外,简单的正则表达式解决方案并不总是可靠的,因为即使是格式错误的标签仍然可以解析。例如,正常脚本标记的简单正则表达式检测不会捕获onUnload
,除非它在标记名称后面寻找空格。可以检查这一点,但使用已建立的库可以节省您的时间,并为您提供经过实战考验的库的额外奖励。
答案 1 :(得分:1)
你可以像这样的正式表现
echo preg_replace('/<script\b[^>]*>(.*?)<\/script>/is', "", $var);
来源:https://stackoverflow.com/a/1886842/2046700
或者如我们所说的那样为您执行此操作的图书馆,例如: http://htmlpurifier.org/
另一个可能的例子:
<?php
$javascript = '/<script[^>]*?javascript{1}[^>]*?>.*?<\/script>/si';
$noscript = '';
$document = file_get_contents('test.html');
echo preg_replace($javascript, $noscript, $document);
?>
答案 2 :(得分:1)
您允许的白名单标记,以及您允许的属性,然后删除其他所有内容。您可以使用DOMDocument
。
我曾经写过这段代码,但从来没有其他人审查过它
function legal_html($str, $tags='<a><b><br><i><span><table><tbody><tr><td><thead><th><img>', $attribArray=false) {
if ($attribArray===false) {
$attribs = array('id','class','src','href','alt');
} else {
$attribs = $attribArray;
}
$stripped = strip_tags($str,$tags);
$dom = new DOMDocument();
@$dom->loadHTML('<div>'.$stripped.'</div>');
foreach ($dom->getElementsByTagName('*') as $node) {
for ($i = $node->attributes->length -1; $i >= 0; $i--) {
$attrib = $node->attributes->item($i);
if (!in_array($attrib->name,$attribs)) $node->removeAttributeNode($attrib);
}
}
$stripped = $dom->saveHTML();
$start = strpos($stripped,'<div>')+5;
$end = strrpos($stripped,'</div>');
$stripped = trim(substr($stripped,$start,$end-$start));
return $stripped;
}
答案 3 :(得分:-3)
你可以使用这样的东西 -
$content=$_POST['textbox'];
if(strpos($content,'<script>')!==false){
//show error;
}
else{
//proceed with work;
}