杰夫实际上张贴有关这个 消毒HTML.但他的例子是在C#我实际上更多的有兴趣在Java版本。没有任何人有一个更好的版本为Java?是他的例子不够好,只要把直接从C#Java?

[更新]我已经把一个赏金在这个问题,因为这样是不是流行的当我问的问题,因为它是今天,(*).作为对任何有关的安全,更多的人看到它,更好它!

(*)事实上,我认为这仍是在封闭的测试

有帮助吗?

解决方案

不要使用正则表达式执行此操作。请记住,您不是仅仅针对有效的HTML进行保护;您正在防范Web浏览器创建的DOM。可以很容易地欺骗浏览器从无效的HTML生成有效的DOM。

例如,请参阅混淆的XSS攻击列表。您准备好定制正则表达式以防止对 Yahoo和Hotmail 在IE6 / 7/8上?

<HTML><BODY>
<?xml:namespace prefix="t" ns="urn:schemas-microsoft-com:time">
<?import namespace="t" implementation="#default#time2">
<t:set attributeName="innerHTML" to="XSS&lt;SCRIPT DEFER&gt;alert(&quot;XSS&quot;)&lt;/SCRIPT&gt;">
</BODY></HTML>

这个可以在IE6上运行的攻击怎么样?

<TABLE BACKGROUND="javascript:alert('XSS')">

本网站上未列出的攻击如何?杰夫的方法存在的问题是,它不是白名单,正如声称的那样。有人在该页上熟练地指出:

  

它的问题在于,是html   必须干净。有些情况   你可以通过黑客入侵的HTML,它   不会匹配它,在这种情况下它会   返回被黑的html字符串   将无法匹配任何替换。这个   并非严格白名单。

我建议使用专用的工具,例如 AntiSamy 。它的工作原理是实际解析HTML,然后遍历DOM并删除可配置白名单中的任何内容。主要区别在于能够优雅地处理格式错误的HTML。

最好的部分是它实际上对上述网站上的所有XSS攻击进行单元测试。此外,比这个API调用更容易:

public String toSafeHtml(String html) throws ScanException, PolicyException {

    Policy policy = Policy.getInstance(POLICY_FILE);
    AntiSamy antiSamy = new AntiSamy();
    CleanResults cleanResults = antiSamy.scan(html, policy);
    return cleanResults.getCleanHTML().trim();
}

其他提示

我不相信,使用一个定期表达的最佳方式找到的所有嫌疑人的代码。经常的表现是相当容易招特别在处理破HTML。例如,经常表达的列在清理HTML链路将无法删除所有"a"的元素,有的属性之间的元素名称和属性'href':

< 一alt="的xss注"href="http://www.malicous.com/bad.php">

一个更可靠的方法去除的恶意代码是依靠一种XML Parser,可以处理所有类型的HTML文档(保持整洁,TagSoup,等等)而选择的因素以除去与XPath表达。一旦HTML文档进行解析,进一DOM document素revome可以很容易地发现和安全。这是更容易做到的有XSLT。

我从NoScript最佳Anti-XSS插件中提取,这是它的正则表达式: 工作完美无缺:

<[^\w<>]*(?:[^<>"'\s]*:)?[^\w<>]*(?:\W*s\W*c\W*r\W*i\W*p\W*t|\W*f\W*o\W*r\W*m|\W*s\W*t\W*y\W*l\W*e|\W*s\W*v\W*g|\W*m\W*a\W*r\W*q\W*u\W*e\W*e|(?:\W*l\W*i\W*n\W*k|\W*o\W*b\W*j\W*e\W*c\W*t|\W*e\W*m\W*b\W*e\W*d|\W*a\W*p\W*p\W*l\W*e\W*t|\W*p\W*a\W*r\W*a\W*m|\W*i?\W*f\W*r\W*a\W*m\W*e|\W*b\W*a\W*s\W*e|\W*b\W*o\W*d\W*y|\W*m\W*e\W*t\W*a|\W*i\W*m\W*a?\W*g\W*e?|\W*v\W*i\W*d\W*e\W*o|\W*a\W*u\W*d\W*i\W*o|\W*b\W*i\W*n\W*d\W*i\W*n\W*g\W*s|\W*s\W*e\W*t|\W*i\W*s\W*i\W*n\W*d\W*e\W*x|\W*a\W*n\W*i\W*m\W*a\W*t\W*e)[^>\w])|(?:<\w[\s\S]*[\s\0\/]|['"])(?:formaction|style|background|src|lowsrc|ping|on(?:d(?:e(?:vice(?:(?:orienta|mo)tion|proximity|found|light)|livery(?:success|error)|activate)|r(?:ag(?:e(?:n(?:ter|d)|xit)|(?:gestur|leav)e|start|drop|over)?|op)|i(?:s(?:c(?:hargingtimechange|onnect(?:ing|ed))|abled)|aling)|ata(?:setc(?:omplete|hanged)|(?:availabl|chang)e|error)|urationchange|ownloading|blclick)|Moz(?:M(?:agnifyGesture(?:Update|Start)?|ouse(?:PixelScroll|Hittest))|S(?:wipeGesture(?:Update|Start|End)?|crolledAreaChanged)|(?:(?:Press)?TapGestur|BeforeResiz)e|EdgeUI(?:C(?:omplet|ancel)|Start)ed|RotateGesture(?:Update|Start)?|A(?:udioAvailable|fterPaint))|c(?:o(?:m(?:p(?:osition(?:update|start|end)|lete)|mand(?:update)?)|n(?:t(?:rolselect|extmenu)|nect(?:ing|ed))|py)|a(?:(?:llschang|ch)ed|nplay(?:through)?|rdstatechange)|h(?:(?:arging(?:time)?ch)?ange|ecking)|(?:fstate|ell)change|u(?:echange|t)|l(?:ick|ose))|m(?:o(?:z(?:pointerlock(?:change|error)|(?:orientation|time)change|fullscreen(?:change|error)|network(?:down|up)load)|use(?:(?:lea|mo)ve|o(?:ver|ut)|enter|wheel|down|up)|ve(?:start|end)?)|essage|ark)|s(?:t(?:a(?:t(?:uschanged|echange)|lled|rt)|k(?:sessione|comma)nd|op)|e(?:ek(?:complete|ing|ed)|(?:lec(?:tstar)?)?t|n(?:ding|t))|u(?:ccess|spend|bmit)|peech(?:start|end)|ound(?:start|end)|croll|how)|b(?:e(?:for(?:e(?:(?:scriptexecu|activa)te|u(?:nload|pdate)|p(?:aste|rint)|c(?:opy|ut)|editfocus)|deactivate)|gin(?:Event)?)|oun(?:dary|ce)|l(?:ocked|ur)|roadcast|usy)|a(?:n(?:imation(?:iteration|start|end)|tennastatechange)|fter(?:(?:scriptexecu|upda)te|print)|udio(?:process|start|end)|d(?:apteradded|dtrack)|ctivate|lerting|bort)|DOM(?:Node(?:Inserted(?:IntoDocument)?|Removed(?:FromDocument)?)|(?:CharacterData|Subtree)Modified|A(?:ttrModified|ctivate)|Focus(?:Out|In)|MouseScroll)|r(?:e(?:s(?:u(?:m(?:ing|e)|lt)|ize|et)|adystatechange|pea(?:tEven)?t|movetrack|trieving|ceived)|ow(?:s(?:inserted|delete)|e(?:nter|xit))|atechange)|p(?:op(?:up(?:hid(?:den|ing)|show(?:ing|n))|state)|a(?:ge(?:hide|show)|(?:st|us)e|int)|ro(?:pertychange|gress)|lay(?:ing)?)|t(?:ouch(?:(?:lea|mo)ve|en(?:ter|d)|cancel|start)|ime(?:update|out)|ransitionend|ext)|u(?:s(?:erproximity|sdreceived)|p(?:gradeneeded|dateready)|n(?:derflow|load))|f(?:o(?:rm(?:change|input)|cus(?:out|in)?)|i(?:lterchange|nish)|ailed)|l(?:o(?:ad(?:e(?:d(?:meta)?data|nd)|start)?|secapture)|evelchange|y)|g(?:amepad(?:(?:dis)?connected|button(?:down|up)|axismove)|et)|e(?:n(?:d(?:Event|ed)?|abled|ter)|rror(?:update)?|mptied|xit)|i(?:cc(?:cardlockerror|infochange)|n(?:coming|valid|put))|o(?:(?:(?:ff|n)lin|bsolet)e|verflow(?:changed)?|pen)|SVG(?:(?:Unl|L)oad|Resize|Scroll|Abort|Error|Zoom)|h(?:e(?:adphoneschange|l[dp])|ashchange|olding)|v(?:o(?:lum|ic)e|ersion)change|w(?:a(?:it|rn)ing|heel)|key(?:press|down|up)|(?:AppComman|Loa)d|no(?:update|match)|Request|zoom))[\s\0]*=

测试: http://regex101.com/r/rV7zK8

我认为它会阻止99%的XSS,因为它是NoScript的一部分,这是一个定期更新的插件

^(\s|\w|\d|<br>)*?$ 

这将验证字符,数字,空格以及<br>标记。 如果您想要更多风险,可以添加更多标签,例如

^(\s|\w|\d|<br>|<ul>|<\ul>)*?$

使用jeffs代码的最大问题是@目前不可用。

我可能只需要<!> quot; raw <!>;如果我需要它并将其粘贴到

中,请使用jeffs代码进行正则表达式

http://www.cis.upenn。 edu /~matuszek / General / RegexTester / regex-tester.html

然后看到需要转义的东西被转义然后再使用它。


考虑到这个正则表达式的用法我个人会确保我完全理解我在做什么,为什么以及如果我没有成功会有什么后果,在复制/粘贴任何东西之前,像其他答案试图帮助你

(对于任何复制/粘贴,这可能是非常合理的建议)

[\s\w\.]*。如果它不匹配,你就有了XSS。也许。请注意,此表达式仅允许字母,数字和句点。它避免了所有符号,即使是有用的符号,也不用担心XSS。一旦你允许<!>放大器,你就会有担忧。而只是替换<!> amp;的所有实例; &amp;是不够的。信任过于复杂:P。显然这将禁止大量合法文本(你可以用一个!或者其他东西替换所有不匹配的字符),但我认为它会杀死XSS。

将其解析为html并生成新的html的想法可能更好。

旧线程但也许这对其他用户有用。有一个维护的PHP安全层工具: https://github.com/PHPIDS/ 它基于一组正则表达式,你可以在这里找到:

https://github.com/PHPIDS/PHPIDS/斑点/主/ LIB / IDS / default_filter.xml

这个问题完美地说明了计算理论研究的一个重要应用。计算理论是一个专注于产生计算机数学表示的领域。

计算理论中一些最深刻的研究是证明各种语言之间关系的证明。

计算理论家证明的一些语言关系包括:

这表明无上下文语言比常规语言更强大。因此,如果语言明确无上下文(无上下文而非常规),那么任何正则表达式都无法识别它。

JavaScript至少是无上下文的,因此我们百分之百地确定设计能够捕获所有XSS的正则表达式(正则表达式)是一项不可能完成的任务。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top