当我使用request.form.get()时,我是否需要验证登录请求是POST

问题描述 投票:0回答:1

我在网上看到的很多 Flask 中登录路由的代码看起来都是这样的,

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST': 
        password = request.form.get('password')
        if password == "pass":
            #login
            return redirect('/index')
    return render_template(login.html)

对于

<form action='/login' method='POST'>
    <input type='password' id="pass' name='pass'>
    <input type='submit' value='Login'>
</form>

但是我最初写的方式是,

@app.route('/login', methods=['GET', 'POST'])
def login():
    password = request.form.get('password')
    if password == "pass":
        #login
        return redirect('/index')
    return render_template(login.html)

即,不首先检查请求是否为 POST。两者都有效,但从我在网上读到的内容来看,前者被认为更安全 - 有人可以告诉我为什么吗?

如果我们有类似的东西

password = request.args.get('password')

然后我就明白为什么不检查请求是否是 POST 可能会不太安全,因为我们可以使用 URL 登录,

/login?password=pass

在URL中显示密码,更容易被暴力破解。但这是我的理解

request.forms.get('password')

无法以同样的方式通过 URL 进行操作。那么为什么检查 POST 更好/更安全?

python authentication flask flask-login
1个回答
0
投票

如果您使用 POST 请求,则表单数据将被发送到请求正文而不是作为 URL 的一部分,这有助于保留用户信息。安全,因为它在地址栏或服务器日志中不可见。

此外,在使用 POST 请求时,您可以提供跨站请求伪造(CSRF)令牌来防御 CSRF 攻击,服务器会进行验证以确保请求合法。这就是为什么使用它更安全,而且我以你的方式,方法属性没有任何用处,所以删除它不会改变任何东西,但你应该在这些类型的过程中始终检查 POST 请求。

© www.soinside.com 2019 - 2024. All rights reserved.