Csrf 及ajax的csrf 请求

Posted 少数派&蔡先生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Csrf 及ajax的csrf 请求相关的知识,希望对你有一定的参考价值。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
#验证码
import tornado.ioloop
import tornado.web
class CrsfHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        self.render("crsf.html")
    def post(self, *args, **kwargs):
        self.write("csrf.post")

settings = {
    "xsrf_cookies": True,
}
class CheckCodeHandler(tornado.web.RequestHandler):
    def get(self):
        import io
        import check_code
        mstream = io.BytesIO()
        # 创建图片 写入验证码
        img, code = check_code.create_validate_code()
        # 图片对象写入到mstream
        img.save(mstream, "GIF")
        # self.session["CheckCode"] = code
        print(mstream.getvalue())
        self.write(mstream.getvalue())

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("index.html",)


application = tornado.web.Application([
    (r"/index", MainHandler),
    #(r"/check_code", CheckCodeHandler),
    (r"/crsf", CrsfHandler),

],**settings)

if __name__ == "__main__":
    application.listen(5555)
    tornado.ioloop.IOLoop.instance().start()
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/crsf" method="post">


      {% raw xsrf_form_html() %}

    <p><input name="name" value=""></p>
    <p><input name="pwd" value=""></p>

   <p>
       <input name="valide" value="" placeholder="验证码">
       <input type="submit" value="submit" >
   </p>

</form>
<script type="text/javascript">

        function ChangeCode() {
            var code = document.getElementById(imgCode);
            code.src += ?;
        }
 </script>
</body>
</html>

 Ajax使用时,本质上就是去获取本地的cookie,携带cookie再来发送请求

function getCookie(name) {
    var r = document.cookie.match("\\b" + name + "=([^;]*)\\b");
    return r ? r[1] : undefined;
}

jQuery.postJSON = function(url, args, callback) {
    args._xsrf = getCookie("_xsrf");
    $.ajax({url: url, data: $.param(args), dataType: "text", type: "POST",
        success: function(response) {
        callback(eval("(" + response + ")"));
    }});
};

以上是关于Csrf 及ajax的csrf 请求的主要内容,如果未能解决你的问题,请参考以下文章

21)django-csrf(跨站请求伪造)

Django(十六)基于模板的登录案例:登录装饰器csrf攻击方式及防护ajax的Post 的csrf开启写法生成验证码加验证码登录反向解析+传参

Ajax csrf跨站请求伪造

如何在 Cakephp 3 的 ajax 调用中定义 CSRF 令牌。此外,对于某些 ajax 请求,如何关闭 CSRF

CSRF之Ajax请求

什么是CSRF跨站请求伪造?(from表单效验csrf-ajdax效验csrf-Ajax设置csrf-CBV装饰器验证csrf)