xss防御

XSS攻击:跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。

xss攻击分类

分类

反射型:经过后端,不经过数据库 存储型:经过后端,经过数据库

xss攻击注入点

攻击注入点

xss攻击防御

  • 浏览器防御。现代浏览器具有xss防御机制,防御范围有限。防御类型为反射型xss,即url参数再次出现在页面中,浏览器会进行拦截。防御内容为HTML节点内容与HTML属性。是一种非常有限的防御机制,不可以依赖。
  • HTML节点内容转义。 转义内容为< >。将尖括号转义为&lt,&gt
var escapeHtml = function(str){
      str = str.replace(/</g,'&lt;');
      str = str.replace(/>/g,'&gt;');
      return str;
}
  • HTML属性攻击防御。 用户输入的数据出现在了html属性上,而由于里面有引号,将属性提前关闭了,产生了其他属性,而内容中可能存在脚本。只需要将引号转义。
var escapeProperty = function(str){
      if(!str) return ' ';
      str = str.replace(/&/g, '&amp;');
      str = str.replace(/"/g,'&quto;');
      str = str.replace(/'/g,'&#39;');
      return str;
}

可将上述两种合为一个方法

var escapeHtml = function(str) {
    if(!str) return '';
    str = str.replace(/&/g, '&amp;');
    str = str.replace(/</g, '&lt;');
    str = str.replace(/>/g, '&gt;');
    str = str.replace(/"/g, '&quto;');
    str = str.replace(/'/g, '&#39;');
    // str = str.replace(/ /g, '&#32;');
    return str;
};
  • js代码防御 js中会插入来自后台或者用户输入的数据,但是这些数据可能会突破引号边界,产生新的语句。解决方案1:将引号转义,2:jsonencode。
var escapeForJs = function(str) {
    if(!str) return '';
    str = str.replace(/\\/g, '\\\\');
    str = str.replace(/"/g, '\\"');
    return str;
};
JSON.stringify(str)//建议使用这种方法
  • 富文本防御 使用黑名单防御。不建议使用 按白名单保留部分标签和属性。将html解析成树状结构,根据dom树遍历,是否为允许属性。库Xss,可以实现将html解析成树状结构。
var xssFilter = function(html){
    if(!html) return '';
    var xss = require('xss');
    var ret = xss(html, {
        whiteList:{
            img: ['src'],
            a: ['href'],
            font: ['size', 'color']
        },
        onIgnoreTag: function(){
            return '';
        }
    });
    console.log(html, ret);
    return ret;
};
  • CSP(Content Security Policy)内容安全策略 CSP指的是内容安全策略,为了缓解很大一部分潜在的跨站脚本问题,浏览器的扩展程序系统引入了内容安全策略(CSP)的一般概念。这将引入一些相当严格的策略,会使扩展程序在默认情况下更加安全,开发者可以创建并强制应用一些规则,管理网站允许加载的内容。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

【Python】windows下Eclipse中安装集成webpy框架

这篇文章主要讲述的是在Windows下,在eclipse中如何通过使用webpy框架进行python的web开发。很多文章都是在自己一次次的碰壁中又决定自己写一...

1884
来自专栏颇忒脱的技术博客

多种认证、授权模型的比较

本文主要列举在如今前后端分离、手机App大行其道的现状下,用户认证、授权的几种做法及对比。

3523
来自专栏木头编程 - moTzxx

Laravel 自定义公共函数的引入

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

1101
来自专栏我有一个梦想

Python 项目实践三(Web应用程序)第五篇

 接着上节继续学习,在这一节,我们将建立一个用户注册和身份验证系统,让用户能够注册账户,进而登录和注销。我们将创建一个新的应用程序,其中包含与处理用户账户相关的...

2298
来自专栏技术小黑屋

Android进程线程调度之cgroups

做Android开发的同学们,了解cgroups的同学其实不多,cgroups是什么意思呢,在操作系统中有着什么样的作用,以及Android中的cgroups有...

3712
来自专栏smy

git将代码提交到远程分支(非主分支)

一个仓库可以包含多个分支,有一个默认的主分支:master 若想提交代码至远程仓库的某个分支(非主分支) 先查看下本地分支以及远程分支:git branch -...

3365
来自专栏沈唁志

LNMP 下 memcached 常用指令收集整理笔记

1863
来自专栏一只程序汪的自我修养

用Visual Studio Code Debug世界上最好的语言(Mac篇)

title: 用Visual Studio Code Debug世界上最好的语言(Mac篇)

2266
来自专栏张戈的专栏

解决wp-super-cache无法(预)缓存问题

突然发现 WP-SUPER-CACHE 无法预缓存,点击【立即加载预缓存】后没有任何效果,并且垃圾回收定时器也失效了,缓存文件全是几天前的,感觉很奇怪! 闲下来...

3875
来自专栏北京马哥教育

【Python】windows下Eclipse中安装集成webpy框架

作者:JueDream 来源:http://blog.csdn.net/qq_35731570/article/details/62221021?locatio...

3249

扫码关注云+社区

领取腾讯云代金券