PHP:从html中删除javascript事件
有没有办法删除像“onload”、“onclick”这样的js事件,。。。从PHP中的html元素 例如,如果给定Link,则所需输出应为Link 我是这样做的: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
$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>');