我想稍后存储然后以最小的努力安全地显示用户输入的内容(我的目标是一个不写一堆安全相关代码的Web应用程序)。
编辑:Google App Engine for Java
答案 0 :(得分:1)
我自己也在处理同样的问题;但我还没有机会把它带到现实世界中;所以请记住,我的答案不是经过严格的测试。自行承担使用风险。
首先,您需要问问自己是否允许用户使用任何HTML标记。那么,例如,用户可以输入链接吗?如何制作粗体文字?
如果答案是否定的,则相当简单。以下是如何设置过滤器的想法:
http://greatwebguy.com/programming/java/simple-cross-site-scripting-xss-servlet-filter/
但就个人而言,我不喜欢第一个例子中使用的过滤器;我只是把它放在那里向你展示如何设置过滤器。
我建议使用此过滤器:
http://xss-html-filter.sourceforge.net/
基本上是这样的:
重写cleanXSS
方法以使用从第二个链接下载的内容。所以可能是这样的:
private String cleanXSS(String value) {
return new HTMLInputFilter().filter( input );
}
如果您确实想要允许HTML(例如锚标记/等),那么看起来HTMLInputFilter具有允许这种情况的机制;但它没有记录,所以你必须自己查看代码或提供自己的过滤方法来解决它。
答案 1 :(得分:0)
用户输入的内容安全且省力(我的目标是使用Web应用程序而不是编写一堆与安全相关的代码)。
您需要编写多少与安全相关的代码取决于您有多大的风险(有多少人想要攻击您的网站,这与您网站的受欢迎程度有关)。
例如,如果你写一个公共记事本,总共有3个用户,你可以勉强达到最低限度,如果你的写作我们讨厌中国,伊朗和所有黑客/破解者应用程序处理价值1,000,000美元一小时和30亿用户的交易,你可能会更多的目标。
简单地说,您不应该信任来自应用程序外部的任何数据,包括来自数据存储区的数据。应该检查所有这些数据,这是你所期望的。
我没有针对XSS验证传入的Java字符串,但是删除HTML通常已经足够了,而且Jsoup看起来很有趣(参见Remove HTML tags from a String)
另外要确保您应该确保输出您希望输出的内容而不是某些JavaScript。
答案 2 :(得分:0)
大多数模板引擎,包括django(与App Engine捆绑在一起),提供了逃避输出的功能,使其可以安全地以HTML格式打印。在较新版本的Django中,这是自动完成的,除非你告诉它不要;在0.9.6(仍然是webapp中的默认值)中,您将输出值传递给模板中的|escape
。
在输出上转义通常是执行此操作的最佳方式,因为这意味着您拥有原始未修改的文本;如果您稍后修改了转义或输出格式,您仍然可以格式化之前输入的文本。
答案 3 :(得分:0)
您还可以使用代理所有连接并阻止任何XSS尝试的服务。我只知道一个这样的服务 - CloudFlare(但这并不意味着没有其他类似的服务)。不幸的是,安全功能与Pro计划有关:(