我们的开发一般不太关注安全功能,只关注业务功能。所以,很多应用系统对输入验证考虑较少。
一、站在安全的角度来说,应当对所有输入来源进行严格的验证,这是防范各种安全攻击(如SQL注入、跨站脚本攻击XSS、跨站请求伪造CSRF等)的基础。特别是当输入来源不在可信任的范围之内时,验证变得尤为重要。以下是一些关键的输入来源,它们尤其需要仔细验证:
用户输入:
-
网页表单提交的数据(如用户注册、登录信息、搜索查询等)。
-
用户通过API提交的数据。
-
用户上传的文件(包括图片、文档、代码等)。
-
用户的URL参数和查询字符串。
第三方数据:
-
从其他系统或API获取的数据,即使这些数据在源头进行了验证,也可能在传输过程中被篡改。
-
用户通过OAuth、OpenID等第三方身份验证服务登录时传递的数据。
-
合作伙伴或供应商提供的数据。
-
环境变量和配置参数:
-
应用程序可能从环境变量或配置文件中读取敏感信息(如数据库连接字符串、API密钥等),这些也需要验证其来源和格式。
-
应用程序配置中的动态部分,如根据部署环境变化的设置。
-
未经验证的HTTP请求头:如User-Agent、Referer等,这些头信息可能被用于跟踪用户或误导系统行为。
-
自定义的HTTP请求头,它们可能包含未预期的数据或格式。
系统生成的输入:
-
虽然系统生成的输入通常被认为是可信的,但在某些情况下(如系统被黑客控制时),这些输入也可能包含恶意内容。
-
特别是当系统生成的数据被用于数据库查询、文件路径生成或命令执行时,应特别小心。
为了有效验证这些输入,可以采取以下措施:
-
白名单验证:只允许符合特定格式或范围的输入通过。
-
转义和编码:对输入数据进行适当的转义或编码,以防止其被解释为代码执行。
-
使用安全的库和框架:选择经过安全审计的库和框架来处理输入,它们通常提供了内置的安全机制。
-
限制输入长度:避免超长输入导致的缓冲区溢出等问题。
-
监控和日志记录:对所有输入进行监控和日志记录,以便在发生安全事件时进行追溯和分析。
通过这些措施,可以大大降低因恶意输入而导致的安全风险。
二、除了上面这个之外,我们还需要将用户身份标识和验证在服务器端进行处理,避免在客户端进行的验证被绕过。
服务器端验证能够防止攻击者通过修改客户端代码或网络请求来绕过验证机制。攻击者可能试图在客户端拦截和修改用户输入的数据,以模拟合法用户的身份。然而,当验证逻辑在服务器端执行时,这些尝试都将失败,因为服务器端会独立地验证用户输入。
服务器端验证一般有如下方式:
-
用户名和密码验证:
-
用户提交用户名和密码到服务器。
-
服务器在数据库中查找对应的用户名和密码,并进行匹配验证。
-
如果匹配成功,则用户身份验证通过;否则,验证失败。
-
访问令牌(Access Token):
-
用户首次登录成功后,服务器生成一个访问令牌并返回给客户端。
-
客户端在后续请求中携带该令牌以证明其身份。
-
服务器验证令牌的有效性,以确定用户身份是否合法。
-
数字证书:
-
在需要高安全性的场景中,可以使用数字证书进行身份验证。
-
客户端向服务器提供数字证书,服务器验证证书的真实性和有效性。
-
如果证书有效,则用户身份验证通过。
三、关键参数应直接从服务器端读取,避免从客户端输入以防止关键参数被篡改。应对输入内容进行规范化处理后再进行验证,如文件路径、URL地址等。
在防止关键参数被篡改并确保应用程序安全性的过程中,采取一系列措施是至关重要的。以下是一些具体的策略和建议:
关键参数的处理
-
直接从服务器端读取:
-
关键参数(如用户权限、敏感配置信息等)应直接从安全可靠的服务器端数据
源读取,避免通过客户端输入获取。这样可以减少参数在传输过程中被篡改的风险。
-
加密传输:
-
如果关键参数必须通过网络传输(例如,在客户端和服务器之间),应使用加密技术(如HTTPS)来保护数据的机密性和完整性。这可以防止攻击者在传输过程中截获或篡改数据。
输入内容的规范化处理
-
输入验证:
-
对所有输入内容进行严格的验证,确保它们符合预期的格式和范围。这包括检查数据类型、长度、允许的字符集等。
-
使用白名单验证方法,只允许符合特定规则的输入通过。
-
规范化处理:
-
在验证之前,对输入内容进行规范化处理,如去除不必要的空格、转换大小写、过滤特殊字符等。这有助于减少因输入格式不一致而导致的验证错误。
-
特定类型的输入处理:
-
对于特定类型的输入(如文件路径、URL地址等),应采取额外的处理措施。例如,对于文件路径,应验证其是否符合预期的格式和访问权限;对于URL地址,应验证其是否指向有效的资源,并防止URL注入攻击。
其他安全措施
-
使用安全的编程语言和框架:
-
选择具有内置安全特性和广泛社区支持的编程语言和框架。这些语言和框架通常提供了丰富的安全工具和库,有助于减少安全漏洞。
-
定期更新和打补丁:
-
定期更新服务器、操作系统、应用程序和所有相关组件的安全补丁。这有助于修复已知的安全漏洞,防止攻击者利用这些漏洞进行攻击。
-
日志记录和监控:
-
对关键操作进行日志记录,并设置监控机制以检测异常行为。这有助于及时发现并响应潜在的安全威胁。
-
访问控制和权限管理:
-
实施严格的访问控制和权限管理策略,确保只有授权用户才能访问敏感数据和执行关键操作。
-
安全教育和培训:
-
对开发人员进行安全教育和培训,提高他们对安全漏洞和攻击手法的认识。这有助于减少因人为疏忽而导致的安全事件。
最后再总结一下,输入验证方便可以考虑这三条:
对所有来源的输入进行验证,按默认所有输入都可能包含恶意信息的原则进行安全检测,只要其来源不在可信任的范围之内,就更应对输入来源进行验证 |
用户身份标识和验证应在服务器端进行处理,避免在客户端进行的验证被绕过 |
应对输入内容进行规范化处理后再进行验证,如文件路径、URL地址等 |
应防止关键参数被篡改,关键参数应直接从服务器端读取,避免从客户端输入 |
原文始发于微信公众号(透明魔方):浅谈安全开发之输入验证
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论