Giter Club home page Giter Club logo

p2world.github.io's Introduction

xss

##什么是xss

  • xss是一种注入

    • 用户将自己的html代码注入到我们的html
  • 这是一种html的注入,所以与python,数据库无关

value = "<script>alert(1);</script>"
<p><?=value?></p>

生成的html:

<p><script>alert(1);</script></p>

这样就被执行了

解决办法

  • 将用户数据转义为纯文本
  • 浏览器当做纯文本显示而不是解析
<p><?-value?></p>

生成的html:

<p>&lt;script&gt;alert(1);&lt;/script&gt;</p>

在浏览器上的表现:

<script>alert(1);</script>

html转义

为什么要转义

  • 为了能让html解释器可以解析出正确的页面
  • 就像在字符串中不可以直接输入"而得输入\"(不然字符串就断开了),在html中也得转义部分字符:
    • \ &#39;
    • " &#34;
    • < &lt;
    • > &gt;
    • & &amp;

例:要输出一个</p>字符串到页面,那html就会是:

  • <p></p></p>显然是不行的
  • <p>&lt;/p&gt;</p> 这样才是正确的

什么应该不转义

<div>
    <%=html%>
</div>
  • 由运营同学或者用户提交的富文本
    • <b>xxx</b><a href="xx">xxx</a>
    • 数据被过滤过(标签,onclick)
    • 可以相信的

什么应该转移(剩下的全部情况)

<img src="<%-src%>">
<div>
    <%-text%>
</div>

script标签

在script标签中,都是js代码,浏览器不会把他们当做html代码解析,所以不需要html转义

script标签从<script>标签开始,一直到</script>标签截止,所以需要注意:

<script>
···
var a='</script>'; //到`>`这里script标签就截止了!!!
···
</script>
<script>
···
var a='<\/script>'; //这样就正确
···
</script>

如何把数据打到script里:

<script>
···
var a={{a|jsonify}};
// 将会变成以下
var a="<\/script>"; // 字符串里的 ' " / \ 字符都会被自动转义处理
var a=null;
var a={a:1};
···
</script>

注:某些json库没有做</script>转为<\/script>,请自行replace或替换为其他库

jsonify规则:

  • None null
  • "str" "str"
  • True true
  • 1 1
  • map JSON

错误的方法:

<script>
···
var a="{{a}}";
// 将会变成以下
var a="h&amp;m" //原来的数据是 h&m


var a="{{a|safe}}";
// 将会变成以下
var a="</script>" //被截断
var a="</script><script>alert(1);</script>" //被注入
···
</script>

js

写入:

只有涉及到操作html的时候才会有xss的问题:

  • html(html)
  • append(html)
  • ...

这些情况需要转义或者使用.text(text)方法替代。

.text('<>')是不需要转义的,因为不是设置html所以不需要html解析器解析,修改属性(.prop('src',src))也一样

读取:

    <div id="d" data-text="&amp;">&lt;</div>
$('#d').text(); // "<"
$('#d').html(); // "&lt;" 

$('#d').data('text'); // "&"

Tips

javascript 转义代码

function e(str){
    if(str==null){
        return '';
    }
    str+='';
    var nStr='';
    for (var i = 0; i < str.length; i++) {
        var c=str[i];
        switch(c){
            case '\'':nStr+='&#39;';break;
            case '"':nStr+='&#34;';break;
            case '<':nStr+='&lt;';break;
            case '>':nStr+='&gt;';break;
            case '&':nStr+='&amp;';break;
            default: nStr+=c;break;
        }
    }
    return nStr;
};

换行符

  • \n替换为<br/> <%=e(text).replace(/\n/g,"<br/>")%>

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.