当前位置: 首页 > news >正文

公司网站与营销网站网站seo插件

公司网站与营销网站,网站seo插件,兰州网站建设公司,设计购物网站应用安全 cookie 普通cookie 一般我们的用户表中都有啥呢 你在购物的时候,加入购物车,让你登录,那你登录之后,他怎么知道你登录了呢 token 这个值是随机的,存在cookie里面 设置 原型: 设置cookie 的方法 def set_cookie(self,name: str,value: Union[str, bytes],domai…应用安全 cookie 普通cookie 一般我们的用户表中都有啥呢 你在购物的时候,加入购物车,让你登录,那你登录之后,他怎么知道你登录了呢 token 这个值是随机的,存在cookie里面 设置 原型: 设置cookie 的方法 def set_cookie(self,name: str,value: Union[str, bytes],domain: str None,expires: Union[float, Tuple, datetime.datetime] None,path: str /,expires_days: int None,**kwargs: Any) - None:参数 name:我们设置的cookie的名字value:cookie的值domain:提交cookie时匹配的域名,也就是哪个ip拿过来的path:提交cookie时匹配的路径expires:设置cookie的有效期,可以是时间磋整数,时间元组,datetime类型,为UTC时间expires_days:设置cookie的有效期(天数)但是他的优先级低于expires 实例: 原理 设置cookie实际上是通过设置header的Set-Cookie来实现的 获取 我们设置完了就要获取,为什么要获取呢,因为以后我们在发送请求就要携带着这个cookie了 原型: def get_cookie(self, name: str, default: str None) - Optional[str]:参数: name:要获取的cookie 的名称default:如果名为name的获取的cookie不存在,就走这个默认值了 示例: cookie self.get_cookie(suck,未登录) print(cookie) self.write(getcookie page info tornado!) self.write(cookie)清除 原型: def clear_cookie(self, name: str, path: str /, domain: str None) - None:作用: 删除名为name 的cookie,并同时匹配domain和path的cookie哟时候有可能这个name相同啊,那这个时候就得用path和domain来匹配一下了 注意: 执行cookie删除后,并不是直接就删除了,而是给cookie设置内容为null空,并删除延迟时间,真正删除是浏览器自己清理的,浏览器发现他没有用的话就给他删掉了,就看浏览器的了 还有一个原型: def clear_all_cookies(self, path: str /, domain: str None) - None:作用:删除同时匹配path和domain的所有cookie示例: # 清除cookie class ClearPCookieHandler(RequestHandler):def get(self):# 这个删除cookie后,他这次不能决定# 是下一次删除了# 清除一个cookieself.clear_cookie(suck)# 清除所有cookieself.clear_all_cookies()self.write(ClearPCookieHandler page info tornado!)安全cookie 概述: cookie是存储在客户端浏览器的数据,很容易被篡改,不是很安全 tornado提供了一种对于cookie简易的加密的方法,来防止cookie被恶意篡改 设置: 需要为应用配置的进行混淆加密的秘钥生成一个秘钥: 我们需要用到一个库base64,你需要知道的就是他是加密的就行了,是一个唯一的标识,其他的你就不用管了,因为其他的你想管你也管不着了 md5 现在已经不安全了,现在有一些网站已经能够在线破解md5了 我们在python控制台输入如下代码,即可生成一个uuid base64.b64encode(uuid.uuid4().bytesuuid.uuid4().bytes) bj94bbx0zSY6yYkCgawwJ1bzyM4jzDUuKtLyPC/MMmZA我们需要在配置文件config.py中进行配置 内容如下 settings {# 这写key的名字可不是随便起的奥,是写好的,# 就像upfile就没有,你写了也白扯template_path: os.path.join(BASE_DIR, templates),static_path: os.path.join(BASE_DIR, static),debug: True,# autoreload : Truecookie_secret:j94bbx0zSY6yYkCgawwJ1bzyM4jzDUuKtLyPC/MMmZA,# 这个据说一百亿年才能,用完 }然后给你看一个方法,他的原型如下 def set_secure_cookie(self,name: str,value: Union[str, bytes],expires_days: int 30,version: int None,**kwargs: Any) - None:作用:设置一个带有签名和时间戳的cookie,防止cookie被伪造 实际上是这样写的 # 安全cookie class SCookieHandler(RequestHandler):def get(self):self.set_secure_cookie(victor,nice)self.write(SCookieHandler page info tornado!)然后我们在浏览器中查看一下cookie的值 Set-Cookie: victor2|1:0|10:1575853257|6:victor|8:bmljZQ |ac4c19c8598fc7c7d07c1484f07a0cc8e1a1adb022d084bcc3d3d4 75129fab63; expiresWed, 08 Jan 2020 01:00:57 GMT; Path/现在这个值,你看不出来内容是啥了 说明: 安全cookie版本,默认使用2默认为0时间戳cookie名base64cookie编码的值签名值(不带长度说明) 获取: 直接就把原型往这里一扔 def get_secure_cookie(self,name: str,value: str None,max_age_days: int 31,min_version: int None,) - Optional[bytes]:然后我这么写 # 获取安全cookie class GetSCookieHandler(RequestHandler):def get(self):sc self.get_secure_cookie(victor)print(sc)self.write(getSCookieHandler page info tornado!)self.write(sc)如果cookie验证通过,就会返回这个cookie的值,否则返回None max_age_days不同于expries_days设置的浏览器中cookie的有效时间 而max_age_days是过滤安全cookie的时间戳,默认是31天 注意: 这个安全cookie,也不是绝对安全的,只是一定程度上增加了破解的难度以后cookie中不要存储一些敏感性的数据 XSRF 跨站请求伪造代码 示例: # cookie计数 class CookieNumHandler(RequestHandler):def get(self):count self.get_cookie(count,None)if count:# 第n次访问count str(int(count)1)passelse:# 第一次访问# 设置cookiecount 0self.set_cookie(count,count)self.render(cookienum.html,count count)页面是这个样子的: !DOCTYPE html html langen headmeta charsetUTF-8title搞事情/title /head body h1第{ { count } }次访问/h1 p搞事情网站,我就看看能不能搞坏!!!/p divimg srchttp://127.0.0.1:8080/cookienum alt /div /body /html当我们访问搞事情网站的时候,当我们不知情的时候,未授权的情况下,cookie计数器网站中的cookie被使用,导致cookie计数器网站认为是他自己调用了Handler逻辑 上一个程序使用的是GET方式模拟的攻击,为了防止这种攻击,一般对于相对安全的操作一般不放在GET请求中. 我们常常使用的是POST请求 XSRF保护 同源:同域名同协议同端口 只有同源才让他能访问 开启保护 在配置中添加 xsrf_cookies:True然后在这里别忘了也整一下 super(Application, self).__init__(handlers,# 模板路径template_pathsettings[template_path],# 静态路径static_pathsettings[static_path],# cookie签名cookie_secretsettings[cookie_secret],xsrf_cookiessettings[xsrf_cookies], )现在保护一开,谁都别想访问了 那我们还要干什么? 我们怎么才能让我们自身的能够进行访问啊 附加 配置文件中的键和值不用一个一个写,直接就**打散就OK了 # 是不是傻了,这里直接就** 就行了 super(Application, self).__init__(handlers,**settings ) 应用 在模板中应用 在form表单中加上这么一句话,模板里面就能用了 { % module xsrf_form_html() % }完整的就这样了 !DOCTYPE html html langen headmeta charsetUTF-8titlePost page/title /head bodyform action/postfile methodpost{ % module xsrf_form_html() % }姓名:input typetext nameusernamehr/密码:input typepassword namepasswordhr/input typesubmit value登录/form /body /html作用: 为浏览器设置了_xsrf的安全cookie,这个cookie在关闭浏览器后就失效了为模板添加了一个隐藏的输出,隐藏域,名为_xsrf,值为_xsrf这个cookie的值表单中的一个隐藏域,名为…值为…,但是还是不绝对安全 在非模板中应用 手动设置_xsrf的cookie 设置XsrfCookieHandler class SetXsrfCookieHandler(RequestHandler):def get(self):# 设置一个_xsrf的cookieself.xsrf_tokenself.finish(OK)第一种 我们可以不在页面中写那一行代码 而是写一个script的JS代码,其中实现手动的添加一个隐藏input手动创建input,并设置name的属性值为_xsrf,value的属性值为名为_xsrf的cookie的值 !DOCTYPE html html langen headmeta charsetUTF-8titlePost page/title /head bodyform action/postfile methodpostinput idhi typehidden name_xsrf value姓名:input typetext nameusernamehr/密码:input typepassword namepasswordhr/input typesubmit value登录/formscriptfunction getCookie(name) {// 这里写的就不用管他是啥意思了var cook document.cookie.match(\\b name ([^;]*)\\b);// 我们要返回的是cookie,不是cook// 如果有,那我就拿他的第一个值,就是这个cookie值return cook ? cook[1] : undefined}// 获取cookiegc getCookie(_xsrf);console.log(gc);document.getElementById(hi).value gc;/script /body/html第二种 发起ajax请求: 我们把这个表单去掉,然后在js中点击这个按钮就发起ajax请求 我们没有学过原生的ajax吧!那么就需要借助jQuery了吧! 具体代码如下: !DOCTYPE html html langen headmeta charsetUTF-8titlePost page/title!-- 导入jQuery--script typetext/javascript charsetutf-8 src{{static_url(js/jquery.min.js)}}/script /head bodyinput idhi typehidden name_xsrf value 姓名:input typetext nameusername hr/ 密码:input typepassword namepassword hr/ input typesubmit value登录 button idbtn onclicklogin()登录/button scriptfunction getCookie(name) {// 这里写的就不用管他是啥意思了var cook document.cookie.match(\\b name ([^;]*)\\b);// 我们要返回的是cookie,不是cook// 如果有,那我就拿他的第一个值,就是这个cookie值return cook ? cook[1] : undefined}function login() {// 发起ajax请求我们有很多种方式// 发起post请求我们有两种方式,一种是这个$.post(/postfile,_xsrf getCookie(_xsrf) username victor passwd 123456,// 请求成功后的回调函数function (data) {alert(ok\\(^o^)/~);alert(data);});// TODO 其实这里要通过DOM元素获取username,和passwd的值的,// TODO 因为这里不是作为重点就写了/*** 这里主要是要带着这个xsrf防护,不然这个是不能给你响应的*/} /script /body/html第三种 其实这种才是最常用的方式,这个$.post仅仅只能发起post请求,所携带的参数或者说对于他的控制是比较少的 $.ajax才是最NB的方式 来吧!直接就上代码 !DOCTYPE html html langen headmeta charsetUTF-8titlePost page/title!-- 导入jQuery--script typetext/javascript charsetutf-8 src{{static_url(js/jquery.min.js)}}/script /head bodyinput idhi typehidden name_xsrf value 姓名:input typetext nameusername hr/ 密码:input typepassword namepassword hr/ input typesubmit value登录 button idbtn onclicklogin()登录/button scriptfunction getCookie(name) {// 这里写的就不用管他是啥意思了var cook document.cookie.match(\\b name ([^;]*)\\b);// 我们要返回的是cookie,不是cook// 如果有,那我就拿他的第一个值,就是这个cookie值return cook ? cook[1] : undefined}function login() {// TODO 这块还是那么回事,数据可以通过DOM来动态获取data {username: victor,passwd: 123456,};// 我们需要把我们的数据给他变成一个字符串// 这个方法是JS中的东西,不是python,jQuery的var data_str JSON.stringify(data);// 这个ajax怎么写呢?,他里面就一个参数,就是一个字典$.ajax({url: /postfile,// 这个请求方式你写啥,他就是啥,他都能发method: POST,data: data_str,// 你看吧这个字典中的一个键里面对应的值是函数,// 虽然外面就一个字典类型的参数,但是回调函数还是有的success: function () {alert(ok!!!)},// 到这里绝壁是不能成功的,因为我这个_xsrf都没写怎么能成功呢// 如果想发起请求,我们还需要添加一个headers,也就是请求头headers:{// 来这个跟着写就对了// 这个值就设置成之前那个cookie值就行了X-XSRFToken: getCookie(_xsrf),},})// 以后发起ajax请求,建议使用这个,功能更加强大} /script /body/html问题 其实帅的人是不会用第一种方式写的 需要手动设置token 解决:其实一般我们进入一个网站的时候,通常是不是都先进入主页啊,你进入主页的时候就把这个xsrf写进去了 首先我们添加一个进入主页的静态默认页面 (r/(.*)$,# 系统这个我们不能用,所以我们继承,# tornado.web.StaticFileHandler,# 让我们自己写这个继承自系统给我们这个index.MyStaticFileHandler,{path: os.path.join(BASE_DIR, static/html),default_filename: index.html} ),然后重写StaticFileHandler from tornado.web import StaticFileHandler# 设置静态默认 class MyStaticFileHandler(StaticFileHandler):# 我们用他的时候只需要重写他的init就可以了def __init__(self,*args,**kwargs):super(MyStaticFileHandler,self).__init__(*args,**kwargs)self.xsrf_token补充 _xsrf 加一个下划线,我们把他看成是私有的__xsrf就真的是私有的了 用户验证 概念 在收到用户请求后,进行一个预先判断用户的认证状态(是否登录),若验证通过正常处理,否则进入登录界面去,滚去登录 tornado.web.authenticate 装饰器 tornado将确保这个方法的主体(他修饰的东西)只有合法的用户才能调用 get_current_user 我们自己定义一个方法get_current_user() 功能:验证用户的逻辑,应该写在该方法中, 如果该方法返回的为True说明验证成功,否则验证失败 验证失败:访客重定向到配置中的所制定的路由(登录界面) 需要在配置文件config.py中写上配置的位置,因为你不一定要跳转到登录界面吧! login_url:/login,这样你要是没登录,他就给你踢到那个页面中了 然后直接就上代码 首先 路由是这样的 # 登录界面 tornado.web.url(r/login, index.LoginHandler,namelogin), # home页面 (r/home, index.HomeHandler), # 一个无名的普通页面,用于测试的 (r/cart, index.CartHandler),(r/(.*)$,# 系统这个我们不能用,所以我们继承,# tornado.web.StaticFileHandler,# 让我们自己写这个继承自系统给我们这个index.MyStaticFileHandler,{path: os.path.join(BASE_DIR, static/html),default_filename: index.html} ),登录页面 class LoginHandler(RequestHandler):def get(self):# 进入登录我就要知道我是从哪里进的了next self.get_argument(next,/)url login ?next nextself.render(login.html, urlurl)def post(self):咱也不用管是get还是post了name self.get_body_argument(username)passwd self.get_body_argument(passwd)# 直接我就写name self.get_argument(username)passwd self.get_argument(passwd)# TODO 这里还是把账号和密码写死了if name victor and passwd 123456:# 这个玩意代表从哪个页面跳来的,处理完了# 要是没毛病,我还得给你发到那里去next self.get_argument(next, /)# 后面/是默认值# 重定向走你,但是光重定向不行# 我们还得加一个标记self.redirect(next ?flaglogined)else:next self.get_argument(next, /)# 验证失败了,# 路由的反向解析,听着挺高大上的# 密码输入错误,好几次也得记着人家是从哪里过来的log self.reverse_url(login)?nextnext# 我还是得重定向self.redirect(log)这个是主页面 class HomeHandler(RequestHandler):def get_current_user(self):# 返回True代表验证成功,否则凉凉# return False# 然后我们这里就能通过之前的flag来判断了# 这里还要设置一个默认值否则就是# WARNING:tornado.general:400 GET /home (127.0.0.1):Missing argument flagflag self.get_argument(flag, None)# 如果能取到flag,就返回true# 要是娶不到,自然就返回Falsereturn flagtornado.web.authenticateddef get(self):self.render(home.html)这个cart是一个普通的页面 class CartHandler(RequestHandler):def get_current_user(self):return self.get_argument(flag, None)tornado.web.authenticateddef get(self):self.render(cart.html)相似文章 tornado学习笔记day01 tornado学习笔记day02 tornado学习笔记day03 tornado学习笔记day04 tornado学习笔记day05 tornado学习笔记day06 tornado学习笔记day07 tornado学习笔记day08
http://www.pierceye.com/news/472046/

相关文章:

  • 垂直门户网站都有什么网站首页index.html
  • wordpress网站加载效果线上推销的方法
  • 网站都有什么语言杭州网络营销公司
  • 济南高新网站制作正规seo排名外包
  • 网站方案讲解技巧ppt的免费网站
  • 个人网站名称有哪些WordPress dux修改
  • 普法网站建设方案app制作开发公司怎么收费
  • 网站平台建设哪家公司好网站建设建站在线建站
  • 龙岗区住房和建设局在线网站网站如何做团购
  • 河南省建设监理协会网站证书查询wordpress 修改链接
  • 做网站业务员怎么样深圳福田最新新闻事件
  • 衡水商城网站建设外贸汽车配件做那个网站
  • 做网站的色彩搭配的小知识群艺馆网站建设方案
  • 深圳 汽车网站建设学习网站建设培训
  • 制作手机网站用什么软件唐山网站专业制作
  • 网站后台如何登陆互联网营销中心
  • 做排行榜的网站知乎长沙服务好的网络营销
  • 做网站猫要做端口映射吗太原网站建设口碑推荐
  • 新闻门户网站是什么快速搭建网页
  • 随意设计一个网站域名是什么?
  • 找人做网站需要准备什么材料用视频做网站背景
  • 大连做网站首选领超科技wordpress注册邮件发送设置
  • 西山区城市建设局网站如何做防水网站
  • 商务网站建设的组成包括自动链接 wordpress
  • 网站如何关闭东莞网站开发推荐
  • 自己开网站能赚钱吗网站界面设计描述
  • 二手交易网站建设方案ppt网站备案的作用
  • 北京行业网站建设临沂谁会做网站
  • 网站备案 游戏修改wordpress字体
  • 福建微网站建设价格宝山专业网站建设