☆软件研发安全规范

1 安全编码原则

  1. 保持简单,程序只实现指定的功能。
  2. 坚持最小权限,把可能造成的危害降到最低。
  3. 默认不信任,采用白名单机制,只放行已知的操作。
  4. 永远不要相信用户的输入,对所有输入进行前台和后台两次检查。

2 常见WEB潜在问题

输入验证:嵌入到查询字符串、表单字段、cookie 和 HTTP 头中的恶意字符串的攻击。这些攻击包括命令执行、跨站点脚本(XSS)、SQL 注入和缓冲区溢出攻击。
身份验证:标识欺骗、密码破解、特权提升和未经授权的访问。
授权验证:访问保密数据或受限数据、篡改数据以及执行未经授权的操作。
配置管理:对管理界面进行未经授权的访问、具有更新配置数据的能力以及对用户帐户和帐户配置文件进行未经授权的访问。
敏感数据:泄露保密信息以及篡改数据。
会话管理:捕捉会话标识符,从而导致会话劫持及标识欺骗。
加密管理:访问保密数据或帐户凭据,或二者均能访问。
参数操作:路径遍历攻击、命令执行以及绕过访问控制机制,从而导致信息泄漏、特权提升和拒绝服务。
异常管理:拒绝服务和敏感的系统级详细信息的泄漏。
审核和记录:不能发现入侵迹象、不能验证用户操作,以及在诊断时出现困难。

3 基本开发安全规范

3.1 跨站点脚本(XSS)防范

XSS的类型:反射型XSS、存储型XSS、DOM型XSS。

跨站点脚本防范的基本原则:

  1. 一切的输入/输出都是有害的,不要信任任何输入/输出数据。
  2. 所有传递过程都不能保障无侵入,执行前、存储前、显示前都要进行“数据清洗”。
  3. 所有的数据校验、处理工作要在前端和服务器端两次进行。
  4. 目前所有的XSS通过com.keegoo.core.util.XSSUtil来过滤。

DOM-based XSS的防范当操作页面中DOM对象的时候,要对其输入的参数进行处理,防止XSS的注入。可采用escape、encodeURI、encodeURIComponent或自定义方法进行处理。示例:

Window.location=encodeURI(”http://www.dhgate.com”);

对输入/输出进行Encode 将输入/输出进行转义成HTML实体编码(ISO 8859-1 Latin1)或其他编码,使得其在浏览器中不可自动执行。

不要在html元素和属性中使用未经转义的不安全内容。如下面的示例:

   
directly in a script 
             
inside an HTML comment 
in an attribute name in a tag name
content
inside UNquoted attribute
content
inside single quoted attribute
content
inside double quoted attribute

3.2 防SQL注入规范

  1. 防SQL注入基本原则:所有用户输入都必须进行合法性校验。所有数据库SQL操作必须参数化
  2. 回收开发人员等操作生产库权限:减少开发人员、非DBA操作生产库的权限;数据库数据查询要有权限分级和审核。
  3. 尽量使用PreparedStatement代替Statement,一方面,在大多数情况下,使用PreparedStatement的性能将优于使用Statement,另外一方面,可以最大限度的减少SQL注入发生的可能行。
  4. 用户提交的数据都应该做合法性校验,避免用户输入‘,““,-,%,#,&,|,@,+等有可能导致SQL注入的危险字符给系统造成危害。

3.3 页面组件安全防范

  1. 页面标签必须关闭,属性值必须加引号。在页面中使用的标签不关闭,属性值不加引号往往成为被攻击点,攻击者很容易的利用这些漏洞进行注入。避免这些漏洞的出现可以提高被攻击的可能。

  2. Form提交方式必须选用POST。Form默认的提交方式是Get,这种方式将表单中数据的按照variable=value的形式,使用“?”添加至Action所指向的URL后面,各个变量之间使用“&”连接。所要传递的信息量除受URL长度限制之外,信息内容都显示暴露。

    在使用Form的时候必须将提交方式置为POST。示例:

  3. 所有的非ASCII字符在URL中传递时都需要按照协商好的编码方式做URL编码。推荐使用encodeURI、encodeURIComponent或者自定义encode实现。encodeURI、encodeURIComponent默认都返回UTF8编码的URL,区别在于encodeURI方法不会对下列字符进行编码: ":"、"/"、";" 和 "?"。而encodeURIComponent则会对这些字符进行编码处理。

  4. 尽量使用对象的innerText,不要使用innerHtml属性。对象的innerText属性默认会对输入的数据进行encode,使得如果数据的数据还有html可执行标记时不会直接执行,而如果使用innerHtml属性的话不会保障。

    
    
    
  5. 输入框设置最大长度、输入数据类型限制。输入框一般是攻击者比较钟意的攻击对象,攻击者可以通过输入框限制不足的弱点进行数据窃取(比如SQL注入)、或者制造迫害(如比XSS)。我们可以通过对输入框最大长度、输入数据类型的限制,从一定程度上防范这样的攻击。我们可以根据实际需求,对一些输入框限定只允许输入字母、数字等。同时对输入的数据长度做限制。

  6. 关闭客户端自动完成功能,减少驻留在客户端数据

  7. 设置/