Flask 两个唯一的';烧瓶形式';对象不唯一,CSRF失败

Flask 两个唯一的';烧瓶形式';对象不唯一,CSRF失败,flask,jinja2,csrf,flask-wtforms,Flask,Jinja2,Csrf,Flask Wtforms,关于这个问题的上一个问题是。CSRF令牌在Flask WTF表单上继续失败。配置和安装的详细信息在链接中 我现在发现,在我的模板上(我在视图中向其传递了两个表单),每个表单上的csrf_标记不是唯一的。我不太明白为什么?每个表单的CSRF令牌应该是唯一的,对吗 我在Chrome中检查了令牌,它们是相同的——都包含在代码的底部 <form method="post" class="mt-4" id="form_1"> {{ fo

关于这个问题的上一个问题是。CSRF令牌在Flask WTF表单上继续失败。配置和安装的详细信息在链接中

我现在发现,在我的模板上(我在视图中向其传递了两个表单),每个表单上的csrf_标记不是唯一的。我不太明白为什么?每个表单的CSRF令牌应该是唯一的,对吗

我在Chrome中检查了令牌,它们是相同的——都包含在代码的底部

 <form method="post" class="mt-4" id="form_1">
                            {{ form1.csrf_token }}
                            <div class="form-group"
                                {{ form1.form_field1(class_='form-control', id='foo', type='text',
                                placeholder='Enter your data') }}
                            </div>
                            <div class="form-group">
                                {{ form1.form_field2(class_='form-control', id='bar',
                                type='text', placeholder='More data please') }}
                            </div>
                              {{ form1.submit(class_='btn btn-lg btn-info btn-block', form='form_1' ) }}
<!--                            <button form="form_1" type="submit"-->
<!--                                    class="btn btn-lg btn-info btn-block">-->
<!--                                <i class="fa fa-lock fa-lg"></i>&nbsp;-->
<!--                            </button>-->
                        </form>



<form class="mt-3" method="post" id="form_2">
                            <div class="form-group input-group">

                                {{ form2.csrf_token }}
                                {% if current_user.has_value() %}
                                {{form2.field(type='checkbox', checked=1)}}
                                {% else %}
                                {{ form2.field(type='checkbox') }}
                                {% endif %}
                                {{ form2.update(type='submit', class_='btn btn-light input-group-append') }}
                            </div>
                        </form>


{{form1.csrf_token}
{{form2.csrf_token}
{%如果当前_用户具有_值()%}
{{form2.field(type='checkbox',checked=1)}
{%else%}
{{form2.field(type='checkbox')}
{%endif%}
{{form2.update(type='submit',class='btn btn light input group append')}

.....

这是因为整个请求都会缓存令牌。请参阅令牌生成函数的注释


另一个有趣的问题是,在同一个文档中,有两个HTML元素具有相同的
id
属性。

是的,我发现了这一点-我不知道是什么导致了这一点,但肯定是不对的。我的设置在上一个链接中。这是由中使用的默认设置引起的。如果在一个页面上呈现多个表单,所有表单都将具有相同的csrf令牌字段id,因为会话中只有一个令牌。我想说这是一个bug,所以不要在一个页面上放置两个表单,否则您的Java脚本可能会表现得很奇怪。这会导致验证失败吗?我确信我有这个工作。。。。如果有两个表单发送到同一页面,我如何处理CSRF令牌行为?不,每个表单都是单独提交和处理的,因此不会影响表单验证。它将破坏HTMLDOM,您将在javascript中看到这一点(CSS几乎不应用于隐藏的输入)。验证仍然失败,无论我如何烹饪它。
<form method="post" class="mt-4" id="form_1">
<input id="csrf_token" name="csrf_token" type="hidden" value="ImM5OWI2NTJiY2RhOGJkNjlkYjFkYzliM2JkMDM4N2JmODQwMDU1YWQi.XiAz0A.7r1lBMq-tO0wrukerCfIFgXwK9M">

.....

 <form class="mt-3" method="post" id="form_2">
 <div class="form-group input-group">
 <input id="csrf_token" name="csrf_token" type="hidden" value="ImM5OWI2NTJiY2RhOGJkNjlkYjFkYzliM2JkMDM4N2JmODQwMDU1YWQi.XiAz0A.7r1lBMq-tO0wrukerCfIFgXwK9M">