2013-10-13 82 views
0

我有page.php它接收POST數據,它位於已知的位置。 如何獲取通過POST發送數據到page.php的每個頁面的url如何阻止/允許來自某些站點的POST數據阻止某些站點的POST數據

回答

4

您可以(雖然不可靠)通過$_SERVER['HTTP_REFERER']獲取引薦頁面的網址。但是,有一些情況會出現空白(通常來自HTTPS站點)。

限制哪些網站可以導致瀏覽器向您的腳本提交數據將被接受的唯一可靠方法是實施針對CSRF的保護,並停止所有所有不屬於您的網站的網站。

生成隨機令牌。將該令牌存儲在Cookie或會話中。將其存儲在表單中的隱藏輸入中。提交表單時,檢查表單中的標記是否與Cookie /會話中的標記匹配。如果沒有,那麼提交數據的表單不在您的網站上。


我使用PayPal IPN,所以我需要檢查,如果POST來自貝寶

你試圖解決這個問題的錯誤的方式。

閱讀Paypal's IPN documentation。他們提供了一種方法來確定事件是否來自他們。

  1. 貝寶的HTTP POST的監聽器,通知您事件的IPN消息。
  2. 您的監聽器向PayPal返回空的HTTP 200響應。
  3. 您的聽衆HTTP將完整的,未更改的消息發送回PayPal;該消息必須包含與原始消息相同的字段(以相同順序) ,並以與原始消息 相同的方式進行編碼。
  4. PayPal發回一個單詞 - 要麼是VERIFIED(如果郵件與原始郵件匹配),要麼是INVALID(如果郵件與原始郵件不符 )。
+0

但我怎麼能阻止POST數據? – Xriuk

+0

您使用'if'語句,生成一條錯誤消息和'exit'。 – Quentin

+0

是的,但我需要每次都能正常工作,HTTP_REFERER無法工作 – Xriuk

1

可以驗證的形式是從某個頁面做這樣的事情:

在表單中的值與頁面旁邊加上隨機隱藏的價值,並保存到會話:

<?php 
session_start(); 
$_SESSION['csfr_token'] = $randomValue; // Randomly generated string 
$_SESSION['csfr_page_url'] = ; // URL of the current page 
?> 
<input type="hidden" name="csfr_token" value="<?php echo $randomValue; ?>" /> 

上述顯然只適用於如果您使用的表單,如果不是,然後使用任何您使用的方法將csfr_token添加到帖子。

您的網頁上

然後管理崗位:

<?php 
session_start(); 

if (isset($_SESSION['csfr_token']) && $_POST['csfr_token'] && $_SESSION['csfr_page_url'] && $_SESSION['csfr_token'] === $_POST['csfr_token'] && $_SESSION['csfr_page_url'] === 'the URL that you want to allow') { 
    // Do your stuff 
} else { 
    // Post isnt valid 
} 

更新:

我認爲以下問題涉及:Verifying a Paypal transaction via POST information

+0

我無法編輯發件人頁面中的代碼...它不是我的,它來自外部網站 – Xriuk

+1

您還應該檢查兩個數組鍵的存在。 – ComFreek

+0

謝謝ComFreek。 @ user2758571那麼你非常有限,你可以怎麼做呢。我不明白,爲什麼外部網站會給你發一個帖子? –