簡體   English   中英

如何驗證發送到服務器的秘密?

[英]How can I validate a secret sent to a server?

我不記得我之前是怎么做的,但是我已經這樣做了,並且想知道是否有人可以幫助我。

我使用帶有URL中的一些參數的GET請求將數據發布到另一個頁面。 我想驗證接收端的參數。 我最后一次通過添加一個秘密然后散列它來做它,但現在我不記得如何。

如果您要驗證參數是否來自您打算來自的源,即:我只接收參數如果用戶來自page1.php這里是你做的

  1. 用戶轉到page1.php,生成一個令牌並放在他的$ _SESSION中。 散列令牌添加到page1.php(或鏈接,或其他)上的表單
  2. 用戶將參數發送到page2.php。
  3. 您檢查是否存在哈希,以及$ _SESSION中的標記(當哈希時)是否等於用戶發送的標記

請記住,在這種情況下,您只驗證參數是否由已知來源發送。 總是進行輸入驗證以檢查接收的值是否是可接受的值!

您可以做的是(您已經說過)添加GET值的哈希值。 這種方法的優點是鏈接(如果要發布)是“完整的”,因為您不依賴於通過活動會話等的其他數據。 換句話說,該鏈接帶有自己的驗證信息。

我會這樣做:

計算哈希值

  1. GET鍵和值的數組進行排序(因為應該忽略參數順序,例如, ?a=1&b=2產生與?b=2&a=1相同的哈希)
  2. 計算前綴為固定鹽的數組的哈希值 ,即hashFunc(concat(GETArray, fixedSalt))
  3. 將(2)中的hash添加到GET參數中。

驗證值

  1. 提取hash參數並對剩余GET鍵和值數組進行排序
  2. 從(1)計算排序數組的哈希值 - 與上面列表中的(2)相同的過程
  3. 檢查計算的哈希值是否與GET參數中的值匹配。

固定鹽用於確保知識淵博的人無法“猜測”您的哈希算法並因此篡改數據(除非他也知道固定鹽,當然:))。


示例: a=1b=2

  • 排序數組: array('a' => 1, 'b' => 2);
  • 哈希: xyz (通過sortedArray'mySa1t' concat上的hashFunc()
  • GET參數: ?a=1&b=2&hash=xyz ,參見http_build_query()
  • ...
  • 散列: xyz ,剩余的GET數組,排序: array('a' => 1, 'b' => 2);
  • 計算的散列: xyz (通過srecievedSortedArray'mySa1t' concat上的hashFunc()
  • xyz == xyz ,yaj!

如您所見,沒有人進行此類“驗證”。

實際上,沒有數據通過url發送到另一個頁面。 在已經存在的服務器上發送一些數據是沒有意義的。

您正在查詢錯誤的查詢字符串。 它不發送任何數據,它只是識別一些頁面。

整個頁面地址是一個URL,一個頁面的唯一地址。

如果您的服務器上有一個頁面響應某個URL,則不需要這樣的密封。

您必須驗證參數,而不是這樣的哈希。

暫無
暫無

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

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