Php

阻止 Apache 從 URI 中解碼 PATH_INFO 的字元

  • June 2, 2018

我想阻止 Apache從 URI解碼%2B( +) 和%3D( )。=我需要那些未在 PATH_INFO 中解碼的字元。

我已經通過使用%2F( /) 做到了這一點:

AllowEncodedSlashes NoDecode

但是,我找不到任何可以幫助我對其他編碼字元執行相同操作的指令。這甚至可能嗎?

您無法阻止 Apache 解碼PATH_INFOApache 伺服器變數中的那些 % 編碼字元(PHP 稍後將其分配給$_SERVER['PATH_INFO']超全域,看似未更改)。

AllowEncodedSlashes指令是一種特殊情況。這確實是一個“安全功能”。預設情況下,%2FURL 路徑部分中的編碼斜杠 ( ) 會觸發系統生成的404 響應。該AllowEncodedSlashes指令允許請求通過應用程序(該NoDecode選項僅在以後添加)。

如果您想PATH_INFO在 PHP 中讀取 %-encoded,請考慮使用不同的$_SERVER變數,例如$_SERVER['REQUEST_URI'],它不是 %-decoded,但這需要一些額外的解析。(請注意,PHP 超全域$_SERVER['REQUEST_URI']變數與同名的 Apache 伺服器變數不同,後者是 % 解碼的,如果 URL 被重寫,它可能會完全引用不同的 URL!)

但是,如果您想PATH_INFO使用 Apache 讀取 % 編碼(使用 mod_rewrite),那麼請考慮THE_REQUEST改為解析伺服器變數,該變數包含從客戶端發送的整個請求標頭。此變數未進行 % 解碼。這可以分配給環境變數甚至是 URL 參數,並由 PHP 以這種方式讀取。(請注意,QUERY_STRING伺服器變數和相應$_SERVER['QUERY_STRING']的超全域變數不是 % 解碼的,但 PHP 會解碼數組中的各個參數值$_GET。)

引用自:https://serverfault.com/questions/914847