为了确保它不包含任何 Javascript,我需要针对哪些正则表达式来测试字符串?
我以这篇文章为起点。
代码块:
<script.*?>[\s\S]*?</.*?script>
":javascript" 代码(例如
<a href="javascript:alert('hello')"
):(?<=<.*)javascript.*:[^"]*
Html 标签中的事件处理程序(例如
<div onmouseover=""
):on\w+="[^"]*"
为了确保它不包含任何 Javascript,我需要针对哪些正则表达式来测试字符串?
我以这篇文章为起点。
代码块:
<script.*?>[\s\S]*?</.*?script>
":javascript" 代码(例如<a href="javascript:alert('hello')"
):
(?<=<.*)javascript.*:[^"]*
Html 标签中的事件处理程序(例如<div onmouseover=""
):
on\w+="[^"]*"
永远不要使用正则表达式来解析 HTML。您可能能够确保它不包含 javascript,但您无法确保它不会以其他方式被严重破坏。相反,请使用适当的解析器。
此外,即使是不包含 javascript 的有效 HTML 仍可能包含其他令人不快的元素(音频、视频、CSS 节点、表单元素...),我建议对您允许的 HTML 元素使用白名单。
这是您的代码的外观示例(请注意,即使它应该是伪代码,这实际上可能是正确的 C# 语法):
string[] tagWhitelist = ['strong', 'em', 'span' /*, ...*/];
string[] attrWhitelist = [/*...*/];
void function fixNode(DOMNode node, bool dieOnError){
if(tagWhitelist.contains(node.type()){
node.children.each((x) => fixNode(x))
node.attributes
.filter((x) => !attrWhitelist.contains(x))
.each((x) => dieOnError ? throw new InvalidTagException() : x.remove())
}else{
dieOnError ? throw new InvalidAttrException() : node.remove()
}
}
...
string output = fixNode(DOMParser.load(input, {strict:false}), false).toString();
这也可以用于验证,但前提是解析器能够在无效 HTML 上引发异常(我使用过的那些总是尝试修复代码):
try{
// note: if fixNode is only ever used to validate, don't use exceptions
fixNode(DOMParser.load(input, {strict:true}), true);
return true;
}catch(InvalidTagException, InvalidAttrException ex){
return false;
}
更新:您在评论中链接的代码声称可以做到这一点,但我不能保证它确实做到了。