Skip to content
On this page

WEB 安全

XSS

跨站脚本攻击,通常指黑客通过 HTML注入 篡改网页,插入恶意脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击。

最常见的 XSS 攻击,就是通过读取浏览器的 cookie 对象,从而发起 cookie 劫持 攻击,以达到不用密码登录用户账户的目的。

其攻击的本质是 HTML注入,用户的数据被当成了 HTML 代码的一部分来执行,从而混淆了原有的语义,产生了新的语义。

防御方式

  1. HttpOnly:浏览器将禁止页面的 JavaScript 访问带有 HttpOnly 属性的 cookie

    一个 cookie 的使用过程如下:

    1. 浏览器向服务器发起请求,这时候没有 cookie
    2. 服务器返回时发送 Set-Cookie 头,向客户端浏览器写入 cookie
    3. 在该 cookie 到期前,浏览器访问该域下面的所有页面,都将发送该 cookie
  2. 输入检查:常见的 web 漏洞如 XSS、SQL 注入等,都要求攻击者构造一些特殊字符,这些特殊字符可能是正常用户不会用到的,所以输入检查就有存在的必要了。客户端和服务端都需要进行输入检查——客户端节约服务器资源,服务端避免被攻击者绕过。可以使用成熟的 XSS Filter 库进行检查。

  3. 输出检查:一般来说,除了富文本的输出外,在变量输出到 HTML 页面时,可以使用编码转义的方式来防御 XSS 攻击。

CSRF

跨站点请求伪造,指攻击者伪造用户请求执行某些操作以达到攻击目的。

CSRF 攻击的本质原因是,重要操作的所有参数都是可以被攻击者猜测到的。

防御方式

  1. 验证码:CSRF 攻击的过程,往往是在用户不知情的情况下构造了网络请求,而验证码则强制用户必须与应用进行交互,才能完成最终请求。因此在通常情况下,验证码能够很好地遏制 CSRF 攻击。
  2. Referer Check:常见于“防止图片盗链”,也可以被用来检查请求是否来自合法的“源”(Origin)。其缺陷在于,服务器并非什么时候都能获取到 Referer。
  3. Anti CSRF Token:token 需要足够随机,并且需要同时放在表单和 session 中,提交时服务器验证二者是否一致来判断是否受到 CSRF 攻击。并且表单提交成功后,该 token 应该失效。

点击劫持

点击劫持是一种视觉上的欺骗手段。攻击者使用一个透明的、不可见的 iframe,覆盖在一个网页上,然后诱使用户在该网页上进行操作,此时用户将在不知情的情况下点击透明的 iframe 页面。通过调整 iframe 页面的位置,可以诱使用户恰好点击在 iframe 页面的一些功能按钮上。

与 CSRF 不同的是,点击劫持利用的就是与用户产生交互的页面

防御方式

针对传统的 ClickJacking ,一般是通过禁止跨域的 iframe 来防范。

  1. frame busting:通过写一段 JavaScript 代码,以禁止 iframe 的嵌套,但容易被绕过
  2. X-Frame-Options:HTTP 头,当其值为 DENY 时,浏览器会拒绝当前页面加载任何 iframe 页面;其值为 SAMEORIGIN 时可加载同源域名下的页面;其值为 ALLOW-FROM origin 时,可定义允许加载 iframe 的地址。
  3. 其他:浏览器的“内容安全策略”(Content Security Policy)、安全插件/扩展等

注入攻击

常见的有 SQL注入、CRLF注入、XML注入等。通常是应用违背了数据与代码分离原则导致的结果。

防御方式

  1. 使用预编译语句,绑定变量
  2. 使用安全的存储过程,但要避免使用动态的 SQL 语句
  3. 检查数据类型
  4. 使用安全函数

文件上传漏洞

文件上传漏洞是指用户上传了一个可执行的脚本文件,并且通过此脚本文件获得了执行服务器端命令的能力。

防御方式

  1. 文件上传的目录设置为不可执行
  2. 判断文件类型:推荐使用白名单,结合使用 MIME type、后缀检查等方式,对文件类型进行判断;而对于图片的处理,可使用压缩函数或 resize 函数,在处理图片的同时破坏图片中可能包含的 HTML 代码
  3. 使用随机数改写文件名和文件路径:避免轻易被访问
  4. 单独设置文件服务器的域名:这里利用了浏览器的同源策略,可避免一些客户端攻击