校验跨信任边界传递的不可信数据(策略检查数据合法性,含白名单机制等)
格式化字符串时,依然要检验用户输入的合法性,避免可造成系统信息泄露或者拒绝服务
禁止向Java Runtime.exec()方法传递不可信、未净化的数据(当参数中包含空格,双引号,以-或者/符号开头表示一个参数开关时,可能会导致参数注入漏洞),建议如果可以禁止JVM执行外部命令,未知漏洞的危害性会
大大降低,可以大大提高JVM的安全性。
验证路径之前应该先将其标准化为实际路径(特殊的文件名,比如“..”,symbolic links、hard links、shortcuts)
从ZipInputStream提取文件,如果不在程序预期计划的目录之内时,应拒绝将其提取出来,或者将其提取到一个安全的位置
从ZipInputStream提取文件,若解压之后的文件大小超过一定的限制时,必须拒绝将其解压
在处理以前,验证所有来自客户端的数据,包括:所有参数、URL、HTTP头信息(比如:cookie名字和数据值),确定包括了来自 JavaScript、Flash 或其他嵌入代码的post 返回信息
如果任何潜在的危险字符必须被作为输入,请确保您执行了额外的安全控制,比如:输入转义、输出编码、特定的安全 API等。部分常见的危险字符,包含但不限于: < > " ' % ( ) & + \ \' \"
如果您使用的标准验证规则无法验证下面的输入,那么它们需要被单独验证,比如验证空字节 (%00); 验证换行符 (%0d, %0a, \r, \n); 验证路径替代字符“点-点-斜杠”(../或 ..\);如果支持 UTF-8 扩展字符集编码,
验证替代字符: %c0%ae%c0%ae/ (使用规范化验证双编码或其他类型的编码)
严格验证来自重定向输入的数据(一个攻击者可能向重定向的目标直接提交恶意代码,从而避开应用程序逻辑以及在重定向前执行的任何验证)
为每一种输出编码方法采用一个标准的、已通过测试的规则
通过语义输出编码方式,对所有从服务端返回到客户端的数据进行编码。比如HTML编码、URL编码等,编码形式需根据具体的应用场景选择
除非对目标编译器是安全的,否则请对所有字符进行编码
针对 SQL、XML 和 LDAP 查询,语义净化所有不可信数据的输出
禁止在异常中泄露敏感信息(敏感数据的范围应该基于应用场景以及产品威胁分析的结果来确定。典型的敏感数据包括口令、银行账号、个人信息、通讯记录、密钥等)
禁止在异常中泄露应用服务器的指纹信息(如版本,路径,架构)
方法发生异常时要恢复到之前的对象状态(业务操作失败时,进行回滚业务;或者避免去修改对象状态,维持对象状态一致性)
在多用户系统中创建文件时指定合适的访问许可,以防止未授权的文件访问
当一个外部进程通过其输出流对外输出信息或错误时,必须及时清空其输出流,以防止输出流中的缓冲区被耗尽而导致外部进程被阻塞。
白名单控制共享目录操作文件权限,比如读/写/可执行权限
不要使用危险的许可与目标组合(比如不要将AllPermission许可赋予给不信任的代码,不要将ReflectPermission许可和suppressAccessChecks目标组合使用,不要将java.lang.RuntimePermission许可与
createClassLoader目标组合)
不要禁用JVM字节码验证,如果使用的字节码,如class文件被恶意篡改过,将会存在安全风险
建议监控平台不要对互联网开放,仅限于内网环境访问;如果监控平台存在远程执行漏洞,将会给所监控的应用带来安全风险
建议将所有安全敏感代码(例如进行权限控制或者用户名密码校验的代码)都放在一个jar包中
除了那些特定设为“公开”的内容以外,对所有的网页和资源都要求进行身份验证,并正确设计身份验证功能
在任何可能的情况下,建立并使用标准的、已通过安全测试的身份验证服务(比如 C4A)
所有的身份验证控制应当安全的处理未成功的身份验证,比如给出错误模糊提示,隐藏敏感信息
登录入口应具有防止暴力猜解及撞库猜解(利用已泄漏的密码字典进行批量登录尝试)的措施,超过设定失败次数需要启用锁定或图片随机码进行访问限制
采用https post请求方式传输身份验证的凭据信息
身份验证的失败提示信息采用模糊处理,比如可以使用“用户名或密码错误”,而不要使用“用户名错误”或者“密码错误”明确提示。
涉及敏感信息或功能的外部系统连接应配置身份验证功能,并进行有效身份验证控制
在执行关键操作(如个人信息密码修改操作)时,应对用户身份进行再次验证
为高度敏感或重要的交易账户使用多因子身份验证机制,如支付密码、短信验证码等
验证码有效期(建议60s内有效,发短信时进行友好提示)
在前端校验(客户端的校验只能作为辅助手段,很容易被绕过),必须使用服务端代码对输入数据进行最终校验
验证码有效期(10分钟内有效,可根据场景兼容安全和体验灵活设置)
复杂度(4位及以上数字、字母交替),根据需要也可采用当下流行的拖拽验证码或计算值的验证方式
从用户体验和安全角度出发,可设计为当用户输3次错误密码后自动弹出验证码输入框进行验证操作
金融科技SDL安全设计Checklist v1.0
评论0