2016-08-22 100 views
0

防止储存XSS的最佳方法是什么?XSS预防:客户端还是服务器端?

第一种解决方案的问题是数据可能会被修改(字符编码,部分或全部删除...)。这可以改变应用程序的行为,尤其是对于显示问题。

+0

安全性在层中最好,所以两者都是最好的,然后是最好的。顺便说一句,这比基于编程的安全性更强,https://security.stackexchange.com可能更适合它。 –

回答

3

您应用禁制当且仅当您的数据需要符合特定格式/标准,你肯定你可以安全地丢弃数据;例如您从电话或信用卡号码中删除所有非数字字符。您总是使用为适当的上下文应用转义,例如,将用户提供的数据放入HTML时对其进行HTML编码。

大多数时候你不想清理,因为你想明确地允许自由形式的数据输入和禁止某些字符,这是毫无意义的。我在这里看到的少数几个例外之一是,如果您接受来自用户的HTML输入,则需要清理HTML以过滤不需要的标记和属性,并确保语法有效;但是,您可能希望将未经处理的原始版本存储在数据库中,并仅在输出中应用此限制。

+0

它应该是“除非你想允许自由形式的数据输入,否则大多数时候你都想要消毒,所以应该总是应用消毒。 – Andy

0

安全的黄金标准是:验证您的输入,并编码,而不是消毒您的输出。

首先验证输入服务器端。一个很好的例子就是用户配置文件中的电话号码字段。电话号码应该只包含数字,破折号,也许还有一个+。那么为什么让用户提交字母,特殊字符等呢?它只会增加攻击面。因此,尽可能严格验证该字段,并拒绝错误的输入。

其次,根据输出上下文对输出进行编码。我建议在服务器端做这个步骤,但只要您使用的是经过良好测试的良好前端框架,在客户端执行相对安全。卫生处理的主要问题是不同的环境对安全有不同的要求。要在将用户数据注入到HTML属性中时直接阻止XSS到页面或脚本标记中,您需要做不同的事情。因此,您可以根据输出上下文创建特定的输出编码器。实体编码用于HTML上下文,用于脚本上下文的JSON.stringify等。