Xsrf 验证

Xsrf 验证#!/usr/bin/envpython#-*-coding:utf-8-*-importtornado.ioloopimporttornado.webcontainer={}classSession:def__init__(self,handler):self.handler=handler…

大家好,又见面了,我是你们的朋友全栈君。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import tornado.ioloop
import tornado.web
container = {}

class Session:

    def __init__(self,handler):
        self.handler = handler
        self.random_str = None
    # 生成随机字符串
    def __random_star(self):
        import hashlib
        import time
        obj = hashlib.md5()
        obj.update(bytes(str(time.time()),encoding='utf-8'))
        random_str = obj.hexdigest()
        return random_str

    # 在用户浏览器上设置cookie
    def __setitem__(self,key,value):
        if not self.random_str:
            # 获取用户上的cookie
            random_str = self.handler.get_cookie('__kakaka__')
            # 如果用户没有 cookie 那么就创建一份
            if not random_str:
                random_str = self.__random_star()
                container[random_str] = {}
            # 如果有
            else:
                # 如果 random_str 在 container.keys()里面 就pass
                if random_str in container.keys():
                    pass
                # 否则 就重新创建一份
                else:
                    random_str = self.__random_star()
                    container[random_str] = {}
            self.random_str = random_str
        container[self.random_str][key] = value
        self.handler.set_cookie('__kakaka__',self.random_str)

    # 获取用户浏览器上的cookie
    def __getitem__(self,key):

        random_str = self.handler.get_cookie('__kakaka__')
        #判断random_str是否为空
        if not random_str:
            return None
        # 到container里面获取下random_str 看是否存在
        user_info_dict = container.get(random_str,None)
        if not user_info_dict:
            return None
        val = user_info_dict.get(key)
        return val

class BaseHandler(tornado.web.RequestHandler):
    def initialize(self):
        self.session = Session(self)

class IndexHandler(BaseHandler):
    def get(self, *args, **kwargs):
        # 获取用户传入的值 如果等于将执行操作
        if self.get_argument('u',None)in ['alex','eric']:

            self.session['is_login'] = True
            self.session['name']= self.get_argument('u',None)


        else:
            self.write('请登录')


class  ManagerHandler(BaseHandler):
    def get(self, *args, **kwargs):
        # 获取用户随机字符串 判断是否是true

        val = self.session['is_login']
        if val:
            self.write(self.session['name'])
        else:
            self.write('失败')

class LoginHandler(BaseHandler):
    def get(self, *args, **kwargs):
        self.render('login.html',status = "")

    def post(self, *args, **kwargs):
        user = self.get_argument('user',None)
        pwd = self.get_argument('pwd',None)
        code = self.get_argument('code',None)
        ceck_code = self.session['CeckCode']
        if ceck_code.upper() == code.upper():
            self.write('验证码正确')
        else:
            self.render('login.html',status = '验证码错误')

class CodeHandler(BaseHandler):
    def get(self, *args, **kwargs):
        import io
        import check_code
        mstream = io.BytesIO()
        # 创建图片 并写入验证码
        img,code = check_code.create_validate_code()
        # 为每个用户保存验证码
        self.session['CeckCode'] = code
        # 将图片写入IO mstream 中
        img.save(mstream,"GIF")
        # 发送图片到客户端
        self.write(mstream.getvalue())
        pass

class XsrfHandler(BaseHandler):
    def get(self, *args, **kwargs):
        self.render('csrf.html')

    def post(self, *args, **kwargs):
        self.write('Hello')

settings = {
    'template_path':'views',
    'static_path':'statics',
    'cookie_secret':'skjfsajdklfjalskj',
    # 开启POST提交 xsrf 验证 需要HTML表单中携带 {% raw xsrf_form_html() %} 才能提交
    'xsrf_cookies':True,
}



application = tornado.web.Application([
    (r"/index",IndexHandler),
    (r"/manager",ManagerHandler),
    (r"/login",LoginHandler),
    (r"/check_code",CodeHandler),
    (r"/csrf",XsrfHandler),
],**settings)

if __name__ == '__main__':
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

  

转载于:https://www.cnblogs.com/cloniu/p/6375836.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/144401.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • LSTM 时间序列预测 matlab

    由于参加了一个小的课题,是关于时间序列预测的。平时习惯用matlab,网上这种资源就比较少。借鉴了 http://blog.csdn.net/u010540396/article/details/52797489 的内容,稍微修改了一下程序。程序说明:DATA.mat是一行时序值,numdely是用前numdely个点预测当前点,cell_num是隐含层的数目,cos

    2022年4月6日
    152
  • 接口测试之Postman使用全指南(原来使用 Postman测试API接口如此简单)

    接口测试之Postman使用全指南(原来使用 Postman测试API接口如此简单)Postman是一个可扩展的API开发和测试协同平台工具,可以快速集成到CI/CD管道中。旨在简化测试和开发中的API工作流,如:使用Newman运行Postman集合Postman工具有Chrome扩展和独立客户端,推荐安装独立客户端。Postman有个Workspace的概念,workspace分personal和team类型。Personalworkspace只能自己查看。

    2022年5月31日
    78
  • JS 为对象添加属性的方法

    JS 为对象添加属性的方法常用数组添加的方式是 push 那么动态为对象添加属性该用什么方式呢 varobj obj name aaa obj age 22 console log obj obj name aaa age 22

    2025年7月22日
    3
  • Python删除文件中重复的内容「建议收藏」

    Python删除文件中重复的内容「建议收藏」1.背景:在将多个文件进行合并时,存在一个问题是许多文件中含有相同的内容,但是希望合并后的文件内容具有唯一性,即文件中的数据唯一,不会有重复的情况  #txt1内容为: #txt2内容为: #希望合并后的文件内容为: 123 234 456 123 254 456 …

    2022年5月23日
    55
  • 关于参数thresh的理解(pd.dropna(thresh=n))

    关于参数thresh的理解(pd.dropna(thresh=n))书上的表达:假设你只想保留包含一定数量的观察值的行,可以使用thresh参数来表示。嗯嗯嗯….有些模棱两可。摸索了一番,终于理解了。格式:df.dropna(thresh=n)简单的理解:这一行除去NA值,剩余数值的数量大于等于n,便显示这一行。1.先创建数组,代码如下:1importnumpyasnp2from…

    2025年6月30日
    2
  • 基于LM331的电压-频率转换电路详细介绍[通俗易懂]

    基于LM331的电压-频率转换电路详细介绍[通俗易懂]目录1.LM331简介2.引脚分布与功能3.LM331的功能框图4.V/F转换的工作原理5.LM331的V/F转换电路1.LM331简介LM331是由美国NS公司(已被TI公司收购)生产的高精度频率-电压转换芯片,可以用于AD转换、频率-电压转换、电压-频率转换和转速测量等。当用作频率-电压转换时输出频率与输入电压成正比例关系,线性失真最大为0.01%。动态范围广,最大可达100dB;温度稳定性高,温度系数为±50ppm/℃;工作范围广(1Hz-100kHz);外.

    2022年5月27日
    57

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号