Web 站点如何防范 XSS、CSRF、SQL 注入攻击

对 Web 服务器的攻击也可以说是形形色色、种类繁多,常见的有挂马、SQL 注入、缓冲区溢出、嗅探、利用 IIS 等针对 Webserver 漏洞进行攻击。本文结合 WEB TOP10 漏洞中常见的 SQL 注入,跨站脚本攻击 (XSS),跨站请求伪造(CSRF)攻击的产生原理,介绍相应的防范方法。

XSS 跨站脚本攻击 **

XSS 跨站脚本攻击指攻击者在网页中嵌入客户端脚本 (例如 JavaScript),当用户浏览此网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的,比如获取用户的 Cookie,导航到恶意网站,携带木马等。

如何防止 XSS 跨站脚本攻击:

原则:不相信用户输入的数据

  1. 将重要的 cookie 标记为 http only,这样的话 Javascript 中的 document.cookie 语句就不能获取到 cookie 了

  2. 只允许用户输入我们期望的数据。例如:年龄的 textbox 中,只允许用户输入数字,而数字之外的字符都过滤掉

  3. 对数据进行 Html Encode 处理。< 转化为 &lt;、> 转化为 &gt;、& 转化为 &amp;、' 转化为 &#039;、" 转化为 &quot;、空格 转化为 &nbsp;

  4. 过滤或移除特殊的 Html 标签。例如:<script>、<iframe>、&lt; for <、&gt; for >、&quot for

  5. 过滤 JavaScript 事件的标签。例如 “onclick=”、”onfocus” 等等
    很多浏览器都加入了安全机制来过滤 XSS

    注意:攻击代码不一定在中

CSRF 跨站请求伪造

CSRF(XSRF)尽管听起来很想 XSS 跨站脚本攻击,但是它于 XSS 完全不同。XSS 是利用站点内的信任用户,而 CSRF 则是通过伪装来自受信任用户的请求来利用受信任的站点。与 XSS 相比,CSRF 攻击不大流行和难以防范,所以比 XSS 更具危险性。

如何防止 CSRF 跨站请求伪造:

  1. 对于 web 站点,将持久化的授权方法(例如 cookie 或者 HTTP 授权)切换为瞬时的授权方法(在每个 form 中提供隐藏 field)。
  2. “双提交” cookie。此方法只工作于 Ajax 请求,但它能够作为无需改变大量 form 的全局修正方法。如果某个授权的 cookie 在 form post 之前正被 JavaScript 代码读取,那么限制跨域规则将被应用。什么叫限制跨域规则呢?限制跨域规则就是:如果服务器需要在 Post 请求体或者 URL 中包含授权 cookie 的请求,那么这个请求必须来自于受信任的域,因为其它域是不能从信任域读取 cookie 的。上面那个例子的受信任域就是银行网站的某个域,而 Mallory 发给 Bob 的链接不是受信任的域。
  3. 使用 Post 代替 Get。Post 方式不会在 web 服务器和代理服务器日志中留下数据尾巴,然而 Get 方式却会留下数据尾巴。
  4. 以上三点都是正对 web 站点的防御手段,第 4 点是从用户的角度的防御手段。通过在浏览其它站点前登出站点或者在浏览器会话结束后清理浏览器的 cookie 来防止 CSRF 攻击。

SQL 注入

所谓 SQL 注入,就是通过把 SQL 命令插入到 Web 表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的 SQL 命令。

如何防止 SQL 注入:

  1. 永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双”-“进行转换等。
  2. 永远不要使用动态拼装 sql,可以使用参数化的 sql 或者直接使用存储过程进行数据查询存取
  3. 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接
  4. 不要把机密信息直接存放,加密或者 hash 掉密码和敏感的信息
  5. 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装