我想知道是否有任何简单的方法可以使用一些Express.js技术或插件创建一个向服务器提交POST请求的链接。
这也是一种保护更多关键操作(如删除用户)的方法。还添加了CSRF保护。
在一些PHP框架(如CakePHP及其postLink帮助程序)中,这很简单。
我现在正在做的方法是自己创建一个隐藏的表单,并在html链接中添加一个事件来提交表单:
<form action="/users/delete/{{user.id}}" method="post" name="deleteUser{{ user.id }}" style="display:none;">
<input type="hidden" name="_csrf" value="{{ csrfToken }}" />
</form>
<a href="#" onclick="if (confirm('Are you sure you want to delete this user?')) { document.deleteUser{{ user.id }}.submit(); } event.returnValue = false; return false;">
Delete
</a>
这正是它在CakePHP框架中的工作方式。
答案 0 :(得分:0)
为了创建一个POST请求的链接,你可以利用客户端技术,比如使用javascript捕获点击并生成一个ajax post请求到服务器,Inoder以避免CSRF攻击表达中间件可用(https://github.com/expressjs/csurf )
答案 1 :(得分:0)
我最终创建了自己的方法来使用jQuery处理它们(但也可以使用javascript完成)。
在我的情况下,我想通过POST发送的任何链接都必须:
postLink
。href
属性中包含目标网址。data-csrf
属性中包含CSRF令牌。data-confirm
属性,以指定在发送POST请求之前显示为确认的消息。视图中的链接如下所示:
<a href="/reject/23" class="postLink" data-confirm="Are you sure you want to reject this item?" data-csrf="NdiuZynW-thVmMqYPZqFFGxGcInQZn35mDf8">
Reject
</a>
或没有确认属性:
<a href="/reject/23" class="postLink" data-csrf="NdiuZynW-thVmMqYPZqFFGxGcInQZn35mDf8">
Reject
</a>
所需的jQuery代码如下:
$(document).on('click', '.postLink', function(e){
e.preventDefault();
var url = $(this).attr('href');
var csrf = $(this).data('csrf');
var confirmed = false;
if(typeof $(this).data('confirm') !== 'undefined'){
if(confirm($(this).data('confirm'))){
confirmed = true;
};
}else{
confirmed = true;
}
if(confirmed){
$('body').append('\
<form action="'+ url +'" method="post" name="postLink" style="display:none;">\
<input type="hidden" name="_csrf" value="'+ csrf +'" />\
</form>\
');
$('form[name="postLink"').submit();
}
});
基本上它的作用是为我在问题中提到的每个POST链接应用相同的创建表单的技术。唯一的区别是每次我想创建POST链接时都不必为创建表单而烦恼。
这样,表单将动态创建并附加到body
。然后提交。
为了确保安全,我使用了CSRF module for express.js。
如果您不需要安全的POST链接,那么您可能可以使用the postLink plugin for jQuery。