[SQL與PHP] 謹慎使用$_SERVER['PHP_SELF'](漏洞及解決辦法)



[SQL與PHP] 謹慎使用$_SERVER['PHP_SELF'](漏洞及解決辦法)

$_SERVER['PHP_SELF']是PHP語言中的「服務器端系統變量」,它的值是「當前php文件相對於網站根目錄的位置地址」。
舉例說明,如果在http://www.shuihan.com/output/html/data.php文件中使用$_SERVER['PHP_SELF'],代碼如下:
  1.         echo $_SERVER['PHP_SELF'];
複製代碼

則在瀏覽器中打開該頁輸出為:
/output/html/data.php

  正是由於$_SERVER['PHP_SELF']能輸出「當前文件相對根目錄的位置」,非常好用,所以很多程序員在寫程序的時候很喜歡用到它,PHPBB中就使用的這個變量遞交查詢結果。然而現在我要說的不是他多好用,而是它存在著漏洞,可能被壞人利用,惡意注入代碼。

  可能有人會問,既然是服務器端的系統變量,Hacker怎麼可能利用呢?這種認識是錯誤的。對於表單提交頁面,Hacker可以通過巧妙地遞交查詢代碼修改$_SERVER['PHP_SELF']的值,從而注入設計好的惡意代碼。我們還是看一個例子,下面這個代碼在很多程序中廣泛使用:(假如該代碼所在頁面是http://www.shuihan.com/form.php )
  1.         <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"><br><!-- My Form --><br></form>
複製代碼

一個有經驗的Hacker可能會用下面的地址訪問該頁面:

http://www.shuihan.com/form.php%22%3E%3Cscript%3Ealert(』XSS attack!』)%3C/script%3E%3Cbr

用上面這句話訪問頁面,相當於下面的代碼:
  1.         <form method="post" action="http://www.shuihan.com/form.php">
  2.         <script>alert('XSS attack!')</script><br /><br><!-- My Form -->
  3.         </form>
複製代碼

  通過上面的演示,現在你是否看到危險性了?(當然上面的演示例子是沒有危險的)。經過細心的設計,Hacker可以設計出任何可能的惡意注入查詢。

看到了危險的存在,那我們怎麼才能避免這個問題呢?或者我們已經在自己的設計中大量的使用了$_SERVER['PHP_SELF'],怎樣迴避這個漏洞呢?

  網上有很多帖子提及到這個漏洞,但是卻沒有幾個給出具體的解決辦法,這裡水寒參考了一位外國朋友的解決辦法,整理了一下貼出來供大家使用時參考。
  1.         //獲取"當前文件名"(form.php)
  2.         $phpself = basename(__FILE__);
  3.         //截取相對路徑中的"目錄部分"(php不含文件名),然後再在該"目錄部分"後面加上"當前文件名"
  4.         //兩部分接起來就構成了完整的"當前文件路徑",使用該路徑就清理掉了惡意代碼
  5.         $_SERVER['PHP_SELF'] = substr($_SERVER['PHP_SELF'], 0, strpos($_SERVER['PHP_SELF'],
  6.         $phpself)) . $phpself;
複製代碼

文章作者:水寒
本文地址:http://www.shuihan.com/article/211