簡體   English   中英

$ _SERVER變量在php中如何“防篡改”?

[英]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.

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