簡體   English   中英

如何限制僅從我網站內的頁面訪問某些PHP頁面?

[英]How can I restrict access to some PHP pages only from pages within my website?

我的網站上有一個PHP頁面,該頁面從數據庫中檢索數據以顯示在我的網站中。 該頁面通過AJAX調用。 我該如何限制僅從我網站上的頁面進行訪問,以便想要濫用它而不能從網站(例如,從其服務器發布HTTP請求)獲取數據的用戶本身無法這樣做?

我就是這樣

  1. 在您的網站上,創建一個秘密字符串。 我使用HMAC($ _ SERVER ['REMOTE_ADDR'],密鑰)。
  2. 將機密內容寫成Javascript變量。
  3. 在AJAX調用中,將此字符串作為參數傳遞。
  4. 在AJAX服務器上,再次執行哈希操作。 如果與參數匹配,則調用來自您的頁面。

編輯:代碼示例

在您的網站上,您可以執行此操作,

$key = 'supersecretkey'; // This is your security, don't expose this
$nonce = rand();
$timestamp = time();
$signature = hash_hmac('sha1', $_SERVER['REMOTE_ADDR'] . $nonce . $timestamp, $key);

將變量打印到頁面上,

<script type="text/javascript">
<?php
echo "  var signature = '" . $signature . "';\n";
echo "  var nonce = '" . $nonce . "';\n";   
echo "  var timestamp = '" . $timestamp . "';\n";
?>
</script>

進行AJAX調用時,請將3個參數傳遞給服務器,

  http://example.com?signature=...&nonce=...&timestamp=...

在AJAX服務器上,再次進行計算,

$key = 'supersecretkey'; // This is your security, don't expose this
$nonce = $_REQUEST['nonce'];
$timestamp = $_REQUEST['timestamp'];
$signature = hash_hmac('sha1', $_SERVER['REMOTE_ADDR'] . $nonce . $timestamp, $key);

if ($signature == $_REQUEST['signature'])
   // the call if from my page.

您還可以查詢時間戳記以獲取貨幣,並查詢隨機數以進行重放(需要會話或數據存儲)。

如果如上所述,這實際上是無法做到的,您將需要重新設計並實現某種身份驗證方案,但即使可以進行模擬。 簡短的答案是,如果Web瀏覽器可以訪問它,那么只要它假裝為瀏覽器,任何人都可以訪問它。

您可以采取一些措施使某人變得更難,例如,驗證HTTP標頭字段(例如Referer和User-Agent)以及在AJAX調用中實現會話驗證。

由於XHR的同源政策,在其他站點上運行的JavaScript將無法訪問您的站點。 但是,沒有什么能阻止某人構建PHP + CURL腳本來“代理”來自您的ajax的數據,以使其看起來好像在服務器上運行。 試圖將客戶列入黑名單很麻煩,IP地址便宜,免費的HTTP代理很多。

簡而言之,您的javascript沒有什么特別的。 客戶可以做任何他想做的事,而你不能強迫他做事,這是“客戶站點信任”的基礎。 黑客可以使用篡改數據甚至Firebug之類的東西來識別HTTP請求,他將能夠重播這些請求或使用CURL偽造它們。

您可以嘗試混淆 JavaScript。 但是最終,攻擊者將只是重播http請求,因此您絕對可以做些事情。

與@ ZZ-coder答案類似,但是您可以使用Cookie來完成。

1) 在服務器上設置cookie (“ ip-address + secret”的哈希),這是一種非持久性cookie,在用戶登錄后僅持續1個會話。

2) 在AJAX請求期間檢查服務器上的cookie (因為cookie也與ajax請求一起發送)

這類似於@ ZZ-coder的答案,但是您可以完全跳過JS部分。

las,那是不可能的。 Javascript可以執行的任何操作,“濫用者”也可以通過其服務器執行。 您可以通過混淆javascript和協議使其變得更加困難,從而使其難以嗅探。 有多種免費和非免費的javascript混淆器(也稱為“最小化”)。 通過對發送和接收的數據實施簡單的加密方案(使密鑰更高級將無濟於事,因為密鑰必須始終嵌入在您的代碼中),可以使協議模糊。

有多種選擇,具體取決於您的基本需求,是否讓他人訪問它提供的服務,還是僅基於內部的服務。 這是一篇文章,其中對這些選項進行了很好的深入說明。

http://java.sun.com/developer/technicalArticles/J2EE/usingapikeys/

暫無
暫無

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

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