Files
codeql/python/ql/test/query-tests/Security/CWE-020/urltest.py
2020-06-19 16:51:09 +02:00

51 lines
1.3 KiB
Python

from flask import Flask, request, redirect
from urllib.parse import urlparse
app = Flask(__name__)
@app.route('/some/path/bad1')
def unsafe1(request):
target = request.args.get('target', '')
if "example.com" in target:
return redirect(target)
@app.route('/some/path/bad2')
def unsafe2(request):
target = request.args.get('target', '')
if target.endswith("example.com"):
return redirect(target)
#Simplest and safest approach is to use an allowlist
@app.route('/some/path/good1')
def safe1(request):
allowlist = [
"example.com/home",
"example.com/login",
]
target = request.args.get('target', '')
if target in allowlist:
return redirect(target)
#More complex example allowing sub-domains.
@app.route('/some/path/good2')
def safe2(request):
target = request.args.get('target', '')
host = urlparse(target).hostname
#Note the '.' preceding example.com
if host and host.endswith(".example.com"):
return redirect(target)
@app.route('/some/path/good3')
def safe3(request):
target = request.args.get('target', '')
target = urlparse(target)
#Start url with https:// and ends with a / so must match the correct domain.
if target and target.startswith("https://example.com/"):
return redirect(target)