我应该在哪里添加csrf令牌?

时间:2019-11-16 05:34:59

标签: html django jinja2

我真的不理解该html的大部分功能,因为我对html不满意。以及可以向我解释其中大部分内容的添加令牌的位置,将不胜感激

<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Raleway">
<link rel="stylesheet" href="static/css/body.css">
<body>

<div class="bgimg w3-display-container w3-text-black">
  <div class="w3-display-middle w3-jumbo">
    <button class=" w3-button w3-white">HSEA STOCK</button>
  </div>
  <div class="w3-display-topleft w3-container w3-xlarge ">
    <p><button onclick="document.getElementById('id01').style.display='block'" style="width:auto;">Login</button></p>
  </div>
</div>



<div id="id01" class="modal">

  <form class="modal-content animate" action="/login" method="POST">
    {% csrf_token %}
    <div class="imgcontainer">
      <span onclick="document.getElementById('id01').style.display='none'" class="close" title="Close Modal">&times;</span>
    </div>

    <div class="container">
      <label for="uname"><b>Username</b></label>
      <input type="text" placeholder="Enter Username" name="username" required

      <label for="psw"><b>Password</b></label>
      <input type="password" placeholder="Enter Password" name="passwword" required>

      <button type="submit">Login</button>
      <label>
        <input type="checkbox" checked="checked" name="remember"> Remember me
      </label>
    </div>

    <div class="container" style="background-color:#f1f1f1">
      <button type="button" onclick="document.getElementById('id01').style.display='none'" class="cancelbtn">Cancel</button>
      <span class="psw">Forgot <a href="#">password?</a></span>
    </div>
  </form>
</div>

<script>
// Get the modal
var modal = document.getElementById('id01');

// When the user clicks anywhere outside of the modal, close it
window.onclick = function(event) {
    if (event.target == modal) {
        modal.style.display = "none";
    }
}
</script>

</body>

很抱歉,如果该接缝非常明显,但是我没有进入此页面,并且我在为django添加csrf令牌时遇到麻烦。

3 个答案:

答案 0 :(得分:1)

要在视图中利用 CSRF 保护,请执行以下步骤:

  1. 默认情况下, MIDDLEWARE 中激活了CSRF中间件 设置。如果您覆盖该设置,请记住 'django.middleware.csrf.CsrfViewMiddleware' 应该先于 查看假定已处理CSRF攻击的中间件。
  2. 如果您禁用了此功能(不建议这样做),则可以在要保护的特定视图上使用 csrf_protect()
  3. 在使用POST表单的任何模板中,如果表单适用于以下形式,请在 csrf_token 元素内使用 <form> 标记内部网址,例如:

    <form method="post">{% csrf_token %}

  4. 对于以外部URL为目标的 POST 表单,不应这样做,因为这会导致CSRF令牌泄漏,从而导致漏洞。

  5. 在相应的视图功能中,确保使用 RequestContext 呈现响应,以便 {% csrf_token %} 可以正常工作。如果您使用的是 render() 功能,常规视图或Contrib应用程序,那么您已经被覆盖,因为它们全部使用 RequestContext

  

注意

     

CSRF令牌也存在于DOM中,但前提是明确   包含在模板中使用 csrf_token 。 Cookie包含   规范令牌 CsrfViewMiddleware 比起   DOM中的令牌。无论如何,如果   令牌存在于DOM中,因此您应该使用cookie!

警告

  

警告

     

如果您的视图未呈现包含 csrf_token 的模板   模板标记,Django可能未设置CSRF令牌cookie。这是   在将表单动态添加到页面的情况下很常见。至   为了解决这种情况,Django提供了一个视图装饰器   Cookie的设置: ensure_csrf_cookie().

Jinja2 模板中使用 CSRF

Django的 Jinja2 模板后端将 {{ csrf_input }} 添加到所有模板的上下文中,这等效于 {% csrf_token %} Django模板语言。例如:

<form method="post">{{ csrf_input }}

答案 1 :(得分:0)

CSRF令牌始终放置在初始化表单标签之后。然后是所有输入字段。

<form>
  {% csrf_token %}
</form> 

答案 2 :(得分:0)

django的官方文档很清楚,请在以下位置查看 https://docs.djangoproject.com/en/2.2/ref/csrf/#how-to-use-it