鱼C论坛

 找回密码
 立即注册
查看: 1839|回复: 0

[技术交流] FLASK-is_safe_url()函数的了解(flask 对URL进行安全验证 --)

[复制链接]
发表于 2020-6-23 17:03:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 金刚 于 2020-6-23 17:31 编辑

对URL进行安全验证

虽然我们已经实现了重定向会上一个页面的功能,但是安全问题不容忽视,鉴于referer和next容易被串篡改的特性,我们需要对这些值进行验证,否则会形成开放重定向漏洞

以URL中的next参数为例,next变量以字符串的形式写在url里,因此任何人都可以发给某个用户一个包含next变量指向任何站点的连接,那么就会误导用户进入钓鱼网站。

我们可以验证next变量指向的url地址是否属于我们的应用内,否则不允许重定向。

确保URL安全的关键是判断URL是否属于程序内部,可以通过判断url的host、协议等信息是否和程序内部的url一致,如果一致则认识是可信的url

代码中is_safe_url()方法接受目标URL作为参数,通过request.host_url获取程序内部的主机URL,然后使用urljoin()函数将目标URL转为绝对URL。接着,分别使用urlparse模块提供的urlparse()解析两个url,最后对目标url的url模式和主机地址进行验证,确保只属于程序内部的url才会被返回。

在执行重定向会上一个页面的redirect_back()函数中,使用is_safe_url()验证next和referer的值


代码:


  1. # from urlparse import urlparse, urljoin  # python3需要从urllib.parse导入
  2. from urllib.parse import urlparse, urljoin

  3. from flask import request, Flask, url_for, redirect


  4. app = Flask(__name__)


  5. @app.route('/bar')
  6. def bar():

  7.     print("request.full_path:", request.full_path)

  8.     return '<h1>Bar page</h1><a href="%s">Do something and redirect </a>' % url_for('do_something', next=request.full_path)


  9. @app.route('/do_something_and_redirect')
  10. def do_something():

  11.     return redirect_back()

  12. def is_safe_url(target):

  13.     print("request.host_url:", request.host_url)

  14.     ref_url = urlparse(request.host_url)

  15.     print("ref_url:", ref_url)

  16.     print("target:", target)

  17.     test_url = urlparse(urljoin(request.host_url, target))

  18.     print("test_url:", test_url)

  19.     print("ref_url.netloc:", ref_url.netloc)

  20.     print("test_url.netloc:", test_url.netloc)

  21.     print("test_url.scheme:", test_url.scheme)

  22.     return test_url.scheme in ('http', 'https') and ref_url.netloc == test_url.netloc


  23. def redirect_back(default='hello', **kwargs):

  24.     for target in request.args.get('next'), request.referrer:

  25.         if target:

  26.             if is_safe_url(target):

  27.                 return redirect(target)

  28.     return redirect(url_for(default, **kwargs))


  29. if __name__ == '__main__':

  30.     app.run(debug=True)
复制代码



命令行输出:

  1. PS C:\Users\qingming_wu\Desktop\8888\1\test2> dir


  2.     目录: C:\Users\qingming_wu\Desktop\8888\1\test2


  3. Mode                LastWriteTime     Length Name
  4. ----                -------------     ------ ----
  5. -a---         2020/6/23     10:36       1120 .tags
  6. -a---         2020/6/23     10:36       1120 .tags_sorted_by_file
  7. -a---         2020/6/22     14:15        353 test2.py
  8. -a---         2020/6/23     16:56       1375 test3.py


  9. PS C:\Users\qingming_wu\Desktop\8888\1\test2> python .\test3.py
  10. * Serving Flask app "test3" (lazy loading)
  11. * Environment: production
  12.    WARNING: This is a development server. Do not use it in a production deployment.
  13.    Use a production WSGI server instead.
  14. * Debug mode: on
  15. * Restarting with stat
  16. * Debugger is active!
  17. * Debugger PIN: 982-552-509
  18. * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
  19. request.full_path: /bar?
  20. 127.0.0.1 - - [23/Jun/2020 17:16:23] "GET /bar HTTP/1.1" 200 -
  21. 127.0.0.1 - - [23/Jun/2020 17:16:24] "GET /favicon.ico HTTP/1.1" 404 -
  22. request.host_url: http://127.0.0.1:5000/
  23. ref_url: ParseResult(scheme='http', netloc='127.0.0.1:5000', path='/', params='', query='', fragment='')
  24. target: /bar?
  25. test_url: ParseResult(scheme='http', netloc='127.0.0.1:5000', path='/bar', params='', query='', fragment='')
  26. ref_url.netloc: 127.0.0.1:5000
  27. test_url.netloc: 127.0.0.1:5000
  28. test_url.scheme: http
  29. 127.0.0.1 - - [23/Jun/2020 17:16:27] "GET /do_something_and_redirect?next=%2Fbar%3F HTTP/1.1" 302 -
  30. request.full_path: /bar?
  31. 127.0.0.1 - - [23/Jun/2020 17:16:27] "GET /bar HTTP/1.1" 200 -
复制代码



运行图示

cmd_activate.gif


参考文章:
        https://www.cnblogs.com/xiaxiaoxu/p/10409886.html





本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-27 18:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表