如何用CSRF tokens避免CSRF攻擊
CSRF(Cross-site request forgery)跨站請求偽造,也被稱為「One Click Attack」或者Session Riding,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。攻擊者可以使認證用戶提交表單數據給執行管理功能或修改個人設置的web服務。
錯誤配置
在一個典型的攻擊場景中,有合法網站現存會話的受害者被誘騙訪問惡意站點,使用用戶的會話session來觸發一些惡意動作。下面的代碼段就是攻擊者在沒有CSRF Token保護的站點執行攻擊的例子,代碼保存在攻擊者的站點上,但可以在合法用戶站點上執行。
Malicious website
Enter your name to find out your funny nickname:
Your name:
為了防止這類攻擊的產生,在每個請求中都要加入加密的安全隨機數(nonce)或哈希值,在執行敏感功能前都要進行驗證。
正確配置
大多數web框架都提供能生成安全CSRF token的中間件,主要有:
Django
2.在所有用戶可以提交POST數據的模板中加入特殊的csrf_token tag;
{% csrf_token %}
3. 確保CSRF上下文被傳遞給所有表達的視圖。如果之前沒有使用RequestContext就要手動設置;
Flask-WTF
在不進行任何配置的情況下,flask_wtf.Form就是一個可以保護CSRF的安全會話表單。
表單定義如下:
# form.py
from flask_wtf import Form
from wtforms import StringField
from wtforms.validators import DataRequired
class PersonForm(Form):
name = StringField("name", validators=[DataRequired()])
You need only include the form.hidden_tag() in your template definition:
{{ form.hidden_tag() }}
{{ form.name.label }} {{ form.name(size=20 }}
在任何需要驗證提交的表單時,CSRF token會自動被驗證。
# view.py
from form import PersonForm
@app.route("/submit", methods=("GET", "POST"))
def submit():
f = PersonForm()
if form.validate_on_submit():
# csrf token also validated
return redirect("/")
return render_template("view.html", form=f)
CSRF攻擊的結果
1.劫持合法的用戶會話;
2.可以訪問特權服務和功能;
3.可以修改受保護的數據。


※揭秘讓您正確識別和處理惡意郵件的五種方法
※知名比特幣網站bustabit價值$12,000的點擊劫持、XSS以及拒絕服務漏洞詳情揭秘
TAG:嘶吼RoarTalk |