2014-10-31 30 views
0

我想知道是否有任何簡單的方法來創建一個鏈接,使用一些Express.js技術或插件向服務器提交POST請求。在express.js中創建一個安全的POST鏈接

這也是確保更多關鍵操作(如刪除用戶)的一種方法。也加入CSRF保護。

這在一些PHP框架(比如CakePHP)中很簡單(使用它的postLink助手)。

我這樣做是正確的,現在的方式是通過自己創建一個隱藏的表單,並在HTML鏈接添加事件提交表單:

<form action="https://stackoverflow.com/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

我最終創建了自己的方式來使用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(); 
    } 
}); 

基本上它所做的就是應用creat的相同技巧爲我在問題中提到的每個POST鏈接添加一個表單。唯一的區別是,我不必每次想創建POST鏈接時都不打算創建表單。

這樣窗體將被動態創建並附加到body。然後提交。

爲了安全起見,我使用了CSRF module for express.js

如果您不需要安全的POST鏈接,那麼您可能可以使用the postLink plugin for jQuery

0

中序創建鏈接到一個POST請求,你可以使用客戶端技術,如使用JavaScript捕獲點擊生成一個AJAX POST請求到服務器,Inoder以避免CSRF攻擊表達中間件可(https://github.com/expressjs/csurf

+0

仍然與我發佈的內容非常相似。唯一的區別是你在javascript中處理。 – Alvaro 2014-10-31 17:34:35

+0

你將如何發佈鏈接,然後從服務器端路由重定向用戶?這就是我現在所擁有的:http://paste.ofcode.org/ELbiuViYqjzyAm4YZMffmB但服務器端無法將用戶重定向到任何地方......我必須在客戶端執行......這是不可取的。 – Alvaro 2014-11-06 10:51:16