• web框架--XSS攻击和CSRF请求伪造


    XSS

    跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的特殊目的。

    tornado中已经为我们给屏蔽了XSS,但是当我们后端向前端写前端代码的时候传入浏览器是字符串,而不是形成代码格式。所以就需要一个反解,在传入模板语言中前面加一个raw,例如{% raw name %}

    class IndexHandler(tornado.web.RequestHandler):
        def get(self, *args, **kwargs):
            jump = '''<input type="text"><a onclick = "Jump('%s',this);">GO</a>'''%('/index/')
            script = '''
                <script>
                    function Jump(baseUrl,ths){
                        var val = ths.previousElementSibling.value;
                        if (val.trim().length > 0){
                            location.href = baseUrl + val;
                        }
                    }
                </script>
            '''
            self.render('index.html',jump=jump,script=script)  #传入两个前端代码的字符串
    start.py
     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>Title</title>
     6     <style>
     7         .pager a{
     8             display: inline-block;
     9             padding: 5px;
    10             margin: 3px;
    11             background-color: #00a2ca;
    12         }
    13         .pager a.active{
    14             background-color: #0f0f0f;
    15             color: white;
    16         }
    17     </style>
    18 </head>
    19 <body>
    20     <div class="pager">
    21         {% raw jump %}
    22         {% raw script%}
    23     </div>
    24 </body>
    25 </html>    
    index.html

    CSRF

    CSRF(Cross-site  request forgery跨站请求伪造,也被称为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
    当前防范 XSRF 的一种通用的方法,是对每一个用户都记录一个无法预知的 cookie 数据,然后要求所有提交的请求中都必须带有这个 cookie 数据。如果此数据不匹配 ,那么这个请求就可能是被伪造的。

    Tornado 有内建的 XSRF 的防范机制,要使用此机制,你需要在应用配置中加上 xsrf_cookies 设定:xsrf_cookies=True

    简单来说就是在form验证里面生成了一段类似于自己的身份证号一样,携带着他来访问网页

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 
     4 import tornado.web
     5 import tornado.ioloop
     6 
     7 class CsrfHandler(tornado.web.RequestHandler):
     8 
     9     def get(self, *args, **kwargs):
    10         self.render('csrf.html')
    11 
    12     def post(self, *args, **kwargs):
    13         self.write('已经收到客户端发的请求伪造')
    14 
    15 
    16 settings = {
    17     'template_path':'views',
    18     'static_path':'statics',
    19     'xsrf_cokkies':True,        # 重点在这里,往这里看
    20 }
    21 
    22 application = tornado.web.Application([
    23     (r'/csrf',CsrfHandler)
    24 ],**settings)
    25 
    26 if __name__ == "__main__":
    27     application.listen(8888)
    28     tornado.ioloop.IOLoop.instance().start()
    start.py
     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>Title</title>
     6 </head>
     7 <body>
     8     <form action="/csrf" method="post">
     9         {% raw xsrf_form_html() %}
    10         <p><input name="user" type="text" placeholder="用户"/></p>
    11         <p><input name='pwd' type="text" placeholder="密码"/></p>
    12         <input type="submit" value="Submit" />
    13         <input type="button" value="Ajax CSRF" onclick="SubmitCsrf();" />
    14     </form>
    15     
    16     <script src="/statics/jquery-1.12.4.js"></script>
    17     <script type="text/javascript">
    18 
    19         function ChangeCode() {
    20             var code = document.getElementById('imgCode');
    21             code.src += '?';
    22         }
    23         function getCookie(name) {
    24             var r = document.cookie.match("\b" + name + "=([^;]*)\b");
    25             return r ? r[1] : undefined;
    26         }
    27 
    28         function SubmitCsrf() {
    29             var nid = getCookie('_xsrf');
    30             $.post({
    31                 url: '/csrf',
    32                 data: {'k1': 'v1',"_xsrf": nid},
    33                 success: function (callback) {
    34                     // Ajax请求发送成功有,自动执行
    35                     // callback,服务器write的数据 callback=“csrf.post”
    36                     console.log(callback);
    37                 }
    38             });
    39         }
    40     </script>
    41 </body>
    42 </html>
    index.html
  • 相关阅读:
    python 列表
    pytho set集合
    python 字典
    并发编程(原理篇 上)
    面向对象分析方法
    python 小记 整数与小数id
    python入门 第二天笔记
    python 元组问题解决
    python入门第一天作业。讲师写的代码。
    python学习笔记enumerate()与range(len)运用及赋值小计
  • 原文地址:https://www.cnblogs.com/june-L/p/12070941.html
Copyright © 2020-2023  润新知