• 服务器对cookie信息加密


    通过redis的seesion对cookie信息加密  --- 防止cookie记录的用户信息泄露

    import tornado.ioloop
    import tornado.web
    
    from data.table_1 import User
    from tornado.web import authenticated  # 装饰器判断是否登录,否者就跳转到登陆页面。通过application配置跳转路径
    
    from pycket.session import SessionMixin  # 设置redis加密cookie的一个类,BaseHandler继承
    
    import tornado.options
    import tornado.httpserver
    from tornado.options import define, options
    
    
    define('port',default=8000, help='run port', type=int)
    define('version', default=0.1, help='version', type=str)
    
      # 装饰器authenticated需要的Base类       通过redis加密需要继承这个SessionMixin
    class BaseHandler(tornado.web.RequestHandler, SessionMixin):  
        def get_current_user(self):  # 改写Base类的这个方法
            # current_user = self.get_secure_cookie('ID')
            current_user = self.session.get('ID')
            if current_user:
                return current_user
            return None
    
       #  redis加密时,Login继承Base
    class LoginHandler(BaseHandler):
        def get(self):
            nextname = self.get_argument('next','')
            self.render('login_1.html',
                        nextname=nextname,
                        error=''
                        )
        def post(self, *args, **kwargs):
            name = self.get_argument('name','')
            password = self.get_argument('password','')
            username = User.by_name(name)
            nextname = self.get_argument('next','')
            print(name, password, nextname)
            if username and username.password==password:
                self.session.set('ID',name)    # session为redis的会话,设置redis的加密cookie
                if nextname:
                    self.redirect(nextname)
                else:
                    self.redirect('/buy')
            else:
                self.render('login_1.html',
                            nextname=nextname,
                            error='用户名或密码错误'
                            )
    
    
    class BuyHandler(BaseHandler):
        @authenticated
        def get(self):
            self.write('欢迎您,尊敬的 VIP1000 用户')
    
    
    application = tornado.web.Application(
        [
            (r"/login", LoginHandler),
            (r"/buy", BuyHandler),
        ],
        template_path='templates',
        login_url='/login',
        cookie_secret='haha',
        pycket={
            'engine': 'redis',   # 连接redis
            'storage': {
                'host': 'localhost',    # 本机
                'port': 6379,       # redis端口
                'db_sessions': 5,   # redis的数据库(0-15个)
                'db_notifications': 11,
                'max_connections': 2 ** 31,
            },
            'cookies': {           # cookie 过期时间
                'expires_days': 30,
                'max_age': 100
            },
        },
        debug=True
    )
    
    if __name__ == '__main__':
        tornado.options.parse_command_line()  # 获取命令行的参数 --port=1040 就能使用这个参数
        print(options.port)
        print(options.version)
    
        http_server = tornado.httpserver.HTTPServer(application)
        application.listen(options.port)
        tornado.ioloop.IOLoop.instance().start()

     防止cookie被盗用后,用这个虚假cookie去欺骗服务器(防止跨域攻击)

    思路:在返回登录界面时发送一串独有的标记,这个标记和cookie相同,判断是否为服务器发出来登陆页面

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    {% if error %}
    用户名或密码错误
    {% end %}
    
    {% if nextname == '' %}
        <form method="post" action="/login">
            {% module xsrf_form_html() %}   # 返回form表单给浏览器时发送独有的标记,和cookie的信息相同。
    用来证明是服务器发送的
    <p>用户名:<input type="text", name="name"></p> <p>密码:<input type="password", name="password"></p> <input type="submit"> </form> {% else %} <form method="post" action="/login?next={{nextname}}"> {% module xsrf_form_html() %} <p>用户名:<input type="text", name="name"></p> <p>密码:<input type="password", name="password"></p> <input type="submit"> {% end %} </form> </body> </html>

  • 相关阅读:
    Day 25 网络基础2
    Day 25 网络基础
    Day 24 定时任务
    Day 23 系统服务之救援模式
    Day4 总结
    Day 22 进程管理2之系统的平均负载
    【Distributed】分布式Session一致性问题
    【Distributed】分布式系统中遇到的问题
    【Redis】分布式Session
    【Zookeeper】应用场景概述
  • 原文地址:https://www.cnblogs.com/tangpg/p/8567122.html
Copyright © 2020-2023  润新知