1. 程式人生 > >django CXRF介紹

django CXRF介紹

input method http 文件中 lan for domain strong dom

CSRF(Cross-site request forgery)跨站請求偽造,是攻擊者利用用戶的身份操作用戶帳戶的一種攻擊方式。和XSS攻擊一樣,存在巨大的危害性。

一、攻擊方法

1、低級的CXRF攻擊

A、加關註的GET接口,blogUserGuid參數明顯是被關註人Id,具有登陸態的用戶可以關註blogUserGuid對應的用戶

  http://www.cnblogs.com/mvc/Follow/FollowBlogger.aspx?blogUserGuid=4e8c33d0-77fe-df11-ac81-842b2b196315

B、攻擊辦法:

  攻擊者在一篇博文內容裏面寫一個img標簽:

  <img style="width:0;" src="http://www.cnblogs.com/mvc/Follow/FollowBlogger.aspx?blogUserGuid=4e8c33d0-77fe-df11-ac81-842b2b196315" />

  被攻擊者在具有登陸態的情況下,在同一個瀏覽器訪問加img標簽的博文,調用了關註接口,被動關註了blogUserGuid對應的用戶

2、中級的CXRF攻擊

上述的攻擊可以通過將接口改成post方法的方式規避;

  針對post方法,攻擊方法如下:第三方的頁面也可以使用包含form表單用於提交請求,如下,訪問包含了這些代碼的頁面,同樣被動調用接口

  技術分享圖片

二、防禦方法

現在業界對CSRF的防禦,一致的做法是使用一個Token(Anti CSRF Token)。 CSRF的Token僅僅用於對抗CSRF攻擊。當網站同時存在XSS漏洞時候,那這個方案也是空談。所以XSS帶來的問題,應該使用XSS的防禦方案予以解決。

三、django中的CXRF使用

1、django使用一個Token(Anti CSRF Token)通過中間件 django.middleware.csrf.CsrfViewMiddleware 來完成,在setting文件中設置,一旦設置了這個中間件,html頁面的form/ajax方式訪問view中的函數,都需要傳遞Token(Anti CSRF Token)

2、html頁面的form/ajax方式訪問view中的函數傳遞Token(Anti CSRF Token)的方式

<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<!-- form 提交數據產生csrf-token方式 {% csrf_token %}--->
<form action="/ss" method="post">
{% csrf_token %}
<input type="text" name="user"/>
<input type="text" name="pwd"/>
<input type="submit" value="提交"/>
</form>

<!-- ajax提交數據--->
<input type="button" onclick="Do();" value="Do it"/>
<!--引入jquery和jquery.cookie--->
<script src="/static/plugin/jquery/jquery-1.8.0.js"></script>
<script src="/static/plugin/jquery/jquery.cookie.js"></script>

<!-- ajax 提交數據,設置csrf-token方式 xhr.setRequestHeader("X-CSRFToken", csrftoken);--->
<script type="text/javascript">
var csrftoken = $.cookie(‘csrftoken‘);
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
function Do(){
$.ajax({
url:"/app01/test/",
data:{id:1},
type:‘POST‘,
success:function(data){
console.log(data);
}
});

}
</script>
</body>
</html>

django CXRF介紹