Javascript 在express.js中创建一个安全的帖子链接

Javascript 在express.js中创建一个安全的帖子链接,javascript,node.js,express,Javascript,Node.js,Express,我想知道是否有任何简单的方法可以通过使用一些Express.js技术或插件创建一个链接来向服务器提交POST请求 这也是一种确保更关键操作(如删除用户)安全的方法。还添加了CSRF保护 这在一些PHP框架中非常简单,比如CakePHP(及其助手) 我现在的做法是自己创建一个隐藏表单,并在html链接中添加一个事件来提交表单: <form action="/users/delete/{{user.id}}" method="post" name="deleteUser{{ user.id }

我想知道是否有任何简单的方法可以通过使用一些Express.js技术或插件创建一个链接来向服务器提交POST请求

这也是一种确保更关键操作(如删除用户)安全的方法。还添加了CSRF保护

这在一些PHP框架中非常简单,比如CakePHP(及其助手)

我现在的做法是自己创建一个隐藏表单,并在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 POST请求,为了避免CSRF攻击,express Middleware是可用的()

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

就我而言,我想通过邮寄发送的任何链接都必须:

  • 包含类
    postLink
  • href
    属性中包含目标URL
  • 数据CSRF
    属性中包含CSRF令牌
  • 可选地包含
    数据确认
    属性,以指定在发送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();
    }
});
$(文档).on('click','postLink',函数(e){
e、 预防默认值();
var url=$(this.attr('href');
var csrf=$(this).data('csrf');
var确认=错误;
if(typeof$(this).data('confirm')!='undefined'){
if(确认($(this).data('confirm')){
确认=正确;
};
}否则{
确认=正确;
}
如果(已确认){
$('body')。追加('\
\
\
\
');
$('form[name=“postLink”')。提交();
}
});
基本上,它所做的是应用我在问题中提到的为每个帖子链接创建表单的相同技术。唯一的区别是,我不必在每次创建帖子链接时都费心创建表单

通过这种方式,表单将动态创建并附加到
正文
。然后提交

为了使它安全,我利用了


如果您不需要安全的POST链接,那么您可能可以使用。

仍然与我发布的内容非常相似。唯一的区别是您使用javascript处理。您如何发布链接,然后从服务器端路由重定向用户?这就是我现在拥有的:但服务器端无法重定向用户anywhere…我必须在客户端做…这是不可取的。