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

做箱包外贸哪个网站好东营市造价信息网

做箱包外贸哪个网站好,东营市造价信息网,网站流量的做,网站二级域名怎么解析Python学习之路-Tornado基础:安全应用 Cookie 对于RequestHandler#xff0c;除了在初始Tornado中讲到的之外#xff0c;还提供了操作cookie的方法。 设置 set_cookie(name, value, domainNone, expiresNone, path‘/’, expires_daysNone) 参数说明#xff1a; 参数名…Python学习之路-Tornado基础:安全应用 Cookie 对于RequestHandler除了在初始Tornado中讲到的之外还提供了操作cookie的方法。 设置 set_cookie(name, value, domainNone, expiresNone, path‘/’, expires_daysNone) 参数说明 参数名说明namecookie名valuecookie值domain提交cookie时匹配的域名path提交cookie时匹配的路径expirescookie的有效期可以是时间戳整数、时间元组或者datetime类型为UTC时间expires_dayscookie的有效期天数优先级低于expires import datetimeclass IndexHandler(RequestHandler):def get(self):self.set_cookie(n1, v1)self.set_cookie(n2, v2, path/new, expirestime.strptime(2016-11-11 23:59:59,%Y-%m-%d %H:%M:%S))self.set_cookie(n3, v3, expires_days20)# 利用time.mktime将本地时间转换为UTC标准时间self.set_cookie(n4, v4, expirestime.mktime(time.strptime(2016-11-11 23:59:59,%Y-%m-%d %H:%M:%S)))self.write(OK)原理 设置cookie实际就是通过设置header的Set-Cookie来实现的。 class IndexHandler(RequestHandler):def get(self):self.set_header(Set-Cookie, n5v5; expiresFri, 11 Nov 2016 15:59:59 GMT; Path/) self.write(OK)获取 get_cookie(name, defaultNone) 获取名为name的cookie可以设置默认值。 class IndexHandler(RequestHandler):def get(self):n3 self.get_cookie(n3)self.write(n3)清除 clear_cookie(name, path‘/’, domainNone) 删除名为name并同时匹配domain和path的cookie。 clear_all_cookies(path‘/’, domainNone) 删除同时匹配domain和path的所有cookie。 class ClearOneCookieHandler(RequestHandler):def get(self):self.clear_cookie(n3)self.write(OK)class ClearAllCookieHandler(RequestHandler):def get(self):self.clear_all_cookies()self.write(OK){{ admonition warning “注意” true }} 执行清除cookie操作后并不是立即删除了浏览器中的cookie而是给cookie值置空并改变其有效期使其失效。真正的删除cookie是由浏览器去清理的。 {{ /admonition }} 安全Cookie Cookie是存储在客户端浏览器中的很容易被篡改。Tornado提供了一种对Cookie进行简易加密签名的方法来防止Cookie被恶意篡改。 使用安全Cookie需要为应用配置一个用来给Cookie进行混淆的秘钥cookie_secret将其传递给Application的构造函数。我们可以使用如下方法来生成一个随机字符串作为cookie_secret的值。 import base64, uuidbase64.b64encode(uuid.uuid4().bytes uuid.uuid4().bytes) 2hcicVuTqShDpfsjMWQLZ0Mkq5NPEWSk9fi0zsSt3A{{ admonition tip “提示” true }} Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64所以每6个比特为一个单元对应某个可打印字符。三个字节有24个比特对应于4个Base64单元即3个字节需要用4个可打印字符来表示。 uuid, 通用唯一识别码英语Universally Unique Identifier简称UUID是由一组32个16进制数字所构成两个16进制数是一个字节总共16字节因此UUID理论上的总数为16322128约等于3.4 x 10^38。也就是说若每纳秒产生1兆个UUID要花100亿年才会将所有UUID用完。 uuid模块的uuid4()函数可以随机产生一个uuid码bytes属性将此uuid码作为16字节字符串。 {{ /admonition }} 将生成的cookie_secret传入Application构造函数 app tornado.web.Application([(r/, IndexHandler),],cookie_secret 2hcicVuTqShDpfsjMWQLZ0Mkq5NPEWSk9fi0zsSt3A )获取和设置 set_secure_cookie(name, value, expires_days30) 设置一个带签名和时间戳的cookie防止cookie被伪造。 get_secure_cookie(name, valueNone, max_age_days31) 如果cookie存在且验证通过返回cookie的值否则返回None。max_age_day不同于expires_daysexpires_days是设置浏览器中cookie的有效期而max_age_day是过滤安全cookie的时间戳。 class IndexHandler(RequestHandler):def get(self):cookie self.get_secure_cookie(count)count int(cookie) 1 if cookie else 1self.set_secure_cookie(count, str(count))self.write(htmlheadtitleCookie计数器/title/headbodyh1您已访问本页%d次。/h1 % count /body/html)我们看签名后的cookie值 2|1:0|10:1476412069|5:count|4:NQ|cb5fc1d4434971de6abf87270ac33381c686e4ec8c6f7e62130a0f8cbe5b7609字段说明 安全cookie的版本默认使用版本2不带长度说明前缀默认为0时间戳cookie名base64编码的cookie值签名值不带长度说明前缀 {{ admonition warning “注意” true }} Tornado的安全cookie只是一定程度的安全仅仅是增加了恶意修改的难度。Tornado的安全cookies仍然容易被窃听而cookie值是签名不是加密攻击者能够读取已存储的cookie值并且可以传输他们的数据到任意服务器或者通过发送没有修改的数据给应用伪造请求。因此避免在浏览器cookie中存储敏感的用户数据是非常重要的。 {{ /admonition }} XSRF 跨站请求伪造 先建立一个网站127.0.0.1:8000使用上一节中的Cookie计数器 class IndexHandler(RequestHandler):def get(self):cookie self.get_secure_cookie(count)count int(cookie) 1 if cookie else 1self.set_secure_cookie(count, str(count))self.write(htmlheadtitleCookie计数器/title/headbodyh1您已访问本页%d次。/h1 % count /body/html)再建立一个网站127.0.0.1:9000 class IndexHandler(RequestHandler):def get(self):self.write(htmlheadtitle被攻击的网站/title/headbodyh1此网站的图片链接被修改了/h1img alt这应该是图片 srchttp://127.0.0.1:8000/?f9000//body/html)在9000网站我们模拟攻击者修改了我们的图片源地址为8000网站的Cookie计数器页面网址。当我们访问9000网站的时候在我们不知道、未授权的情况下8000网站的Cookie被使用了以至于让8000网址认为是我们自己调用了8000网站的逻辑。这就是CSRFCross-site request forgery跨站请求伪造跨站攻击或跨域攻击的一种通常缩写为CSRF或者XSRF。 我们刚刚使用的是GET方式模拟的攻击为了防范这种方式的攻击任何会产生副作用的HTTP请求比如点击购买按钮、编辑账户设置、改变密码或删除文档都应该使用HTTP POST方法或PUT、DELETE。但是这并不足够一个恶意站点可能会通过其他手段来模拟发送POST请求保护POST请求需要额外的策略。 XSRF保护 {{ admonition tip “提示” true }} 浏览器有一个很重要的概念——同源策略(Same-Origin Policy)。 所谓同源是指域名协议端口相同。 不同源的客户端脚本(javascript、ActionScript)在没明确授权的情况下不能读写对方的资源。 {{ /admonition }} 由于第三方站点没有访问cookie数据的权限同源策略所以我们可以要求每个请求包括一个特定的参数值作为令牌来匹配存储在cookie中的对应值如果两者匹配我们的应用认定请求有效。而第三方站点无法在请求中包含令牌cookie值这就有效地防止了不可信网站发送未授权的请求。 开启XSRF保护 要开启XSRF保护需要在Application的构造函数中添加xsrf_cookies参数 app tornado.web.Application([(r/, IndexHandler),],cookie_secret 2hcicVuTqShDpfsjMWQLZ0Mkq5NPEWSk9fi0zsSt3A,xsrf_cookies True )当这个参数被设置时Tornado将拒绝请求参数中不包含正确的_xsrf值的POST、PUT和DELETE请求。 class IndexHandler(RequestHandler):def post(self):self.write(hello itcast)用不带_xsrf的post请求时报出了HTTP 403: Forbidden (_xsrf argument missing from POST)的错误。 模板应用 在模板中使用XSRF保护只需在模板中添加 module xsrf_form_html()如新建一个模板index.html !DOCTYPE html html headtitle测试XSRF/title /head bodyform methodpostinput typetext namemessage/input typesubmit valuePost//form /body /html后端 class IndexHandler(RequestHandler):def get(self):self.render(index.html)def post(self):self.write(hello itcast)模板中添加的语句帮我们做了两件事 为浏览器设置了_xsrf的Cookie注意此Cookie浏览器关闭时就会失效为模板的表单中添加了一个隐藏的输入名为_xsrf其值为_xsrf的Cookie值 渲染后的页面原码如下 !DOCTYPE html htmlheadtitle测试XSRF/title/headbodyform methodpostinput typehidden name_xsrf value2|543c2206|a056ff9e49df23eaffde0a694cde2b02|1476443353/input typetext namemessage/input typesubmit valuePost//form/body /html非模板应用 对于不使用模板的应用来说首先要设置_xsrf的Cookie值可以在任意的Handler中通过获取self.xsrf_token的值来生成_xsrf并设置Cookie。 下面两种方式都可以起到设置_xsrf Cookie的作用。 class XSRFTokenHandler(RequestHandler):专门用来设置_xsrf Cookie的接口def get(self):self.xsrf_tokenself.write(Ok)class StaticFileHandler(tornado.web.StaticFileHandler):重写StaticFileHandler构造时触发设置_xsrf Cookiedef __init__(self, *args, **kwargs):super(StaticFileHandler, self).__init__(*args, **kwargs)self.xsrf_token对于请求携带_xsrf参数有两种方式 若请求体是表单编码格式的可以在请求体中添加_xsrf参数若请求体是其他格式的如json或xml等可以通过设置HTTP头X-XSRFToken来传递_xsrf值 请求体携带_xsrf参数 新建一个页面xsrf.html !DOCTYPE html html headmeta charsetutf-8title测试XSRF/title /head bodya hrefjavascript:; onclickxsrfPost()发送POST请求/ascript srchttp://cdn.bootcss.com/jquery/3.1.1/jquery.min.js/scriptscript typetext/javascript//获取指定Cookie的函数function getCookie(name) {var r document.cookie.match(\\b name ([^;]*)\\b);return r ? r[1] : undefined;}//AJAX发送post请求表单格式数据function xsrfPost() {var xsrf getCookie(_xsrf);$.post(/new, _xsrfxsrfkey1value1, function(data) {alert(OK);});}/script /body /htmlHTTP头X-XSRFToken 新建一个页面json.html !DOCTYPE html html headmeta charsetutf-8title测试XSRF/title /head bodya hrefjavascript:; onclickxsrfPost()发送POST请求/ascript srchttp://cdn.bootcss.com/jquery/3.1.1/jquery.min.js/scriptscript typetext/javascript//获取指定Cookie的函数function getCookie(name) {var r document.cookie.match(\\b name ([^;]*)\\b);return r ? r[1] : undefined;}//AJAX发送post请求json格式数据function xsrfPost() {var xsrf getCookie(_xsrf);var data {key1:1,key1:2};var json_data JSON.stringify(data);$.ajax({url: /new,method: POST,headers: {X-XSRFToken:xsrf,},data:json_data,success:function(data) {alert(OK);}})}/script /body /html用户验证 简介 用户验证是指在收到用户请求后进行处理前先判断用户的认证状态如登陆状态若通过验证则正常处理否则强制用户跳转至认证页面如登陆页面。 authenticated装饰器 为了使用Tornado的认证功能我们需要对登录用户标记具体的处理函数。我们可以使用tornado.web.authenticated装饰器完成它。当我们使用这个装饰器包裹一个处理方法时Tornado将确保这个方法的主体只有在合法的用户被发现时才会调用。 class ProfileHandler(RequestHandler):tornado.web.authenticateddef get(self):self.write(这是我的个人主页。)get_current_user()方法 装饰器tornado.web.authenticated的判断执行依赖于请求处理类中的self.current_user属性如果current_user值为假None、False、0、等任何GET或HEAD请求都将把访客重定向到应用设置中login_url指定的URL而非法用户的POST请求将返回一个带有403Forbidden状态的HTTP响应。 在获取self.current_user属性的时候tornado会调用get_current_user()方法来返回current_user的值。也就是说我们验证用户的逻辑应写在get_current_user()方法中若该方法返回非假值则验证通过否则验证失败。 class ProfileHandler(RequestHandler):def get_current_user(self):在此完成用户的认证逻辑user_name self.get_argument(name, None)return user_name tornado.web.authenticateddef get(self):self.write(这是我的个人主页。)login_url设置 当用户验证失败时将用户重定向到login_url上所以我们还需要在Application中配置login_url。 class LoginHandler(RequestHandler):def get(self):在此返回登陆页面self.write(登陆页面)app tornado.web.Application([(r/, IndexHandler),(r/profile, ProfileHandler),(r/login, LoginHandler),],login_url:/login )在login_url后面补充的next参数就是记录的跳转至登录页面前的所在位置所以我们可以使用next参数来完成登陆后的跳转。 修改登陆逻辑 class LoginHandler(RequestHandler):def get(self):登陆处理完成登陆后跳转回前一页面next self.get_argument(next, /)self.redirect(next?namelogined)
http://www.pierceye.com/news/961331/

相关文章:

  • 吉木萨尔县建设局网站岳阳网站推广
  • 九宫格网站模板本机网站环境搭建
  • 自学网站建设 难吗企业网站制作公司合肥
  • 网站建设的网页怎么做餐饮装修公司推荐
  • 网站页面是自己做还是使用模板惠州seo外包费用
  • 深圳专业网站建设技术郑州网络推广平台有哪些
  • 网站建设的费用预算怎么查自己名下有没有注册公司
  • 深圳医院网站建设网站产品页模板
  • 文化馆网站建设做直播的网站有哪些
  • 网站首页怎样排版如何把网站放在根目录
  • 昭通网站开发公司企业网站包含的要素
  • 网站手机版下悬浮条怎么做农产品信息网站的建设
  • 有关网站开发的文章做微商网站的软文
  • 做网站公司起什么名字西安官网seo技术
  • zepto网站开发用帝国cms做的网站首页
  • 手机影视网站制作一站式服务大厅官网
  • 创意网站展示汕尾百度seo公司
  • 网站被spider重复抓取自主建站网站平台
  • 网站打开小企业网站建设哪里做得好
  • 网站开发+进度表什么牛网站建设
  • 不同类型网站比较及网站域名设计整站优化
  • 高端企业网站建设规定陕西关键词优化推荐
  • 做图表的网站推荐简单的个人网站模板
  • 淄博瓷砖网站建设中企动力永久免费虚拟主机
  • 厦门网站建设创建有哪些python wordpress采集
  • 如何建立网站链接百度账号设置
  • 网站的申请淄博市住房和城乡建设厅网站
  • 重庆网站设计开发杂志网站模板
  • 网站建设需要营业执照吗建站之星源码下载
  • 网站建设需要基础吗做游戏的软件app