几乎所有大厂都会对代码规范有着严格要求,以确保多人协作开发出来的代码质量有统一的标准。在Java开发领域,《阿里巴巴Java开发手册》被开发者们广泛学习和应用。原手册内容较多,本文仅列出代码安全方面需要重点注意的事项(强制遵守的规则),并分析规定背后的原因,所谓知其然,亦知其所以然。
1. 隶属于用户个人的页面或者功能必须进行权限控制校验。
说明:防止没有做水平权限校验就可随意访问、修改、删除别人的数据,比如查看他人的私信内容、修改他人的订单。
2. 用户敏感数据禁止直接展示,必须对展示数据进行脱敏。
说明:查看个人手机号码会显示成:158****9119,隐藏中间 4 位,防止隐私泄露。
3. 用户输入的 SQL 参数严格使用参数绑定或者 METADATA 字段值限定,防止 SQL 注入,禁止字符串拼接 SQL 访问数据库。
说明:元数据(MetaData),即定义数据的数据。这条规则的意思就是用户输入的参数要遵守参数绑定或者数据字段的类型,对用户输入的内容进行严格的校验,从而避免SQL注入的问题。
4. 用户请求传入的任何参数必须做有效性验证。
说明:忽略参数校验可能会导致以下问题:
- page size 过大导致内存溢出
- 恶意 order by 导致数据库慢查询
- 任意重定向
- SQL 注入
- 反序列化注入
- 正则输入源串拒绝服务 ReDoS
说明:Java 代码用正则来验证客户端的输入,有些正则写法验证普通用户输入没有问题,但是如果攻击人员使用的是特殊构造的字符串来验证,有可能导致死循环的结果。
ReDoS(regular expression denial of service)这一项是指当正则表达式写得不完美的时候,就有可能被恶意输入和利用,从而消耗大量的服务器资源,造成拒绝服务(DoS:Denial of Service)。
5. 禁止向 HTML 页面输出未经安全过滤或未正确转义的用户数据。
6. 表单、AJAX 提交必须执行 CSRF 安全过滤。
说明:CSRF(Cross-site request forgery)跨站请求伪造是一类常见编程漏洞。对于存在CSRF 漏洞的应用/网站,攻击者可以事先构造好 URL,只要受害者用户一访问,后台便在用户不知情情况下对数据库中用户参数进行相应修改。
7. 在使用平台资源,譬如短信、邮件、电话、下单、支付,必须实现正确的防重放限制,如数量限制、疲劳度控制、验证码校验,避免被滥刷、资损。
说明:比如用户注册时一般要发送验证码到手机,如果没有限制次数和频率,那么攻击者可以利用此功能骚扰到其它用户,并造成短信平台资源浪费。