Node.js 无效的CSRF令牌节点js multer
我正在尝试上传以下文件,这是我的实现,我使用的是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
<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