PHP:从html中删除javascript事件

PHP:从html中删除javascript事件,php,Php,有没有办法删除像“onload”、“onclick”这样的js事件,。。。从PHP中的html元素 例如,如果给定Link,则所需输出应为Link 我是这样做的: $dom = new DOMDocument; $dom->loadHTML($request->request->get('description')); $nodes = $dom->getElementsByTagName('*'); foreach($nodes as $node) { if

有没有办法删除像“onload”、“onclick”这样的js事件,。。。从PHP中的html元素

例如,如果给定Link,则所需输出应为Link

我是这样做的:

$dom = new DOMDocument;
$dom->loadHTML($request->request->get('description'));
$nodes = $dom->getElementsByTagName('*');

foreach($nodes as $node)
{
    if ($node->hasAttribute('onload'))
    {
        $node->removeAttribute('onload');
    }

    if ($node->hasAttribute('onclick'))
    {
        $node->removeAttribute('onclick');
    }
}

$dom->saveHTML();

但是,我不确定这是否是一种安全的方法,因为如果以后创建一个新的js事件,我可能会忘记将其列入黑名单,这是真实的。

您应该构建一个Javascript方法来为您执行此操作,并可以在加载正文后应用它,因为php代码是在页面加载时执行的,在再次加载之前,您无法检查文档中是否有其他事件。

您是否考虑过白名单方法,即只允许特定属性并取消所有其他属性?请注意,这不会影响文档中其他地方的任何JavaScript代码。元素仍然可以有单击处理程序,但不能有来自内联属性的处理程序。是的,如果文档中没有内联js,也应该删除它。但是,我会删除标签之间的所有内容。是的,我也考虑过白名单,但很好奇是否还有其他我不知道的方法需要用PHP而不是JS来实现
function filterText($value)
{
    if(!$value) return $value;
    
    return escapeJsEvent(removeScriptTag($value));
    
}

function escapeJsEvent($value){
    return preg_replace('/(<.+?)(?<=\s)on[a-z]+\s*=\s*(?:([\'"])(?!\2).+?\2|(?:\S+?\(.*?\)(?=[\s>])))(.*?>)/i', "$1 $3", $value);        
}

function removeScriptTag($text)
{
    $search = array("'<script[^>]*?>.*?</script>'si",
             "'<iframe[^>]*?>.*?</iframe>'si");

    $replace = array('','');

    $text = preg_replace($search, $replace, $text);

    return preg_replace_callback("'&#(\d+);'", function ($m) {
        return chr($m[1]);
    }, $text);
}


echo filterText('<img src=1 href=1 onerror="javascript:alert(1)"></img>');