我在网上看到的很多 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 更好/更安全?
如果您使用 POST 请求,则表单数据将被发送到请求正文而不是作为 URL 的一部分,这有助于保留用户信息。安全,因为它在地址栏或服务器日志中不可见。
此外,在使用 POST 请求时,您可以提供跨站请求伪造(CSRF)令牌来防御 CSRF 攻击,服务器会进行验证以确保请求合法。这就是为什么使用它更安全,而且我以你的方式,方法属性没有任何用处,所以删除它不会改变任何东西,但你应该在这些类型的过程中始终检查 POST 请求。