当前位置: 首页 > 后端技术 > PHP

Web安全开发规范手册V1.0

时间:2023-03-29 14:06:35 PHP

1、后台团队最近频繁受到网络攻击,引起了技术总监的注意。制定自查清单,我想应该有很多读者需要,所以分享一下。2.编码安全2.1输入验证说明检查项概述任何来自客户端的数据,如URL和参数、HTTP头、Javascript或其他嵌入代码提交的信息,都是不可信数据。在应用程序的外部边界或每个组件或功能边界内,它被用作潜在的恶意输入来验证白名单。不可信数据可设置白名单验证。所有符合白名单的数据都应该被接受和阻止。其他数据黑名单当不可信数据包含错误的输入字符,如空字节(%00)、换行符(%0d、%0a、r、n)、路径字符(../或..)等时,它是推荐直接Block数据。如果需要接受数据,需要做不同的清洗方式来规范对不可信数据的清洗和验证,比如将目录遍历(./or)等相对路径转换为绝对路径URL解码等。并执行各种净化过程,恶意字符应该被完全删除,只留下已知的安全字符,或者在处理之前对它们进行适当的编码或“转义”,例如在数据输出到应用程序页面时。其HTML编码可以防止脚本攻击和合法性验证。不可信数据的合法性验证包括:数据类型,如字符、数字、日期等特征;操作前建议使用正角参数化查询,避免SQL注入文件校验。当不可信数据为解压文件时,如果文件位于服务目录之外或文件大小超过限制,则应拒绝处理。访问控制不可信数据通过上述校验后,还需要确认提交的内容是否与用户身份匹配,避免未授权访问2.2输出校验指令检查项概述考虑到目标编译器的安全性,所有输出字符均正确encoded编码场景不可信数据输出到前后端页面时,会根据输出场景进行编码,比如HTML实体编码,UR编码。净化场景针对操作系统命令、SQL和LDAP查询,净化所有输出的敏感信息,如银行卡、手机号、系统信息等。2.3SQL注入说明检查项概述在用户输入进入SQL操作之前应用程序,检查输入的有效性。参数化处理使用参数化查询(PHP使用PDO,Java使用PreparedStatement,C#使用Sqlparameter)的方法对"等敏感字符进行转义,然后进行SQL操作。最小权限为每个应用配置最小的数据库操作权限,禁止以管理员权限操作数据库,限制操作连接数。敏感数据加密敏感信息通过加密、哈希或混淆等方式保密存储,降低可能存在的漏洞导致数据泄露的风险。禁止错误回显,禁止系统在异常发生时开启Debug模式或返回包含敏感信息的提示。推荐使用自定义的错误信息模板异常信息应保存在日志中以供安全审计2.4XSS跨站描述校验项输入验证对输入数据进行过滤和转义,包括但不限于<>"9%0&+V"等危险的特殊字符输出编码输入数据输出到不同的场景针对不同的编码形式,比如输出到HTML标签,输出到URL时进行HTML编码,输出到JS时进行URL编码,Script编码输出到JS时,输出到InStylet时,进行了css编码。2.5XMLInjection说明InspectionItemInputVerification在引用XML文档内部或外部数据时,过滤用户提交的参数,如<、>&等特殊字符。禁止加载外部实体,禁止报错。输出编码建议对XML元素属性或内容进行输出转义。2.6CSRF跨站请求伪造描述CheckitemTokenuse在重要操作的形式中添加一个session-generatedToken字段。服务器检查此字段以进行二次验证。提交关键表单时,需要用户进行密码、图片验证码、短信验证码等二次认证。Referer验证是检查用户请求中的Referer:字段是否存在跨域提交。,逻辑安全3.1认证描述检查项概述所有对非公开网页和资源的访问都必须在后端服务上执行标准和通用的认证过程以提交凭据。用户凭据必须加密并以POST方式提交。推荐使用HTPS协议加密通道和认证服务器错误提示,安全处理身份验证失败,如使用“用户名或密码错误”提示失败,防止信息泄露过多。猜测措施(使用泄露的密码字典进行批量登录),多次验证失败自动开启图灵测试,关键操作时自动开启账号锁定机制限制二次验证(如当账号密码修改、数据更新、交易支付等),先启动图灵测试,然后对用户身份进行二次验证。交易支付过程也应形成完整的证据链。交易数据应由发起方进行数字签名以进行多因素验证。对于高度敏感或核心业务系统,建议使用多因素认证机制,如短信验证码、软硬件令牌等。3.2短信验证说明检查项目验证码生成复杂度至少为6位数字或字母,一次使用一个,建议有效期不超过180秒。验证码限制前后端设置用户获取频率为每60秒一次。建议每个用户每天最多接收10条短信。添加安全提示:至少包括本次操作的功能、验证码发送号码、是否被个人风险信息操作。凭证验证禁止在响应中返回验证码,服务器同时验证密码、短信验证码等凭证信息,防止多级认证绕过漏洞。3.3图灵测试表明校验项的验证码生成复杂度至少为4位数字或字母,或使用拼图等验证方式,一次使用一个,建议有效期不超过180秒.为了在用户输错一次密码后自动弹出验证码输入框,verification验证码验证禁止在响应中返回验证码,需要在服务端进行验证码验证。满足8个及以上字符长度要求,包括大小写字母、数字、特殊字符。用户密码设置必须通过后台验证,不允许设置不符合复杂性要求的密码。密码存储在存储用户密码时,需要使用哈希算法(如SHA1)计算出用户密码的摘要值和一个唯一的随机盐值(Salt)来保存摘要值和Sat值。建议在用户更改密码时将这两个值分开存放,修改操作需要通过手机号或邮箱进行身份验证。修改密码时,无论是否为用户自行操作,均应以短信或邮件方式通知用户,并告知用户存在安全隐患。密码找回用户密码找回时,后台需要对注册的手机号或邮箱进行二次验证,并将验证码和验证链接发送到预先注册的地址,并设置有效期以防止蛮力破解。对于保密问题,应尽可能支持随机提问。在多次验证操作中,需要对验证机制进行梳理,防止跳过上一步验证机制,直接进入最后一步验证的安全隐患。密码使用应用开发中禁止设置万能密码、硬编码明文密码、使用数据库管理。用户账号操作,不同用户公共账号操作,或者输出密码到日志文件或者控制台。3.5会话安全说明检查项防止会话劫持应用程序在进行身份验证时,建议持续使用HTTPS连接,认证站点使用HTTPS协议。如果连接从HTTP跳转到HTTPS以防止会话劫持,则需要重新生成会话标识符。禁止在HTTP和HTTPS之间来回切换,可能导致会话被劫持。安全设置会话标识符时,正确设置“Httponly'属性(禁止程序加5个脚本等读取Cookie信息)”Secure'属性(禁止Cookie安全设置防止cookie通过HTTP连接传递给服务器进行验证);“Domain”属性(跨域访问时可以指定的授权访问域名),“Path”属性(授权访问的目录路径)。Cookie安全设置会话标识符应该放在HTP或HTPS协议的安全头信息中。禁止传递GET参数,在错误信息和日志中记录会话标识,防止CSRF攻击。服务器实现了完善的会话管理机制,确保每个CSRF请求都进行合法的认证和权限控制,防止跨站请求伪造(CSRF)漏洞的攻击。会话的有效期应在平衡风险和功能需求的基础上设置。周期性地生成新的会话标识符,并使之前会话的会话生存期标识符失效,可以降低由于原始会话标识符被盗而导致会话劫持的风险。会话注销功能适用于所有受认证保护的网页。用户会话注销后,应立即清除会话相关信息,并终止相关会话连接。代码分离服务器根据会话标识进行访问控制管理。控制管理限制只有授权用户访问受保护的URL、文件、服务、应用程序数据、配置、直接对象引用等接口管理限制只有授权的外部应用程序或接口访问受保护的本地程序或资源等权限更改当权限变更,记录日志,告知用户是否为自己操作,并告知存在的安全风险有效性检查上传文件时,服务器端检查文件属性是否合法,以及文档类型(如文件的帖子名称、文件头信息检查等)和大小(图像检查长、宽和像素等)。在存储环境设置中保存文件时,将文件保存在独立于应用环境的文件服务器中(配置独立的域名),保存目录的权限设置为不可执行。named,禁止将保存的路径信息返回给客户端。文件访问设置下载文件时,应以二进制形式下载。建议不提供直接访问(防止直接执行木马文件)3.8接口安全说明检查项网络限制调用者网络限制,如通过防火墙、hosts、Nginxdeny技术等措施进行验证。身份认证调用者身份认证,如密钥、秘密、证书等技术措施进行验证,禁止共享凭证完整性验证调用数据的安全性,使用SHA1等摘要运算对所有参数进行数字签名,识别被篡改数据的合法性校验验证调用的参数,比如参数是否完整,时间戳和Token是否有效,调用权限是否合法等。可用性要求调用服务需求,调用满足幂等性,即保持数据一致性,并限制调用频率和有效期。处理调用的异常处理,实时检测调用行为,发现异常及时阻断。4.数据安全4.1敏感信息描述检查项敏感信息传输传输敏感信息时,禁止在GET请求参数中包含敏感信息,如用户名、密码、卡号等。所有敏感信息推荐TSL加密传输。客户端保存敏感信息时,禁用表单自动填写功能,敏感信息以明文保存。服务器在保存敏感信息时,禁止在程序中硬编码敏感信息,以明文方式存储用户密码和身份。护照号、银行卡号、持卡人姓名等敏感信息,敏感数据临时写入内存或文件,应及时清除释放敏感信息维护维护敏感信息时,禁止上传源码或SQL库打开源平台或社区,如Github、开源中国等。敏感信息展示展示敏感信息时,如果展示在网页上,需要在后台服务器对敏感字段进行脱敏处理。4.2日志规范说明校验项记录原则保证日志记录包含重要的应用事件,但禁止保存敏感信息,如会话标识、账户密码、证书等事件类型,以记录所有的认证、访问操作、数据更改、关键操作、管理功能、注销记录等事件。事件请求日志通常记录每个事件发生的时间、发出请求的IP地址以及用户帐户(如果已通过身份验证)。日志保护日志受到严格保护,防止未经授权的读取或写入访问。4.3异常处理说明检查项容错机制应包括应用程序实现时的try-catch块等功能完备的异常捕获机制。典型位置:文件、网络、数据库、命令操作等。一旦发生异常,日志中应完整记录异常发生的时间、代码位置、错误详情、可能触发错误的用户等。重要系统出现严重异常应有报警机制,及时通知系统操作人员排查和修复问题。定义错误消息在生产环境中,应用程序不应在其响应中返回任何系统生成的消息或其他调试信息,配置应用程序服务器以自定义方式处理未处理的应用程序错误,并返回自定义错误消息隐藏用户信息禁止泄露系统异常时的用户隐私信息,通常包括:身份信息、个人地址、电话号码、银行账号、通讯记录、位置信息等。隐藏系统信息禁止在系统异常时泄露系统敏感信息(用户账号及密码、系统开发秘钥、系统源代码、应用架构、系统帐号密码、网络拓扑结构等)。异常状态恢复方法发生异常时,应将对象状态恢复到之前的状态,如业务操作失败时的回滚操作,对象修改失败时应恢复对象的原始状态,从而保持对象状态的一致性五、主机安全5.1I/O操作指令检查项共享环境文件安全在多用户系统中创建文件时,应指定适当的访问权限,以防止未经授权的文件访问。共享目录下文件的读/写/可执行权限应该使用白名单机制。实现最小授权。数据访问检查防止封装的数据对象被未经授权使用,并设置合理的数据缓冲区大小以防止系统资源耗尽。应用程序运行过程中创建的应用文件处理文件需要设置访问权限(读、写、执行),及时删除临时文件5.2运行环境说明检查项尽量减少开放端口关闭运行不需要的端口和服务系统后台服务管理后台(如数据缓存和存储、监控、业务管理等)限制内网访问,对公网开放的必须设置鉴权和访问控制。环境配置采用安全稳定的操作系统版本、Web服务器软件的各种应用框架、数据库组件等敏感代码处理。将客户端敏感代码(如软件包签名、用户名密码验证等)放在包中防篡改等软件中。关闭调试通道生产代码不包含任何调试代码或接口通信安全配置网站HTTPS证书或其他加密传输措施。6.书籍推荐如果您对作者的文章更感兴趣,可以关注作者的新书《PHP Web安全开发实战》,现已在各大平台发售。封面如下图所示