Skip to content

第 4 章 安全规约

“安全生产,责任重于泰山。”这句话同样适用于软件生产场景中。本章主要说明编程中需要注意的安全准则。

  1. 【强制】 隶属于用户个人的页面或功能必须进行权限控制校验。

    说明

    说明:防止没有做水平权限校验就可随意访问、修改、删除别人的数据,比如查看他人的私信内容。

  2. 【强制】 用户敏感数据禁止直接展示,必须对展示数据进行脱敏处理。

    正例

    中国大陆个人手机号码显示为 139****1219,隐藏中间 4 位,以防止隐私泄露。

  3. 【强制】 用户输入的 SQL 参数必须严格使用参数绑定或 METADATA 字段值限定,防止 SQL 注入,禁止使用字符串拼接 SQL 访问数据库。

    反例

    某系统签名被大量恶意修改,因未对危险字符 #-- 进行转义,导致数据库更新时 where 后的信息被注释掉,结果对全库进行了更新。

  4. 【强制】 用户请求传入的任何参数必须进行有效性验证。

    说明

    忽略参数校验可能导致以下问题:

    • 页面 page size 过大导致内存溢出
    • 恶意 order by 导致数据库慢查询
    • 缓存击穿
    • SSRF(服务器端请求伪造)
    • 任意重定向
    • SQL 注入,Shell 注入,反序列化注入
    • 正则输入源串拒绝服务(ReDoS)

    扩展

    在 Java 代码中使用正则验证客户端输入时,一些正则表达式对普通用户输入没有问题,但如果攻击者构造特殊字符串来验证,可能导致死循环。

  5. 【强制】 禁止向 HTML 页面输出未经安全过滤或未正确转义的用户数据。

    说明

    此规定旨在防止 XSS(跨站脚本攻击),即攻击者在 Web 页面中插入恶意 HTML 代码,当用户浏览时,嵌入其中 Web 里面的恶意 代码会被执行,,可能导致获取用户 Cookie、钓鱼攻击、获取用户页面数据、蠕虫传播、挂马等危害。

  6. 【强制】 表单和 AJAX 提交必须执行 CSRF 安全验证。

    说明

    CSRF(Cross-site request forgery,跨站请求伪造)是一类常见编程漏洞。对于存在 CSRF 漏洞的应用或网站,攻击者可提前构造 URL,只要受害者用户一访问,后台便在用户不知情的情况下对数据库中用户参数进行相应修改。

  7. 【强制】 URL 外部重定向传入的目标地址必须执行白名单过滤。

    说明

    攻击者可通过恶意构造跳转链接,向受害者发起钓鱼攻击。

  8. 【强制】 在使用平台资源时(如短信、邮件、电话、下单、支付),必须实现正确的防重放机制,如数量限制、疲劳度控制、验证码校验,避免被滥刷导致资损。

    说明

    例如在注册时发送验证码到手机,如果没有限制次数和频率,攻击者可利用此功能骚扰其他用户,并造成短信平台资源浪费。

  9. 【强制】 对于文件上传功能,必须严格检查和控制文件大小和类型。

    说明

    攻击者可能利用上传漏洞上传恶意文件到服务器,并远程执行,从而控制网站服务器。

  10. 【强制】 配置文件中的密码必须加密存储。

  11. 【推荐】 在发贴、评论、发送即时消息等用户输入内容的场景中,必须实现防刷、内容违禁词过滤等风控策略。