[英]How “tamper proof” is the $_SERVER variable in php?
通過使用$ _SERVER ['PHP_SELF']信任$ _SERVER變量數組的內容來獲取php文件的名稱,我是否會承擔很大的安全風險?
許多但不是全部的$ _SERVER變量是攻擊者控制的 。 例如, $_SERVER['SCRIPT_NAME']
是安全的,而$_SEVER['PHP_SELF']
是一個危險的變量,通常是xss的來源:
<?php
echo $_SEVER['PHP_SELF'];
?>
PoC:
http://localhost/self.php/<script>alert(/xss/)</script>
通過查看phpinfo可以很容易地看到此漏洞的發生。
沒有有效的特殊機制來保護此變量。 您可以像寫入其他任何變量一樣對其進行寫入。 因此,您必須像其他任何變量一樣保護它免受篡改(禁用register_globals,避免使用變量變量等)。 然后,您可以信任它。
作為確定的解決方法,您可以在程序的早期定義自己的常量:
define('SCRIPT_FILENAME',$_SERVER['SCRIPT_FILENAME']);
並使用可用的預定義常量,例如__FILE__
。
從php.net手冊 :
該數組中的條目由Web服務器創建。 不能保證每個Web服務器都可以提供其中的任何一個。 服務器可能會省略某些服務器,或提供此處未列出的其他服務器。
因此,如果您知道所有有權更改服務器配置的用戶(以及會話中可能修改變量內容的所有腳本),則可以合理確定$_SERVER
變量的數據。
完全沒有,只要您不使用用戶數據,這實際上就不會構成風險。 也就是說,使用以下之一:
echo __FILE__;
// is the same as
echo $_SERVER["SCRIPT_FILENAME"];
echo $_SERVER["SCRIPT_NAME"];
// SCRIPT_NAME contains just the path
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.