繁体   English   中英

在express.js中创建一个安全的POST链接

[英]Create a secure POST link in express.js

我想知道是否有任何简单的方法来创建链接,以使用某些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框架中的工作方式。

为了创建到POST请求的链接,您可以利用客户端技术,例如使用javascript捕获点击并向服务器生成ajax发布请求,为避免CSRF攻击,Inoder可以提供表示中间件的服务( https://github.com/ expressjs / csurf

我最终使用jQuery创建了自己的方式来处理它们(但也可以使用javascript完成)。

就我而言,我要通过POST发送的任何链接都必须:

  • 包含类postLink
  • href属性中包含目标URL。
  • 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>

或不带Confirm属性:

<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 然后提交。

为了确保它的安全性,我使用了express.jsCSRF模块

如果您不需要安全的POST链接,则可以使用jQuery的postLink插件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM