对URL进行安全验证

  1. 虽然我们已经实现了重定向会上一个页面的功能,但是安全问题不容忽视,鉴于referernext容易被串篡改的特性,我们需要对这些值进行验证,否则会形成开放重定向漏洞
  1.  
  1. URL中的next参数为例,next变量以字符串的形式写在url里,因此任何人都可以发给某个用户一个包含next变量指向任何站点的连接,那么就会误导用户进入钓鱼网站。
  1.  
  1. 我们可以验证next变量指向的url地址是否属于我们的应用内,否则不允许重定向。
  1.  
  1. 确保URL安全的关键是判断URL是否属于程序内部,可以通过判断urlhost、协议等信息是否和程序内部的url一致,如果一致则认识是可信的url
  1.  
  1. 代码中is_safe_url()方法接受目标URL作为参数,通过request.host_url获取程序内部的主机URL,然后使用urljoin()函数将目标URL转为绝对URL。接着,分别使用urlparse模块提供的urlparse()解析两个url,最后对目标urlurl模式和主机地址进行验证,确保只属于程序内部的url才会被返回。
  1. 在执行重定向会上一个页面的redirect_back()函数中,使用is_safe_url()验证nextreferer的值
  1. from urlparse import urlparse, urljoin #python3需要从urllib.parse导入
  2. from flask import request
  3.  
  4. @app.route('/bar')
  5. def bar():
  6.     print "request.full_path:",request.full_path
  7.     return '<h1>Bar page</h1><a href="%s">Do something and redirect </a>' % url_for('do_something', next = request.full_path)
  8.  
  9. @app.route('/do_something_and_redirect')
  10. def do_something():
  11.     return redirect_back()
  1. def is_safe_url(target):
  2.     print "request.host_url:",request.host_url
  3.     ref_url = urlparse(request.host_url)
  4.     print "ref_url:",ref_url
  5.     print "target:",target
  6.     test_url = urlparse(urljoin(request.host_url, target))
  7.     print "test_url:",test_url
  8.     print "ref_url.netloc:",ref_url.netloc
  9.     print "test_url.netloc:",test_url.netloc
  10.     print "test_url.scheme:",test_url.scheme
  11.     return test_url.scheme in ('http', 'https') and ref_url.netloc ==test_url.netloc
  12.  
  13. def redirect_back(default = 'hello',**kwargs):
  14.     for target in request.args.get('next'),request.referrer:
  15.         if target:
  16.             if is_safe_url(target):
  17.                 return redirect(target)
  18.     return redirect(url_for(default,**kwargs))
  19.  
  20. if __name__ == '__main__':
  21.     app.run(debug = True)

结果:

控制台输出:

request.host_url: http://127.0.0.1:5000/

ref_url: ParseResult(scheme=u'http', netloc=u'127.0.0.1:5000', path=u'/', params='', query='', fragment='')

target: /bar?

test_url: ParseResult(scheme=u'http', netloc=u'127.0.0.1:5000', path=u'/bar', params='', query='', fragment='')

ref_url.netloc: 127.0.0.1:5000

test_url.netloc: 127.0.0.1:5000

test_url.scheme: http

request.full_path: /bar?

页面:

flask 对URL进行安全验证的更多相关文章

  1. Django和Flask对于URL尾斜杠(back slash)的处理

    最近在看Flask,其中提到了对于URL尾斜杠的处理.感觉算是一个需要注意的地方吧,就和Django的处理方式来进行一个简单的对比. 首先说下什么是尾斜杠. http://www.baidu.com/ ...

  2. MVC验证12-使用DataAnnotationsExtensions对整型、邮件、最小值、文件类型、Url地址等验证

    原文:MVC验证12-使用DataAnnotationsExtensions对整型.邮件.最小值.文件类型.Url地址等验证 本文体验来自http://dataannotationsextension ...

  3. flask之URL和视图(一)

    1.Flask URL和视图 1.1.第一个flask程序 from flask import Flask #创建一个Flask对象,传递__name__参数进去 app = Flask(__name ...

  4. 带领技术小白入门——基于java的微信公众号开发(包括服务器配置、java web项目搭建、tomcat手动发布web项目、微信开发所需的url和token验证)

    微信公众号对于每个人来说都不陌生,但是许多人都不清楚是怎么开发的.身为技术小白的我,在闲暇之余研究了一下基于java的微信公众号开发.下面就是我的实现步骤,写的略显粗糙,希望大家多多提议! 一.申请服 ...

  5. 项目一:第十二天 1、常见权限控制方式 2、基于shiro提供url拦截方式验证权限 3、在realm中授权 5、总结验证权限方式(四种) 6、用户注销7、基于treegrid实现菜单展示

    1 课程计划 1. 常见权限控制方式 2. 基于shiro提供url拦截方式验证权限 3. 在realm中授权 4. 基于shiro提供注解方式验证权限 5. 总结验证权限方式(四种) 6. 用户注销 ...

  6. 【Python】Flask系列-URL和视图笔记

    1.学习目标 熟悉Flask相关知识. 熟悉web开发流程. 能独立开发Flask项目. 2.环境配置 Python虚拟环境安装 因为python的框架更新迭代太快了,有时候需要在电脑上存在一个框架的 ...

  7. Flask 编写一个授权登录验证的模块(二)

    本篇比上一篇多了重定向的功能 #!/usr/bin/env python # -*- coding: utf-8 -*- #python3 import base64 import random im ...

  8. flask笔记---url、变量规则

    1.路由: route() 装饰器用于把一个函数绑定到一个 URL,可以动态变化 URL 的某些部分,还可以为一个函数指定多个规则,从而方便用户访问与记忆. 例子: @app.route('/') # ...

  9. flask 在视图函数中验证表单

    在视图函数中验证表单 因为现在的basic_form视图同时接受两种类型的请求:GET请求和POST请求.所以我们要根据请求方法的不同执行不同的代码.具体来说,首先是实例化表单,如果是GET请求,就渲 ...

随机推荐

  1. Asp.net Mvc Ajax.BeginForm提交表单

    之前Mvc中一直用Html.BeginForm提交表单,即如下: @using (Html.BeginForm("Add", "News", FormMetho ...

  2. 【JMeter】【性能测试】参数化,内存溢出问题

    这一篇文章随便说一下JMETER的脚本参数化 1:Parameters的两种参数化方法 1.1:函数助手参数化 首先准备你的参数数据.我在bin/data中新建了一个dat文件,记事本另存为修改编码为 ...

  3. java装配bean

    java装配bean,可以自动装配,也可以显式装配: 1.通过组件扫描自动装配bean 因为使用了Configuration注解,表明这个类是一个配置类,该类应该包含在spring应用上下文如何创建b ...

  4. (1.10)SQL优化——mysql 常见SQL优化

    (1.10)常用SQL优化 insert优化.order by 优化 1.insert 优化 2.order by 优化 [2.1]mysql排序方式: (1)索引扫描排序:通过有序索引扫描直接返回有 ...

  5. Linux安装go

    在 http://golang.org/dl/下载最新的linux版本,并把它提取到/usr/local目录,在此目录下进行解压缩 $ sudo tar -xzf go1.9.1.linux-amd6 ...

  6. 这可能是由于 CredSSP 加密 Oracle 修正。

    1.Win+R 输入regedit打开注册表 找到对应的以下目录 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Polici ...

  7. RCNN

    [Rich feature hierarchies for accurate object detection and semantic segmentation] 技术路线:selective se ...

  8. vue中自定义软键盘

    https://segmentfault.com/a/1190000012568480

  9. 三维bfs(HUD1253胜利大逃亡)

    #include <stdio.h>#include <string.h>int map[51][51][51];int v[51][51][51];int a,b,c,t11 ...

  10. SSLServerSocket代码实现

    理解一个设计思想,结合代码是最好的途径.安全套接字服务端的实现代码如下: X509TrustManager MyX509TrustManager = new X509TrustManager() { ...