Node.js 无效的CSRF令牌节点js multer

Node.js 无效的CSRF令牌节点js multer,node.js,Node.js,我正在尝试上传以下文件,这是我的实现,我使用的是multer,基本上,当我使用表单操作执行正常表单提交时,此设置会起作用。我想异步执行此操作 我做错什么了吗 <form id="announcementPostForm" method="post"> <input type="hidden" class="_csrf" id="_csrf" value="&l

我正在尝试上传以下文件,这是我的实现,我使用的是multer,基本上,当我使用表单操作执行正常表单提交时,此设置会起作用。我想异步执行此操作 我做错什么了吗

<form id="announcementPostForm" method="post">
     <input type="hidden" class="_csrf" id="_csrf" value="<%=csrfToken%>">
     <input id="attachment" type="file"/>
     <button class="btn btn-custom float-right mb-2 postAnnouncementBtn"> Post </button>
</form>

----Client JS ------
    var formData = new FormData();
    formData.append('attachment',document.getElementById("attachment").files[0])
    fetch('/createAnnouncement',{
        method: 'POST',
        body:formData
    }).then(result => {
        return result.json();
    }).then(data => {
        console.log(data);
    })

从浏览器代码到服务器的
fetch()
请求是跨站点请求伪造(csrf)。您将服务器配置为拒绝这些内容,并在HTML中使用适当的
value=”“>
标记配置了
announcementPostForm
。所以这不是伪造的。但是您
fetch()
的是

为了防止它是伪造的,您需要在
获取
请求中包含名为
\u csrf
的相同表单字段。您的客户端Javascript代码可以从html表单中检索到类似这样的内容,以将其包含在
formData
对象中

var formData = new FormData();
const csrf = document.querySelector('form#announcementPostForm #_csrf').value
formData.append('_csrf', csrf)
formData.append('attachment',document.getElementById("attachment").files[0])
...
顺便说一下,您的html表单字段不会像编写的那样工作。要发送到服务器的每个字段都需要
名称
属性以及
id
属性。您必须将按钮标记为具有
type=“submit”


邮递
您还必须在nodejs程序中使用会话,并在
.fetch()
请求的选项中提到
凭据:“同源”


这里发生了什么?每次呈现页面时,都会得到一个不同的、难以猜测的res.locals.csrfToken值。然后,当您发回服务器时,它会根据您的会话检查传入的
\u csrf
值。这可以防止网络爬虫抓取你的html并将垃圾或恶意数据发布到你的服务器。

添加你的NodeJS代码我正在使用会话此解决方案对数据有效。附加(“U csrf”,csrf)谢谢O.Jones