在Android应用中使用POST方法连接django服务器时出现CSRF失败。 httpResponse说如下:
禁止(403)
CSRF验证失败。请求中止。
失败原因:
未设置CSRF cookie。
通常,当存在真正的跨站点请求伪造,或者Django的CSRF机制未正确使用时,可能会发生这种情况。对于POST表单,您需要确保: 您的浏览器正在接受cookies。 视图函数使用RequestContext作为模板,而不是Context。 在模板中,每个POST表单中都有一个{%csrf_token%}模板标记,用于定位内部URL。 如果您不使用CsrfViewMiddleware,则必须在使用csrf_token模板标记的任何视图以及接受POST数据的视图上使用csrf_protect。 您正在看到此页面的帮助部分,因为您的Django设置文件中有DEBUG = True。将其更改为False,仅显示初始错误消息。 您可以使用CSRF_FAILURE_VIEW设置自定义此页面。
服务器似乎将我的代码视为攻击者。但是如何在android视图中添加CSRF模板?在我的应用程序中,没有任何形式。我很困惑。
而且,我的代码在这里:
public int login(){
try {
HttpPost httpPost = new HttpPost(loginURL);
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("username", userID));
params.add(new BasicNameValuePair("password", password));
httpPost.setEntity(new UrlEncodedFormEntity(params, "utf-8"));
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpResponse httpResponse = httpClient.execute(httpPost);
cookies = httpClient.getCookieStore().getCookies();
Log.e("Cookies", cookies.isEmpty() + "");
HttpEntity httpEntity = httpResponse.getEntity();
if(httpResponse.getStatusLine().getStatusCode() == 200){
Log.v("HTTPResponse", "200");
} else {
Log.v("HTTPResponse","" + httpResponse.getStatusLine().getStatusCode());
}
String result = EntityUtils.toString(httpEntity, "UTF-8");
} catch (MalformedURLException e){
Log.e("UserInfoCollectorMalformedURLException", e.toString());
return 0;
} catch (UnsupportedEncodingException e){
Log.e("UnsupportedIOException", e.toString());
return 5;
} catch (IOException e){
Log.e("UserInfoCollectorIOException", e.toString());
return 1;
} catch (ParseException e){
Log.e("ParseException", e.toString());
return 3;
}
Log.v("Login", "Unknown Error");
return 1000;
}
答案 0 :(得分:2)
如果您有权访问服务器代码,则可以使用csrf_exempt装饰器删除对API视图的CSRF保护。 有关详细信息Do CSRF attacks apply to API's?
,请参阅此答案