Jak mohu bezpečně složit libovolně hluboké cestu k webapp (baňky, v tomto případě)?

hlasů
6

Mám formulář, který pošle řetězec do mého baňky app když je formulář zaslán. Řetězec je filepath, tak bych chtěl, aby se ujistil, že neobsahuje nic ošklivého, jako ../../../etc/passwd. Werkzeug, který baňky využívá, má praktický funkci nazvanou secure_filenameže proužky ošklivé věci z názvů souborů. Bohužel, když krmil úplnou cestu, jako templates/example.htmlto převádí /do _, takže jsme skončili s templates_example.html.

Zdá se rozumné, pak rozdělit cestu až do úrovně, tak i já posílám templatesa example.htmlodděleně a pak se k nim znovu dohromady na serveru. To funguje skvěle, kromě toho, že cesta může být libovolně hluboko. Mohl bych jen řetězec dohromady dir1/dir2/dir3/dir4a doufat, že nikdo každý jde hlouběji než dir4, ale to se zdá hloupý.

Jaký je správný způsob, jak zvládnout ověření drah neznámé hloubky? Ověřit jinak? Odesílat data jinak? Kódují dráhu jinak, pak jej dekódovat na serveru?

Položena 15/08/2011 v 20:31
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
2

Můžete použít werkzeug.routing.PathConverter zvládnout libovolné cesty jako tak:

from flask import Flask
app = Flask(__name__)

@app.route("/arbitrary/<path:my_path>")
def arbitrary_path(my_path):
    return my_path

if __name__ == "__main__":
    app.run()

S zjednodušené vzorek výše můžete vidět, že pokud navštívíte http://127.0.0.1:5000/arbitrary/dir1/dir2/dir3/dir4vrátí dir1/dir2/dir3/dir4, a pokud navštívíte http://127.0.0.1:5000/arbitrary/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dir10vrátídir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dir10

Odpovězeno 16/08/2011 v 19:33
zdroj uživatelem

hlasů
9

Pro situace, jako je tato baňka má safe_joincož vyvolává 404, pokud se uživatel pokusí opustit cestu:

>>> safe_join('/foo/bar', 'test')
'/foo/bar/test'
>>> safe_join('/foo/bar', 'test/../other_test')
'/foo/bar/other_test'
>>> safe_join('/foo/bar', 'test/../../../etc/htpassw')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/mitsuhiko/Development/flask/flask/helpers.py", line 432, in safe_join
    raise NotFound()
werkzeug.exceptions.NotFound: 404: Not Found
Odpovězeno 17/08/2011 v 11:47
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more