禁用javascript输入到表单

时间:2014-12-20 03:19:10

标签: javascript php jquery html

我正在为我的网页创建一个“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)?

提前致谢!

4 个答案:

答案 0 :(得分:2)

我建议使用清理库,例如HTML Purifier,因为仅剥离<script>标记不足以阻止XSS攻击,因为JS可以使用{{1}等属性自动执行},onLoadonMouseOver

要删除标签,并允许一些,您可以使用PHP的strip_tags()功能,但它不会删除属性,因此我建议使用HTML清理库。如果您能够运行它,也许最好的选择之一是Google的Caja库,虽然它不能在共享托管环境中工作,因为它是用Java编写的,但它可以托管在Google的AppEngine上。 / p>

此外,简单的正则表达式解决方案并不总是可靠的,因为即使是格式错误的标签仍然可以解析。例如,正常脚本标记的简单正则表达式检测不会捕获onUnload,除非它在标记名称后面寻找空格。可以检查这一点,但使用已建立的库可以节省您的时间,并为您提供经过实战考验的库的额外奖励。

实施例: Script Tags with Spaces producing an alert

答案 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;
}