内容选自《Web应用安全权威指南》第4章,人民邮电出版社,[日]德丸浩著,赵文等译。
XSS
定义
通常情况下,在web应用的网页中,有些部分的显示内容会依据外界输入值而发生变化,而如果生成这些 HTML 的程序中存在问题,就会滋生名为跨站脚本的安全隐患。
风险
- 用户的浏览器中运行攻击者的恶意脚本,从而导致 Cookie 信息被窃取,用户身份被冒名顶替;
- 攻击者能获得用户的权限来恶意使用 web 应用的功能;
- 响应用户显示伪造的输入表单,通过钓鱼式攻击窃取用户的个人信息。
防范策略
- 输入校验。长度限制、值类型是否正确、是否包含特殊字符(如<>'”等)。其实校验是对数据无害的,满足就放行,不满足就阻止。这个过程一般不建议进行任何过滤操作,这样能保证数据的原生态。
- 输出编码。页面显示时将 HTML 中含有特殊意义的字符(即,元字符)转义。根据输出的位置进行相应的编码,如 HTML 编码、JavaScript 编码、URL 编码。原则就是,该数据不要超出自己所在的区域,也不要被当作指令执行。
SQL 注入
定义
SQL 注入漏洞是由于 SQL 语句的调用方法不完善而产生的安全隐患。
风险
以下影响中攻击者都能够直接对服务器实施主动攻击,而不需要用户的参与。也就是说,SQL 注入漏洞是发生在服务器端的。
- 数据库内的信息全部被外界窃取;
- 数据库中的内容被篡改;
- 登录认证被绕过(应用程序登录不需要用户名和密码);
- 其他,例如服务器上的文件被读取或修改、服务器上的程序被执行等;
- 根据数据库引擎的不同,通过 SQL 注入攻击还可以执行 OS 命令、读取文件、编辑文件、通过 HTTP 请求攻击其他服务器等。
防范策略
产生 SQL 注入漏洞的根本原因为,被指定为参数的字符串的一部分被排除出字面量,导致 SQL 语句发生了变化。因此,要防范 SQL 注入漏洞,就必须防止 SQL 语句在拼接过程中被更改。具体可采取如下两种方法:
- 使用占位符拼接 SQL 语句(推荐);
- 在应用程序中拼接 SQL 语句时,要确保字面量被正确处理,SQL 语句不被更改(实施非常困难)。
此外,还有一些辅助性对策:
- 不显示详细的错误消息;
- 校验输入值的有效性;
- 设置数据库权限。
CSRF
定义
在执行关键处理前,需要确认该请求是否确实由用户自愿发起。如果忽略了这个确认步骤,就可能出现很大问题,比如用户只是浏览了恶意网站,浏览器就擅自执行关键处理等。引发上述问题的安全隐患被称为跨站请求漏洞,而针对 CSRF 漏洞进行的攻击就是 CSRF 攻击。
风险
Web 应用存在 CSRF 漏洞时就可能会遭受如下攻击:
- 使用用户的账号购物;
- 删除用户账号;
- 使用用户的账号发布帖子;
- 更改用户的密码或邮箱地址等。
CSRF 漏洞造成的影响仅限于应用的关键处理被恶意使用,而像用户的个人信息等就无法通过 CSRF 攻击窃取。
防范策略
为了预防 CSRF 漏洞,就需要在执行关键处理前确认请求确实是由用户自愿发起的。
筛选出需要防范 CSRF 攻击的页面
- 在需求分析阶段制作功能一览表,标记出需要执行 CSRF 防范策略的功能;
- 在概要设计阶段制作页面跳转图,标记出需要执行 CSRF 防范策略的页面;
- 在开发阶段实施 CSRF 防范策略。
使代码有能力辨认是否是正规用户的自愿请求
- 嵌入机密信息(令牌);
- 再次输入密码;
- 检验 Referer。