簡體   English   中英

如何限制對PHP文件的訪問?

[英]How to restrict access to a PHP file?

我想限制訪問我的服務器上的PHP文件。 此PHP文件從HTTP GET請求獲取數據並將其附加到文件。 簡單。 但我不希望執行這個PHP文件,除非從我開發的智能手機應用程序中生成HTTP請求。

我不想單獨驗證每個用戶。 我希望我的應用程序,只有我的應用程序能夠將請求發送到PHP文件。 我不希望人們在瀏覽器中輸入類似形式的請求(http://www.mydomain.com/check.php?string=blahblahblah)並產生同樣的影響。

我曾考慮檢查HTTP_USER_AGENT或其他變量,但我擔心它們也可能很容易被欺騙。 我可以在我尋找的應用程序中嵌入一個密鑰,但該密鑰也可能會受到損害。

下一步是讓服務器向我發送一個我正確回應的挑戰。 或者我甚至可以看看PKI。 但是,這是一個相對簡單的方法,因為我不是想保護任何有實際價值的東西,只是為了防止輕微的破壞行為。

我想在這里重新發明輪子嗎? 有沒有一種簡單,經過驗證的方法可以做到這一點?

FWIW,這是我能想到的最安全的方法,而不會嚴重影響性能 - 本質上是RESTful(ish)方式,如果進一步提升它將需要存儲在服務器上的多個請求和連接狀態信息:

  • 應用程序和服務器具有相同的硬編碼鹽字符串,對於移動應用程序的每個連續版本都是唯一的。 該字符串必須保密。
  • 當用戶在他們的設備上安裝應用程序時,該應用程序會聯系您的服務器並通知它應用程序的版本以及設備的IMEI ,您使用的任何移動平台的API都可以讓您檢索。
  • 服務器為應用程序實例生成一個唯一密鑰,該密鑰將發送回應用程序並存儲在設備上,並使用IMEI和已安裝的版本將其存儲在服務器端數據庫中。
  • 在日常操作期間(即在提出問題中概述的請求時),應用程序遵循以下過程:
    • 檢索以下信息:
      1. 設備IMEI
      2. 應用密鑰
      3. 應用版本
      4. 硬編碼的鹽串
      5. 隨機生成的附加鹽字符串(當前時間戳的衍生值,以微秒為單位,對於合理數量的熵總是有用的)。
    • 將所有這些信息連接在一起,最好在它們之間使用硬編碼填充,並生成結果字符串的散列。
    • 發送到服務器的下列信息與實際請求數據(也許在餅干安全的小的額外位)一起:
      1. 生成的哈希
      2. 應用密鑰
      3. 隨機生成的字符串用作附加鹽
  • 服務器現在使用App密鑰從數據庫中檢索該實例的設備IMEI和app版本,並將該信息與硬編碼的salt字符串一起用於版本ID和設備發送的附加salt字符串以構建哈希值。 如果在服務器上生成的哈希與移動設備生成的哈希匹配,則該請求是好的,如果不拒絕它。
  • 此過程中的所有通信均通過HTTPS進行。

為了突破該系統並成功欺騙請求,攻擊者需要知道以下內容:

  1. 設備IMEI
  2. 應用密鑰
  3. 應用版本
  4. 硬編碼的鹽
  5. 用於生成哈希的機制(輸入字符串的精確格式和哈希算法)。

顯然,如果你正在使用移動設備1-3很容易提取,但如果沒有逆向工程應用程序就無法找到4和5(對於那些有知識和耐心的人來說,實際上沒有什么可以阻止的做它)。

中間人攻擊基本上是不可能的 - 即使在突破SSL(這是非平凡的,至少可以說)和逆向工程應用程序得到4和5之后,1-3無法在沒有對哈希進行蠻力攻擊,這非常復雜,平均需要數億年(參見本頁 ,看看我是如何得出這個數字的),特別是如果其中一個是可變長度的 -應用程序版本字符串很容易。

在app和php文件中定義一個salt,然后將該salt與當前時間一起散列。 這不太可能被欺騙。

$hash = sha1(time() . 'bladieblasalt');

if($_GET['hash'] == sha1(time() . 'samehash'))
{
    echo 'valid';
}

首先你需要在你的應用程序中實現ssl,否則一個知之甚少的人可以簡單地將那里的手機連接到wifi上,並通過wireshark或者cain和abel等來嗅探應用程序和你的站點之間的流量。 並獲取url和任何參數傳遞,無需反匯編任何東西。

應用程序連接到您的站點和用戶登錄,無論是訪客還是成員,您的服務器都會為應用程序分配一個請求ID,並且此密鑰/令牌與每個請求一起傳遞並在服務器上的會話中進行驗證。

令牌看起來像: UNIQUE_REQUEST_ID_ASSIGNED_BY_SERVER:APPsIP:APPsTIME加密此字符串並將其作為$_GET['token']

然后在你的服務器上解密字符串並將字符串explode()到它的部分,並檢查數據庫或會話,請求id,ip和時間匹配等,如果一切都好的話。

就像安全登錄系統為每個用戶分配一個唯一的鹽並存儲在用戶請求ID旁邊。

最重要的是,只是讓濫用者濫用系統。 99%的人甚至不會想到要小提琴,而另外1%的人會因此而被阻止。

如果您不想要每個用戶,但只需要每個應用程序,您將不得不依賴於應用程序內置的秘密。 任何反匯編應用程序的人最終都能找到它,因此一些混淆可能有所幫助,但它不會讓確定的人離開你的頁面。

也就是說,使用任何公鑰加密都沒什么意義。 由於應用程序端是欺騙者可能感興趣的東西,他們已經可以訪問一對密鑰對中更有價值的一半。 所以你不妨使用一些使用共享秘密的方法。

您真正想要檢查的是傳輸數據的真實性。 因此,只需獲取該數據的核心(即所有真正重要的字段),將它們與共享密鑰連接起來,對結果進行散列並將其作為消息摘要傳輸。 服務器執行相同的計算並檢查計算的摘要是否與傳輸的摘要匹配。 如果是,則該消息的發送方必須已知共享密鑰。

仍有一些機會進行重播攻擊,即有人錄制有效消息並在以后重復播放。 您可以在服務器端檢測確切的重復項,並通過在消息的簽名部分中包含時間戳來防止延遲重播。 如果您的服務器允許客戶端和服務器時間戳之間存在巨大差異,則必須在相同的時間內保留重復信息。 如果它只接受很小的差異,它可以使用較小的重復緩存,但是配置錯誤的設備的用戶可能會感到煩惱,因為服務器更可能拒絕他們的請求太舊。

還有一點需要注意:你寫了一篇關於GET請求的文章。 我總是將一些狀態改變操作與POST相關聯。 如果應用程序是您自己的,那么這並不重要,但已知瀏覽器在不詢問用戶的情況下重新發送GET請求,從而導致重復請求某些操作。

沒有保證方法。 您可以使用oauth身份驗證...根據您使用的平台以及將應用程序部署到手機的方式,也許您可​​以將密鑰編譯到應用程序本身? 任何事情都可以並且將永遠被破解,沒有100%的安全......但是在嘗試中沒有任何恥辱。 :)

我個人對我的移動應用程序使用的是RESTful身份驗證,使用常規登錄/傳遞對基於令牌的通信,直到它過期。 :)

HTTP請求可以按發送者想要的任何方式逐個字符地構建。 欺騙總是可能的。

只需將授權(登錄,密碼,會話等和/或“API密鑰”)添加到PHP應用程序,然后在發送所需請求之前讓手機應用程序先進行授權。 您可能沒有考慮到這一點,因為如果您的腳本很簡單,可能會給它添加一些混亂,但幾乎每個Web系統都需要它,並且您最終也會面對它。

讓您通過HTTPS撥打應用程序登錄您的PHP應用程序以排除攔截。

暫無
暫無

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

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