# safety-specifications

接入微信城市服务,业务方需确保功能安全性。

# 常见安全检查表

XSS

  1. 输入校验:长度限制、值类型是否正确、是否包含特殊字符(如<>’”等)

  2. 输出编码:根据输出的位置进行相应的编码,如 HTML 编码、JavaScript编码、URL编码。

  3. 输出到 HTML 标签之间时,对这些数据进行HTML Entity编码

  4. 输出到 HTML 属性里时,特殊字符编码为&#xHH

  5. 输出到 SCRIPT 里时,对这些数据进行 SCRIPT 编码,除了阿拉伯数字和字母,对其他所有的字符进行编码,只要该字符的 ASCII 码小于256。编码后输出的格式为\xHH

  6. 输出到 Style 属性里时,对这些数据进行 CSS 编码,除了阿拉伯数字和字母,对其他所有的字符进行编码,只要该字符的 ASCII 码小于256。编码后输出的格式为\HH

  7. 输出到HTML URL里时,对这些数据进行 URL 编码,当需要往 HTML 页面中的 URL 里插入不可信数据的时候,需要对其进行 URL 编码

SQL注入

  1. 最佳方式就是使用预编译语句,绑定变量

  2. 检查数据类型

  3. 使用安全函数,例如 php 的mysql_real_escape_string

  4. 从数据库自身来说,应使用最小权限原则,切记不要使用 dba 权限

上传漏洞

  1. 在客户端和服务器端对用户上传的文件名和文件路径等项目分别进行严格的检查,尤其是服务端检测不能少

  2. 服务器端的检查最好使用白名单过滤的方法,比如只允许 jpg 文件上传等

  3. 上传目标路径尽量不在 web 目录下,如果在 web 目录下去掉该目录的可执行权限

  4. 慎用Fckeditorewebeditor等第三方上传组件,历史上曾出现多个漏洞

Struts2

历史上Struts2框架出过多个高危漏洞,这些漏洞足以黑掉一个网站,要尽量使用最新版本

信息泄漏

  1. 线上机器删掉测试页面,例如test.htmlphpinfo.php

  2. 禁掉详细的错误提示

  3. 禁止显示调试信息

  4. 禁止将 svn 相关的文件更新到线上机器,例如.svn/entries

登录安全

  1. 登录页面最好加入验证码

  2. 尽量使用 https 协议

会话安全

公众号开发中通常将 openid 作为用户身份标识,使用 openid 时要将 openid 设置到 cookie 中不要拼接到 URL 中例如http://www.qq.com/getuser?code=aaaaaa

管理页面

Tomcatjbossweblogic等管理页面可以做以下加个方面的安全策略

使用白名单的方式限制可以登录的IP

如果不使用这些管理界面直接删掉

平行权限问题

像订单等场景需要格外注意平行权限问题,例如order?Id=111,是否order?Id=112就可以看到其他的订单。对于这种情况的防御,可以加入校验参数,order?Id=111&sign=hash(字符串常量+id)

支付金额问题

  1. 涉及到微支付的 web 应用一定要严格按照微信支付官方网站的文档设计
  2. 确定用户的支付金额与应付金额是否相等