2015-09-11 24 views
0

我有一個JavaScript函數是這樣的:我可以混淆一個PHP函數調用

function delPhoto(thisPhotoID) { 
    $("#php").load("delphoto.php?id=" + thisPhotoID); 
} 

這個PHP函數刪除從MySQL數據庫中相應的照片,但是任何人誰看的源網頁可能惡意呼叫帶有任意數字的delphoto.php腳本並從數據庫中刪除隨機照片。

有沒有一種方法可以混淆這個函數調用,以至於無法完成,或者PHP函數拒絕來自網頁外部的調用嗎?

+1

這種類型的功能和相關的背最終的PHP代碼應該只限於已被授予執行此類操作權限的用戶。您可以重命名該函數,也許可以使用.htaccess重寫規則使'delphoto.php'頁面顯示爲'fluffyandnice.php',但惡意用戶可能仍會插入隨機數字以查看會發生什麼......最好的辦法是確保這些鏈接僅顯示給那些已被授權的用戶,並且處理刪除操作的服務器端代碼會爲經過認證的用戶進行測試。 – RamRaider

+0

您可以通過'delphoto.php'來檢查用戶是否已登錄,然後停止壞的註冊用戶,確保照片是他們要刪除的。當然,這取決於您的系統當前的工作 – RiggsFolly

+1

混淆不是一種認證或安全形式。只要說清楚。你永遠不應該留下一個可以公開訪問數據庫的任何行的文件。 – Devon

回答

1

我想知道如果我能實現某種校驗,使得delphoto.php會知道,這是一個有效的電話,

如:

delphoto.php?id=13&checksum=A4F8W9 

,其中13相當於A4F8W9和不正確的校驗這不會是一個有效的電話?所以如果有人想試圖刪除圖像#14,他們需要弄清楚如何計算正確的校驗和。

+0

使用類似HMAC或其他一些請求籤名程序可以阻止較小的scriptkiddies,但它不會阻止真正想搞砸網站的人。如果請求籤名發生在前端,那麼該代碼必須可供瀏覽器使用,因此也適用於攻擊者。誰可以簡單地從js控制檯調用您的javascript代碼來刪除照片。如果沒有適當的後臺驗證有權限的用戶,這只是一個稍微好一點的開放 – EdgeCaseBerg

+0

「如果請求籤名發生在前端」 - 我想大多數人會認識到公開用於加密的密鑰或哈希會使加密/哈希的好處無效。如果是我,我會去創建一個內容創建時隨機生成的隨機值。 – symcbean

+0

btw Andy,如果你對安全性非常感興趣,我建議你拿起Hoffman和Sullivan編寫的「Ajax Security」一書,它有點過時(2009),但它涉及到保護前端代碼的許多重要主題以及在處理像這樣的問題時尋找和防範。它也很可讀。你可能會發現它在你的職業生涯中有讀過它的用處。 – EdgeCaseBerg

0

但是,任何查看網頁源代碼的人都可能會惡意地用任何數字調用delphoto.php腳本並從數據庫中刪除隨機照片。

如果我想搞砸你的網站,或者即使我只是好奇和p around,,,爲你的照片提供數字標識可用於世界是一個很好的開始。特別是像「delphoto」這樣的東西。如果我想在你的服務器上加載負載並且一般都會讓你感到困擾,那麼我會設置一個腳本來錘擊我可以並行處理的每個ID。這不僅會給用戶造成數據丟失的麻煩,而且還取決於這次調用是否從磁盤上刪除照片,這也可能會佔用服務器資源。

有沒有一種方法可以模糊這個函數調用,以至於無法完成,或者有沒有辦法讓PHP函數拒絕來自網頁外部的調用?

這很好,你有足夠的自覺去理解你目前的安全。但混淆不能替代實際的安全性。 任何網站上的管理功能應由用戶系統和角色管理方案加以保護。就用戶和管理員而言,應該有一個明確的區別,只要誰可以在網站上做什麼。

我不知道你是否在使用框架,但顯然我們不能告訴你如何在沒有看到你的用戶系統如何工作的任何代碼的情況下保護端點。但是,如果你有一個你需要考慮的文件,並確定如何檢查,如果用戶是:

  1. 已登錄
  2. 具有運行動作

根據你的系統的權限確實,這可能需要改變。例如,管理員應該能夠刪除任何東西。但用戶應該只能刪除自己的照片。因此,「運行該操作的許可」的一部分將具有所有權檢查。

1

安全問題1:
切勿以這種方式後端:建立一個位指示; 前端只能與控制器進行通信,因此所有的PHP腳本會被隱藏起來,爲用戶

安全問題2:
使用令牌對於這種操作

1生成系統隨機數,例如:使用uniqid(),其存儲在列表或關聯數組(用戶令牌),並在MemcachedANYEMRedis數據服務器推
2 - 生成你的鏈接:

"controller?action=delete&imageId=" . $photoID . "&token=" . $tokenId"; 

-3-當執行方法DELETE,驗證接收到的$tokenId,如果動作是允許的,刪除從數據服務器所存儲的令牌(它必須只能使用一次)

+0

這可能是一件很好的事情,只有當用戶在我認爲的第一位有適當的權限時纔會生成這樣的標記。但**只有一次**令牌是一個非常好的建議 – EdgeCaseBerg

+0

@EdgeCaseBerg當然:)我剛剛指出了正確的方式...保持應用程序安全的完整解決方案將會很長 –