Jeff实际上在Sanitize HTML中发布了有关此内容的信息。但是他的示例在C#中,而实际上我对Java版本更感兴趣。有没有人有更好的Java版本?他的示例足以将直接从C#转换为Java吗?
[更新]我悬赏这个问题,因为当我问这个问题时,SO不如今天(*)受欢迎。至于与安全相关的任何事物,研究它的人越多,它就越好!
(*)实际上,我认为它仍处于封闭测试阶段
不要使用正则表达式执行此操作。请记住,您并不是仅仅针对有效的HTML进行保护;您可以防止Web浏览器创建的DOM。可以诱使浏览器很容易地从无效的HTML生成有效的DOM。
例如,请参阅此混淆的XSS攻击列表。您是否准备量身定制正则表达式以防止在IE6 /
7/8上对Yahoo和Hotmail进行这种现实世界的攻击?
<HTML><BODY>
<?xml:namespace prefix="t" ns="urn:schemas-microsoft-com:time">
<?import namespace="t" implementation="#default#time2">
<t:set attributeName="innerHTML" to="XSS<SCRIPT DEFER>alert("XSS")</SCRIPT>">
</BODY></HTML>
如何在IE6上进行这种攻击?
<TABLE BACKGROUND="javascript:alert('XSS')">
该网站未列出的攻击如何?Jeff的方法存在的问题是,它不是声称的白名单。正如该页面上的某人熟练地指出:
它的问题是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();
}
2.4. 跨站脚本攻击 跨站脚本攻击是众所周知的攻击方式之一。所有平台上的Web应用都深受其扰,PHP应用也不例外。 所有有输入的应用都面临着风险。Webmail,论坛,留言本,甚至是Blog。事实上,大多数Web应用提供输入是出于更吸引人气的目的,但同时这也会把自己置于危险之中。如果输入没有正确地进行过滤和转义,跨站脚本漏洞就产生了。 以一个允许在每个页面上录入评论的应用为例,它使用了下面的表单
描述 跨站脚本,或者 XSS,涉及到站定包含非预期的 JavaScript 脚本代码,它随后传给用于,用户在浏览器中执行了该代码。它的一个无害示例为: alert('XSS'); 这会调用 JavaScript 函数alert,并创建一个简单的弹出窗口,带有文本XSS。现在,在这本书的前一个版本中,我推荐你在报告中使用这个例子。但是,一个非常成功的黑客告诉我这是个糟糕的例子,因为漏洞的接收者通常
只要应用程序获取不受信任的数据并将其发送到客户端(浏览器)而未经验证,就会发生跨站点脚本(XSS)。这允许攻击者在受害者的浏览器中执行恶意脚本,这可能导致用户会话劫持,破坏网站或将用户重定向到恶意站点。 下面我们借助一个简单图表了解这个漏洞的威胁代理,攻击向量,安全弱点,技术影响和业务影响。 威胁代理 - 内部/外部用户或管理员发送给系统的不受信任的数据。 攻击者的方法 - 发送不受信任的数据/基
问题内容: 我已配置PHP,以便打开魔术引号,并关闭全局寄存器。 我尽我所能一直为从用户输入派生的任何输出调用htmlentities()。 我有时也会在数据库中查找xss附带的常见信息,例如… 我还应该做些什么,以及如何确保自己 一直 想做的事情 始终 完成。 问题答案: 为了成功防止XSS,逃避输入并不是最好的选择。输出也必须转义。如果您使用Smarty模板引擎,则可以使用修饰符将所有敏感字符
问题内容: 我正在尝试使用Java expr在:之后捕获正确的部分,但是在以下代码中,打印的捕获组是整个字符串,怎么了? 问题答案: 子组的编号从1开始,全文为0。只需循环执行count + 1。