2017-07-26 18 views
2

我正在做一些測試,同時試圖提供一個答案mod-rewrite redirect but prevent direct access安全性如何在htaccess重寫規則中追加祕密令牌作爲查詢字符串?

原始問題的目標是基本上掩蓋example.com/public/fooexample.com/foo而禁止訪問的真正網址example.com/public/foo

有一次,我發現了一個可能的解決方案追加令牌至改寫URL的查詢字符串,

RewriteCond %{REQUEST_URI} !/public/ 
RewriteRule ^(.*)$ /public/$1?token=SECRET_TOKEN [L] 

RewriteCond %{REQUEST_URI} /public/ 
RewriteCond %{QUERY_STRING} !token=SECRET_TOKEN 
RewriteRule ^(.*)$/[R=403,L] 

我意識到(與Chrome的DevTools),我實在看不出這個令牌在請求標題。

Headers Screenshot

據我所知,是因爲第一RewriteRule不會觸發客戶端上的重定向而這一切都要重寫過程發生在服務器中。

如果我說得對,這SECRET_TOKEN是安全的,不是嗎? (通過安全的,我的意思是它不能由客戶以任何方式被稱爲)

回答

1

通常,客戶端應該不會看到SECRET_TOKEN - 就像你說的,重寫是內部的服務器。

但是,根據服務器配置,在某些情況下可能會暴露SECRET_TOKEN。注意尾隨斜線遺漏 -

例如,使用您發佈的代碼中,SECRET_TOKEN可以通過請求要麼example.com/publicexample.com/subdir(其中subdir裏面/public子目錄)得到暴露。

  1. example.com/public - 如果要請求/public(沒有尾隨斜線)然後mod_dir通過附加一個尾隨斜線,其與301外部重定向實現了「糾正」這一點。但是,重定向不會立即發生,並且您的RewriteRule指令最終將重寫此請求(因爲REQUEST_URI變量現在仍爲/public,此時不帶結尾斜槓)至/public/?token=SECRET_TOKEN(請注意目錄中的尾部斜槓)。 (由於某種原因,URL路徑似乎沒有被RewriteRule更新,因爲你可能認爲這是/public/public,然而,查詢字符串仍然被追加。可能與mod_dir發佈的子請求有關嗎?不知道爲什麼?)由於301已經被mod_dir觸發,所以此響應(包含SECRET_TOKEN)現在作爲外部重定向SECRET_TOKEN公開發送給用戶。

  2. example.com/subdir - 如果有一個子目錄/public/subdir,你要求/subdir(沒有尾隨斜線)類似(但略有不同)的事情會發生。您的RewriteRule指令此時首先啓動,並在內部將請求重寫爲/public/subdir?token=SECRET_TOKEN。好吧到目前爲止。但是然後mod_dir開始並且想要附加一個尾部斜槓到/public/subdir - 它通過外部301重定向來完成。因此,請求現在重定向/public/subdir/?token=SECRET_TOKENSECRET_TOKEN是暴露給用戶(以及以前未知的/public子目錄)。

然而,以這種方式使用的查詢字符串確實有一些其他注意事項:

  1. 既然這樣,你就覆蓋請求其他任何的查詢字符串。

  2. 要合併請求上的現有查詢字符串,您需要指定RewriteRule上的QSA標誌。但是,如果用戶隨後在請求上附加了?token=,那麼他們會覆蓋您的token URL參數,如果您想在PHP腳本中使用$_GET超全局讀取該參數。您可以手動更改查詢字符串參數的順序,方法是在替代中明確包含QUERY_STRING服務器變量,而不是使用QSA標誌 - 但這有點麻煩(例如,如果沒有查詢字符串,該怎麼辦?)。

+1

非常感謝你的完整答案!我一直在做'.htaccess'重寫/重定向多年,至今我仍然學到了很多東西! –

相關問題