#安全准则##开发原则与注意事项 本文档总结了小程序开发中一些常见的安全风险与漏洞,帮助开发者在开发过程中发现并修复相关漏洞,避免上线后对业务和数据造成损失。 开发者在开发过程中需遵循以下原则: 1、互不信任原则。不信任用户提交的数据,包括第三方系统提供的数据,必要的数据验证必须放在后台验证。 2、最小权限原则。代码、模块等只具有能完成任务的最小权限,不授予不必要的权限。 3、禁止明文保存用户敏感数据。 4、小程序代码(不包括云函数代码)与传统Web应用的前端代码类似,可以被外部获取并反混淆,重要的业务逻辑应放在后台代码或云函数中。 5、后端接口调用、云函数调用均需进行有效的身份认证。 ##通用### 接口鉴权 接口鉴权是指在调用后端接口(包括自建后端接口和云函数)时,需要对当前接口调用进行权限验证,否则容易越权。例如商品删除接口,后端在接收到请求时要验证调用者的身份信息(如IP地址、开发者定义的登录信息等),只有指定用户验证通过后才能进行删除。 越权访问通常分为平行越权访问和垂直越权访问: * 平行越权访问 平行越权访问是指同一角色之间的越权访问,A1和A2均为普通用户,A1通过请求后端接口.php?id=A1获取用户A1自身的信息,如果.php不做权限验证,用户A1可以通过将请求改为.php?id=A2来获取用户A2的信息,导致用户A2的信息泄露。
* 垂直越权 垂直越权是指不同角色之间的越权。B1为管理员,B2为普通用户,管理员B1通过请求后台接口.php可以获取所有注册用户的信息。如果.php不做权限验证,用户B2也可以请求.php获取所有注册用户的信息,这就导致了越权。 开发建议:1.敏感数据、能力相关接口需要在后台进行鉴权,通常可以验证IP地址、自定义登录态等信息。2.鉴权逻辑应该放在后台进行,不应该通过在小程序前端隐藏页面、隐藏按钮等方式来代替。 参考原理4。 三、认证代码示例(仅供参考) 1、自建后端认证~~~ (){$ = $[""];$ = $[""];$ip = $[''];$ = $[""];if ($ === "xxx" &&$ip === "192.168.0.101" &&$ === "") {//执行删除操作// ... 0;} else {//记录非法请求// ... -1;}}~~~2、云函数接口认证~~~.main = (, ) => { { , , } = .();if ( === "xxx") {//执行删除操作// ... } else {//记录非法请求// ...}}~~~### 代码管理与泄露 1、使用git、svn等版本管理工具时,会生成.git等目录。
部分编辑器或软件在运行过程中也会生成临时文件,如果将这些目录或文件带到生产环境,可能会发生源代码泄露。2. 使用[小程序代码管理平台](#)或其他第三方平台时,需要注意项目权限,不要泄露敏感或内部项目。开发建议:1. 不要将备份文件、版本管理工具生成的文件同步到 Web 目录。2. 禁止.git 等目录和文件被外部访问。3. 在[小程序代码管理平台](#)等管理平台中配置适当的访问权限。 ##小程序### 信息泄露 敏感信息是指一旦泄露可能对开发者的业务、合作伙伴和用户造成危害的数据,包括但不限于**账号、特权账号信息、后台加密密钥、登录账号密码、用户身份证号、手机号、银行卡号等。** 开发建议: 1.敏感信息不应以纯文本、评论、可逆的编码方式(如)、不安全的哈希函数(如MD5、SHA1)等形式出现在小程序文件中。 2.部分敏感信息如用户的银行卡号、手机号等需要显示,需要进行脱敏处理,常见脱敏规范如下: | 敏感信息类型 | 显示示例 || --- | --- || 名称 | 名称只有两个字符,第一个字符经过编码,如:\*。
若超过两个字符则只保留首末字符,其余进行编码,如:王\*四、欧\*\*五|| 身份证| 只显示首末位数字,如:3\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*1 || 手机号码| 去掉手机国际码后,手机号码若不少于10位,则只显示前三位和后两位,如:156\*\*\*\*\*\*77,手机号码不足10位,则只显示首末两位,如:12\*\*\*\*\*89,国家代码可完整显示。|| 银行卡| 只显示后4位,如:\*\*\*\*\*\*\*\*\*\*\*\*\*1234|3.若小程序存在敏感信息泄露问题,微信开放平台可能会下架该小程序,并暂停小程序相关服务。##后端(包括云函数和自建后端)###注入漏洞注入漏洞(SQL、命令等)通常是指用户绕过后端代码的限制,直接在数据库执行自定义代码。常见的注入漏洞包括:####SQL注入SQL注入是指Web程序代码没有进行有效过滤就直接将用户提交的参数拼接到SQL语句中,导致参数中出现特殊字符破坏了SQL语句原有的逻辑。黑客可以利用此漏洞执行任意SQL语句。
**开发建议:** 1、使用数据库提供的参数化查询进行数据库操作,不允许直接通过拼接字符串的方式合成SQL语句。 2、如果有些情况需要通过拼接的方式合成SQL,那么拼接后的变量需要进行处理: 对于整型,需要判断变量是否是整型。 对于字符串,单引号、双引号等需要进行转义。 3、避免Web应用显示SQL错误信息。 4、确保Web应用中各个数据层的编码统一。 #### 命令注入 命令注入漏洞是指Web应用没有对用户可控制的参数进行有效过滤,攻击者可以构造恶意的参数,拼接到命令中,从而执行任意命令。 **开发建议:** * 对用户输入的数据进行过滤或转义(如;、|、&等)。 ### 弱密码 弱密码是指管理后台的用户名和密码设置的比较简单或者使用默认账号。 攻击者可以通过登录这些账号,修改后台数据或者进行下一步入侵。 **开发建议:** 1、禁用后台服务默认账号,修改后台弱密码。 2、对敏感服务增加二次验证机制,例如短信验证码、邮箱验证码等。 ### 文件上传漏洞 文件上传漏洞是指Web应用允许用户上传指定的文件,但是却没有对文件类型和格式做合法性验证,导致上传的文件为非预期格式。
**开发建议:** * 正确解析上传文件的文件类型,通过白名单限制可以上传的文件类型。 ### 文件下载 文件下载漏洞是指Web应用允许用户通过指定路径和文件名来下载相应文件,但是没有正确限制可下载文件所在的目录范围,导致预期范围外的文件下载泄露。 **开发建议:** 1、正确限制可下载文件所在的目录范围 2、通过指定文件id找到对应文件下载### 目录遍历 目录遍历是指由于用户输入验证不充分或者后台服务配置不严导致的服务器目录内容泄露,外部方可能通过目录遍历获取系统文件、后台代码等敏感文件。 **开发建议:** 1.Web服务配置 1.服务器禁止显示目录 2.设置目录访问权限 3.每个目录下放置一个空的.html页面 2.Web应用代码严格检查文件路径参数,限制文件范围### 条件竞争 条件竞争的常见例子是攻击者利用并发请求,实现多次获奖,多次收获,多次赠送等通过异常逻辑可触发的效果。 *漏洞代码示例~~~//从DB中查询用户剩余的奖励数量,初始值为1int = ();if( > 0){();//用户获得奖励();//将DB中用户剩余的奖励数量重置为零}~~~开发人员的设计是让用户只能获得一次奖励,但是当并发请求发生时,有可能请求A和请求B都刚刚执行完第二行代码。 此时两个请求的\都是1,通过第四行代码的判断,代表用户可以获得两次奖励。 **开发建议:** * 锁定关键(完成)逻辑或者将关键逻辑作为队列任务处理。