使用JavaScript POST在Tornado中转义xsrf

时间:2018-08-08 18:29:09

标签: javascript python-3.x post tornado

我有一个简单的表单要提交给龙卷风POST,并且我在龙卷风中运行xsrf。以下产生已知的错误:POST中缺少'_ xsrf'参数

有人解决了如何使用JavaScript以常规HTML格式提交xsrf(例如 {%module xsrf_form_html()%} )吗?这是代码:

<form action="#" id="form_field">
    {% raw xsrf_form_html() %}  # DOES NOT WORK!
   <p><input type="text" id="field1" value=""></p>
</form>

<button id="button">UPDATE</button>

<script>
  button.onclick = function changeField() {
    var xhr = new XMLHttpRequest();
        xhr.open("POST", "/chatdata", true);
        xhr.setRequestHeader('Content-Type', 'application/json');
        xhr.send(JSON.stringify({
            value: document.getElementById("field1").value
        }))
    };
</script>

2 个答案:

答案 0 :(得分:0)

According to the documentation page,您将只创建一个具有_xsrf请求字段的请求,例如x-www-urlencoded的{​​{1}}字符串。拥有的方式是,您只发送一些具有_xsrf=yourtoken属性的JSON,即value

现在,您可以通过设置cookie或通过{"value":"token"}调用生成的字段,以几种方式从我所看到的中获取令牌。

来自cookie

xsrf_form_html()

请注意,您必须直接或通过类似jQuery's serialize()

的库方法来构建包含其他输入表单字段的字符串。

如果只想直接使用表单中的数据,而不必麻烦地抓住每个输入并自己生成一个适当的x-www-urlencoded字符串;然后继续使用//helper function to read cookie, from http://www.tornadoweb.org/en/stable/guide/security.html sample function getCookie(name) { var r = document.cookie.match("\\b" + name + "=([^;]*)\\b"); return r ? r[1] : undefined; } var data = "_xsrf="+getCookie('_xsrf'); //note using this method you don't set the content-type, //you want it to default to x-www-urlencoded xhr.send(data); 并从该表单创建一个FormData对象并将其发送。当您将表单元素传递给xsrf_form_html()时,它将为您收集所有输入值。

FormData()

如果您不知道如何直接获取对生成的字段的引用,则使用FormData会有所帮助。尽管很有可能会有var data = new FormData( document.getElementById('form_field') ); //again no need to set the content-type as it will be automatically set internally xhr.send(data); //You could also use library methods like jQuery's serialize() var data = jQuery('#form_field').serialize(); xhr.send(data); ,所以应该选择name="_xsrf"之类的选择器。虽然您必须查看生成的html才能找到答案。

input[name="_xsrf"]

答案 1 :(得分:0)

xsrf_form_html适用于使用x-www-form-urlencoded的传统html表单。如果您将表单提交为JSON,则不会被识别。要在Tornado的XSRF保护中使用基于非格式的编码,请将XSRF令牌作为X-XSRF-Token HTTP标头传递。