安全规范

来源:互联网 发布:考试答案软件 编辑:程序博客网 时间:2024/05/11 04:26

安全编码定义了一套可以集成到开发生命周期中的通用软件安全编码规范。采用这些规范将减少最为常见的安全漏洞,也可以作为在代码review时安全checklist名单。
一、输入验证
认为所有客户端传输的数据皆不可信,验证所有来自客户端的数据,包括:
所有请求参数
URL
HTTP 头信息(比如:cookie 名字和数据值)
环境信息
上传文件
验证正确的数据类型,数据范围,数据长度,数据格式
尽可能采用白名单和正则表达形式,验证所有的输入
丢弃任何没有通过输入验证的数据,不允许在程序里直接使用SERVER,_GET, POST,_COOKIE, FILES,_ENV, $REQUEST获取外部数据
文件的路径与名称的过滤:
文件名中不能包含二进制数据,否则可能引起问题。同时需要限定文件名的长度。
虽然Unix系统几乎可以在文件名设定中使用任何符号,但是应当尽量使用 - 和 _ 避免使用其他字符。
一些系统允许Unicode多字节编码的文件名,但是尽量避免,应当使用ASCII的字符。
如果用户不需要知道存储的文件名。建议使用md5或者其他方式重命名文件名指定文件后缀。
不建议只使用转义,使用转义必须有其他控制手段,转义函数可以参考htmlentities,htmlspecialchars
如果任何潜在的危险字符必须被作为输入,请确保您执行了额外的控制,比如:输入转义、输出编码、特定的安全 API、以及在应用程序中使用的原因。部分常见的危险字符包括:< > ” ’ % ( ) & + \ \’ \” 。
二、访问控制
除了那些特定设为“公开”的内容以外,对所有的网页和资源要求身份验证。
对资源获取的时候都需要判断是不是该用户能操作和获取的。避免越权和全面遍历。
对操作和浏览尽量小的权限,提升权限的时候需要进一步验证。
对于有流程限制的操作,注意限制跨步提交。
当设计外网访问API接口时应注意:
防止请求内容篡改和伪造
防止请求内容被重放攻击
确保请求是由应用方所发起
尽可能使用HTTPS传输
如果只有以上几点可以使用phplib里封装的security/api组件
当设计JS或者客户端请求接口时应注意:
校验请求refer,不仅有域限制,而且要严格限制请求发起地址
关键数据变更可以使用验证安全token,可以考虑验证码
在关键位置要做防止暴力尝试控制,比如:注册登录下订单操作
使用频率控制器,限制尝试次数
使用验证码区别人机
在做HEADER跳转时,url的地址不能是外界传入,尽量控制是本域跳转。如果必须用户传入跳转地址,添加一个用户不可控的随机值参数,如果验证成功则直接跳转,验证失败进行跳转提示(参考google)
管理系统等内部系统,务必处于内网保护下。禁止公网一切访问。
三、数据保护
对隐私和主要机密信息,在存储设备上应该做加密处理,用来验证的信息使用散列函数求值存储(比如密码),用来获取的信息使用对称加密算法AES处理(比如手机号身份证号码)。
对数据采用一定的措施降低泄露后威胁程度,比如(给身份证图片添加无法擦除水印,避免用于其他用途)。
限制只有授权的行为才能访问隐私和主要机密信息,比如(文件系统设置为私有不对外公开,每次获取需要授权,可以参考oss)。
不要在客户端上以明文形式或其他非加密安全模式保存密码、连接字符串或其他敏感信息。 这包括嵌入在不安全的形式中:MS viewstate、Adobe flash 或者已编译的代码。
包含敏感信息的数据传输的采用加密传输比如(用户账户密码提交)。

四、关闭的服务
线上WEB服务器禁用 PHP以下命令:system,passthru,shell_exec,exec,popen,phpinfo,proc_close,proc_open,dl,show_source,get_cfg_var,如果需要执行单独申请。
错误日志及调试信息,禁止线上打印输出一切无关信息,关闭错误直接输出。禁止线上直接file_put_contents。
线上数据库只提供select,update,delete,insert功能,默认禁止建表,删表,清空表操作。
禁止私自开启 对外socket端口服务,需要和运维商讨添加安全策略。

0 0