Web安全问题和解决方案

目前常见的web安全问题有以下几种:

  • 同源策略
  • XSS
  • CSRF
  • SQL注入
  • 点击劫持
  • window.opener安全问题
  • 文件上传漏洞

同源策略

如果两个URL的协议、域名、端口都相同,我们称之为同源。

  • 同源策略限制了来自不同源的JS脚本对当前DOM对象的读写操作。
  • 同源策略限制了来自不同源的站点读取当前站点的Cookie、LocalStorage等操作。
  • 同源策略限制了通过XMLHttpRequest等方式将站点的数据发送给不同源的站点。

对应的解决方法:

  • 跨域资源共享(CORS):服务端设置跨域资源允许跨域。
  • 内容安全策略(CSP):用白名单的形式配置可信任的内容来源。
  • 跨文档消息机制:window.postMessage可以和不同源的DOM进行通信。

XSS

跨站脚本攻击(Cross Site Scripting)

1,存储型XSS攻击

存储型XSS,利用漏洞提交恶意JS代码,比如在可以输入的区域输入恶意script标签提交给服务器,当用户打开网站时恶意脚本会执行获取用户相关信息。

2,反射型XSS攻击

反射型 XSS 只是简单地把用户输入的数据 “反射” 给浏览器,这种攻击方式往往需要攻击者诱使用户点击一个恶意链接,或者提交一个表单,或者进入一个恶意网站时,注入脚本进入被攻击者的网站。常用手段例如通过邮件、群等渠道诱导点击。

3,基于DOM的XSS攻击

基于 DOM 的 XSS 攻击是指通过恶意脚本修改页面的 DOM 结构,是纯粹发生在客户端的攻击。

4,预防策略

  • 将cookie等敏感信息设置为httponly,浏览器将禁止页面的Javascript 访问带有 HttpOnly 属性的Cookie。
  • 输入检查,不要相信用户的任何输入。对于所有的输入做严格的校验。
  • 输出检查,用户的输入会存在问题,服务端的输出也会有问题。
  • 对于特殊字符进行转义或者过滤
  • CSP(Content Security Policy),内容安全策略。用白名单的形式配置可信的内容来源。

CSP配置方式:

// meta


// HTTP头部
Content-Security-Policy: script-src 'unsafe-inline' 'unsafe-eval' 'self' *.domain.cn *.domain.com;report-uri /error/csp

CSRF(Cross-site request forgery)

中译是跨站请求伪造,是一种劫持受信任用户向服务器发送非预期请求的攻击方式。
通常情况下,CSRF 攻击是攻击者借助受害者的 Cookie 骗取服务器的信任,可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击服务器,从而在并未授权的情况下执行在权限保护之下的操作。

预防策略:

  • 验证码,验证码被认为是对抗 CSRF 攻击最简洁而有效的防御方法。但不能作为最主要的解决方案。
  • Referer Check。根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。通过 Referer Check,可以检查请求是否来自合法的"源"。
  • 添加token验证。CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 cookie 中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的 cookie 来通过安全验证。因此要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。
  • SameSite。Cookie的SameSite属性有Strict、Lax、None三个值。Sreict-浏览器会完全禁止第三方Cookie。LaxLax-相对宽松一点。在跨站点的情况下,从第三方站点的链接打开和从第三方站点提交 Get 方式的表单这两种方式都会携带 Cookie。但如果在第三方站点中使用 Post 方法,或者通过 img、iframe 等标签加载的 URL,这些场景都不会携带 Cookie。None-在任何情况下都会发送 Cookie 数据。

SQL注入

注入方式

SQL注入的攻击方式根据应用程序处理数据库返回内容的不同,可以分为可显注入、报错注入和盲注:

1、可显注入:攻击者可以直接在当前界面内容中获取想要获得的内容

2、报错注入:数据库查询返回结果并没有在页面中显示,但是应用程序将数据库报错信息打印到了页面中,所以攻击者可以构造数据库报错语句,从报错信息中获取想要获得的内容

3、盲注:数据库查询结果无法从直观页面中获取,攻击者通过使用数据库逻辑或使数据库库执行延时等方法获取想要获得的内容

预防策略:

  • 减少不必要的数据库错误信息
  • 禁止目标网站用动态拼接字符串的方式访问数据库
  • 数据库权限
  • 过滤和净化SQL保留字

点击劫持

顾名思义,用户点击某个按钮,却触发了不是用户真正意愿的事件。

预防策略:

1,JS禁止内嵌
在目标网站页面添加如下代码,也可以用top.location.hostname和self.location.hostname进行判断

script>
    if (top.location != window.location) {
        top.location = window.location;
    }

2,服务端添加 X-Frame-Options 响应头,这个响应头是用来给浏览器指示允许一个页面可否在 或者 中展现的标记

3,点击劫持只需要用户简单的点击按钮就触发事件,我们可以增加用户的操作成本,从而让用户有所警觉。如:设置验证码等。

window.opener安全

window.opener 表示打开当前窗体页面的的父窗体的是谁,被用来跳转钓鱼网站。

预防策略:
1,设置标签rel属性noopener规定禁止新页面传递源页面的地址


2,将外链替换为内部的跳转连接服务,跳转时先跳到内部地址,再由服务器 redirect 到外链。
3,可以由 widow.open 打开外链。

文件上传漏洞

没有对上传的任何文件做过滤安全校验.可直接上传webshell到服务器.或者仅对文件类型进行了校验,可以通过代理的方式来修改文件类型的方式来绕过这个检测。

预防策略:

  • 文件扩展名服务端校验.
  • 文件内容服务端校验.
  • 上传文件重命名.
  • 上传文件路径隐藏.

你可能感兴趣的:(Web安全问题和解决方案)