常见 web 安全问题

238 阅读5分钟

1、跨站脚本漏洞(XSS)

跨站脚本攻击(Cross Site Scripting),本应缩写为 CSS,但是这与层叠样式表混淆了,所以跨站脚本攻击就缩写为了 XSS。

1.1 什么是 XSS 漏洞

跨站脚本攻击是指往 Web 页面里插入恶意 Script 代码,当用户浏览该页面时,嵌入的恶意 Script 代码会被执行,从而达到恶意攻击用户的目的。一旦攻击成功,则可对用户进行盗取 cookie 信息、会话劫持、获取用户的联系人列表、发送虚假诈骗信息等。

1.2 常见的三种 XSS 攻击类型

1、反射型

非持久型,这种类型的 XSS,需要攻击者提前创建一个恶意链接,用户点击链接后才能触发 XSS 代码。

2、存储型

持久化,需要先把恶意代码保存在目标网站的服务器数据库或文件中,当 web 程序读取恶意代码时再输出在页面上执行此代码。这种攻击具有较强的稳定性和持久性。

1.3 解决方法

  1. 输入过滤,对用户输入的数据做一定的过滤。在 web 端检查输入的数据是否符合预期的格式,如日期、邮箱、电话号码等。在后台服务器中,需要在接收到用户输入的数据后,对特殊危险字符进行过滤或者转义处理。
  2. 输出编码,服务端返回的数据使用系统的安全函数来进行编码或转义来防范 XSS 攻击,在 JavaScript 中的编码方式可以使用 JavaScriptEncode。
  3. 在设置 cookie 时,将其属性设为 HttpOnly,可以避免该网页的 cookie 被客户端恶意 JavaScript 窃取,保护了用户的 cookie 信息。

2、SQL注入

SQL 注入,应用程序向数据库传递 SQL 时,攻击者将 SQL 命令插入到 Web 表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的 SQL 命令。

如何防止 SQL 注入?

  1. 永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和 双"-"进行转换等。
  2. 永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
  3. 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
  4. 不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
  5. 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
  6. sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。

3、跨站请求伪造(CSRF攻击)

3.1 什么是 CSRF

CSRF(Cross-Site Request Forgery),攻击者盗用用户的身份,以用户的名义发起恶意请求,但对服务器来说这个请求是完全合法的。

3.2 攻击过程

  1. 用户登录信任网站A
  2. 登录验证通过,返回网站A产生的Cookie
  3. 用户在没有退出登录网站A的情况下,访问危险网站B
  4. 网站 B 要求访问网站A,发出一个请求
  5. 根据网站B的要求,浏览器带着之前产生的 Cookie 访问A
  6. A不知道这个请求是用户发出的还是B发出的,由于浏览器会带上用户的Cookie,所以服务器会根据用户的权限处理请求,这样就攻击者就达到了模拟用户操作的目的。

3.3 防御

(1) 验证 HTTP Referer 字段

根据 HTTP 协议,在 HTTP 头中有一个字段交 Referer,它记录了该 HTTP 请求的来源地址。比如银行转账是通过访问 www.abc.com/dosomething 页面来完成的,用户必须先登录 www.abc.com,然后点击提交按钮来触发转账事件,当用户提交请求时,该请求的 Referer 值就会是提交按钮所在页面的 URL。如果攻击者要对银行网站实施 CSRF 攻击,他只能在其他网站构造请求,此时请求的 Referer 的值是其他网站的地址,则拒绝该请求。

(2)在请求地址中添加 token 并验证

由于CSRF的本质在于攻击者欺骗用户去访问自己设置的地址,所以如果要求在访问敏感数据请求时,要求用户浏览器提供不保存在cookie中,并且攻击者无法伪造的数据作为校验,那么攻击者就无法再运行CSRF攻击。这种数据通常是窗体中的一个数据项。服务器将其生成并附加在窗体中,其内容是一个伪随机数。当客户端通过窗体提交请求时,这个伪随机数也一并提交上去以供校验。正常的访问时,客户端浏览器能够正确得到并传回这个伪随机数,而通过CSRF传来的欺骗性攻击中,攻击者无从事先得知这个伪随机数的值,服务端就会因为校验token的值为空或者错误,拒绝这个可疑请求。