簡體   English   中英

php如何確保$ _POST數據來自您的表單而不是外部影響?

[英]php How do you ensure $_POST data is coming from your form and not a outside influence?

有沒有辦法確保我的代碼收到的$_POST數據來自我的表單而不是外部影響。 基本上我不希望有人能夠將$_POST欺騙到普遍可用的頁面,例如創建帳戶。 任何用戶都可以訪問帳戶創建頁面,但我想確保只有我的account_creation表單提交的數據才會被處理。

我唯一能想到的是啟動$_SESSION ,然后使用隱藏輸入將session_id提供給表單。 在$ _POST時,隱藏輸入的值將與當前session_id匹配。

如果有更好的方法來實現這個結果? 如果有,我期待聽到它。

您無法確保數據來自表單 POST請求只是一個POST請求,可以通過多種方式生成。 HTML表單只是這是非常人性化的方式之一 您的服務器需要驗證通過POST請求接收的數據是否有效以及是否對其執行操作。

話雖如此,有些東西可以幫助您限制和驗證正在提交的數據。 首先,要求用戶使用(會話)cookie登錄。 這消除了匿名用戶的隨機請求。 其次,您可以將一個標記作為隱藏字段嵌入到表單中,您也可以將其保存到用戶的會話中。 POST請求需要包含該令牌才能生效。 令牌只是一個偽隨機字符串。
您可以通過准備您希望用戶提交的表單字段的哈希來增強此功能。 如果表單值應該是只讀的,您也可以將值包含在哈希中。 例如:

$rand = md5(mt_rand());
$hash = sha1('lastname:firstname:email:' . $rand);

$_SESSION['rand'] = $rand;
$_SESSION['hash'] = $hash;

// on form submit:

$keys = array_keys($_POST);
$checkHash = sha1(join(':', $keys) . ':' . $_SESSION['rand']);
if ($checkHash != $_SESSION['hash']) {
    die('Form submission failed token validation');
}

這只是一個簡單的例子,您可能希望按字母順序對鍵進行排序,以確保您將獲得相同的哈希等。它演示了用戶需要為每個請求設置唯一令牌的概念,但這可以防止使用表單進行回火並提交比想要的更多或更少的數據。

這仍然不意味着用戶實際使用您的表單來提交數據。

$ref = $_SERVER['HTTP_REFERER'];
if($ref !== 'some site path/index.php')
{
    die("Access Denied!");
}

這應該可以防止大多數人從外部影響力向您的數據庫發布數據。

稍微好一點的是添加額外的驗證,例如user_agent,user_ip和其他一些$ _SERVER變量 - 這些是我使用的兩個。

因此,如您所述,創建唯一ID(或會話ID),但添加一些額外的驗證,代理和IP也匹配。 不是萬無一失的,但增加了另一層安全性。

編輯:我應該補充一點,你不回發用戶代理; 保持服務器端並靜默驗證返回的會話ID。

此外,如果提交未通過驗證,則永遠不會向用戶顯示原因 - 這樣作弊不知道如何跟蹤它們。 您還可以添加“5個殘疾人並且您已經離開”跟蹤,但您需要為此進行登錄。

使用會話ID肯定是一種方法。 但是大多數(如果不是全部)其他選項涉及將一些數據添加為隱藏字段。

  1. 使用CAPCHA。 這對於每個頁面加載始終是唯一的,因此必須使用您的表單。
  2. 生成隨機數據並將其存儲在DB(或只是$_SESSION變量)中,並在提交表單后進行檢查。

選項一是我為用戶創建表單推薦的那個,因為它具有雙重功能。 它會停止自動提交您自己的表單,同時確保$_POST數據來自您自己的表單。

這是一種防止XSRF的標准模式模式。 基本上它與你提到的類似。 在為用戶呈現表單時,服務器會創建隨機令牌。 它與用戶的瀏覽器cookie相關聯。 在表單提交時,它將回發到服務器。 然后,服務器將令牌與發出的令牌進行比較,並且僅在成功匹配后才執行表單操作。

在表單中放置一個唯一值並與服務器端會話中的存儲值匹配有很多好的提及。 這樣做,但也考慮當用戶使用后退按鈕時可能會發生什么,並可能嘗試兩次提交表單,或者他們打開第二個瀏覽器窗口(同一個會話!),或者他們在您的網站上使用多個表單。

不要通過不考慮你的系統來制造瘋狂的錯誤。

暫無
暫無

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

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