簡體   English   中英

如何安全地跨域將表單從靜態html站點提交到服務器端后端?

[英]How to securely cross domain submit a form from a static html site to a server side backend?

我想創建一系列靜態HTML網站,這些網站將托管在Amazon S3上。

靜態站點將具有表格。 我的計划是將表單數據發布/ ajax提交到托管在其他域上的服務器端應用程序。 服務器端應用程序會將數據存儲在數據庫中以備將來參考,並將提交的數據通過電子郵件發送給相關人員。

從表面上看,這很簡單,HTML表單只需要將數據發布到服務器端腳本,類似於google form / wufoo / formspree等。

我擔心的是安全性。 該帖子將從靜態站點跨域發布,這似乎使CSRF難以在流行的Web框架中實現。 我已經閱讀了許多有關CSRF / CORS / Authentication的博客文章,但不清楚。

通過研究formspree.io的源代碼,似乎他們檢查了引薦來源和原始標頭,以驗證表單提交來自應有的網站和已注冊的網站。 但是我知道這些可以被欺騙嗎?

由於可以讀取和反向工程靜態站點上的任何javascript代碼,因此API樣式身份驗證似乎很困難...

還是我想得太過分了,如果我通過SSL發布表單,請驗證表單數據服務器端,並根據表單檢查引薦來源/來源標頭,以確保它足夠安全?

TLDR; 對於將表單數據發布到服務器端后端以存儲在數據庫中並通過電子郵件發送的靜態HTML網站,我需要采取哪些安全措施?

提前致謝!

在您的服務器上,您需要一些中間件來確保請求源是可信任的。 因此,如果您的靜態html站點是www.mysite.com ,請確保在服務器www.mysite.com上允許訪問您的api。 就身份驗證而言,如果您不希望任何人訪問您的api,則需要某種身份驗證。 基本流程如下所示:

用戶發布登錄數據,服務器進行身份驗證,服務器生成令牌並作為響應發送回客戶端,令牌被存儲在客戶端上,並在進行任何請求時設置在標頭中。 然后在您的路由上,您將需要一些中間件來檢查請求標頭中是否存在令牌,如果存在,則允許訪問,否則,拒絕訪問。

希望能清除一些東西。

最佳解決方案

看來您的情況下的最佳解決方案是執行以下操作:

  1. 實施Recaptcha。
  2. 首先將請求發送到您自己的腳本,該腳本會驗證驗證碼,然后轉發該請求。
  3. 僅添加Access-Control-Allow-Origin僅源於HTML。 有用的問題

CSRF保護

實際上,如果您只能訪問客戶端,則構建安全的應用程序非常困難。 如果您要發布的服務沒有內置的CSRF系統,如果您在HTML頁面上添加代碼並創建一個簡單的php腳本來接收表單字段,那將是一個很好的解決方案,請驗證重新分配表單字段並將其提交到您想要的任何目的地。

通過令牌進行CSRF保護也可以解決問題,實際上,如果最終您最終提交到自己的腳本,那么這實際上是干凈的編碼解決方案,但是,將其實施到靜態HTML頁面中仍然有些困難。 (您需要通過Javascript或php腳本生成它,將其存儲在會話中,然后在后端腳本中對其進行驗證),但如果能夠進行編碼,我建議您使用它。

  • 在這兩種情況下,您都需要先提交自己的腳本,然后再通過CURL轉發請求。

驗證標題

在后端腳本中,您可以驗證引薦來源和來源,以確保請求不是來自HTML表單以外的其他來源。

摘要

  1. 驗證碼將阻止任何人對您的用戶進行CSRF攻擊。
  2. 萬一攻擊者試圖找到一種解決方法,即起源和引薦檢查,他們可能會使用CURL之類的東西,recaptcha也將阻止他們這樣做。
  3. Access-Control-Allow-Origin實現將阻止攻擊者通過javascript將數據提交到您的頁面。
  4. 首先提交到您自己的腳本也將阻止任何人知道您到底在哪里提交這些數據,這將使他們更難以執行攻擊。

盡管驗證碼不是一個非常用戶友好的解決方案,但是如果您能夠編寫CSRF保護系統代碼,則需要通過JavaScript或發送一個生成用戶會話唯一令牌的ajax請求來完成,該令牌位於其他PHP頁面中,但您需要實施驗證碼以防止反垃圾郵件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM