AJAX安全
简介
本文档将为AJAX安全提供一个起点,希望后面可以根据特性的框架和技术进行合理地更新和扩展
客户端(JavaScript)
使用.innerText 而不是.innerHtml
.innerText通过编码向其传入的字符串,可以预防大部分的XSS问题。
不要使用eval
eval() 方法不可取,永远不要使用它。使用了它就代表着你的设计有问题。
将数据传递个消费者之前,先规范化(即:使用前先编码)
当使用数据构建HTML、脚本、CSS、XML和JSON等数据时,确保考虑到如何以字面意义呈现这些数据, 以保持其逻辑含义。
数据在使用之前应该确保合理地编码以方式注入等问题。
不要依赖客户端逻辑来确保安全
不要忘记用户控制着客户端的逻辑。他们可以通过一些浏览器插件来设置断点,跳过代码,修改值等。永远不要依赖客户端逻辑。
不要依赖客户端的业务逻辑
确保服务端实现了和客户端一样的业务逻辑或者规则,以免客户端逻辑被绕过并做出一些愚蠢、糟糕和昂贵的事情。
避免编写序列化代码
这很难,即使是一个小错误也会导致大的安全问题。已经有很多框架提供了这个功能。
避免动态构建XML或者JSON数据
就像构建HTML或者SQL会硬气XML注入漏洞一样,避免这种情况或者使用一个编码库或者安全的JSON或XML库来确保属性和元素数据安全。
不要向客户端发送机密数据
任何客户端知道的,用户也知道,因此,将机密的信息放在服务端比较好。
不要在客户端进行加密
使用TLS/SSL并且在服务端加密
不要在客户端执行影响安全的逻辑
服务端
使用CSRF保护措施
防止旧浏览器的JSON劫持
参考Angular JS的JSON劫持防御机制,参见JSON Vulnerability Protection
总是让外部原语成为JSON字符串的对象:
可以利用的
1 | [{"object": "inside an array"}] |
不可以利用的
1 | {"object": "not inside an array"} |
同样不可利用的
1 | {"result": [{"object": "inside an array"}]} |
避免写序列化的代码。记住引用类型和值类型的区别
使用一个经过检验的库
服务可以直接被用户调用
用户和AJAX客户端代码一样,可以调用服务端服务。确保服务端校验了输入数据。
避免手动凭借XML或者JSON数据,使用框架
使用安全的框架,不要手工拼接,这可能引起安全问题。
对WebServices使用XML和JSON模式
引用
https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/AJAX_Security_Cheat_Sheet.md