如何使用android避免CSRF失败?

时间:2013-12-03 12:42:49

标签: android django cookies

在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;
}

1 个答案:

答案 0 :(得分:2)

如果您有权访问服务器代码,则可以使用csrf_exempt装饰器删除对API视图的CSRF保护。 有关详细信息Do CSRF attacks apply to API's?

,请参阅此答案