以下為引用的內容: if ($admin) { echo '登陸成功!'; include('admin.php'); } else { echo '你不是管理員,無法進行管理!'; } |
好,我們看上的代碼好像是可以正常走運,沒問題,那加入我提交了一個非技術的參數過去,那麼效果怎麼樣呢?呵呵,你想一下,我們是不是直接就是管理員了,直接進行管理。當然,也許我們不會犯那麼簡單的錯誤,那一d很隱秘的錯誤也可能導致這個問題,比如最近暴我們的phpwind 1.3.6論壇有個落洞,導致能夠直接拿得管理員權限,就是因為有個$skin變量在初始化,導致左後面還是列問題。
那我怎麼避免上的問題呢?首先,從php.ini進手,把php.ini裡的register_global = off,是不是所有的註冊變量為全局,那就可以避免。但是,我們不是服務器管理員,只可以從代碼上改離,那我們怎麼改進上的代碼呢?我們改寫如下
以下為引用的內容: $admin = 0; // 初始化變量 if ($_POST['admin_user'] && $_POST['admin_pass']) { // 判斷提交的管理員用戶名和密碼是不是對的相應的處理代碼 // ... $admin = 1; } else { $admin = 0; }
if ($admin) |
2.防止SQL Injection(sql注射)
SQL注射應該是目前程序危害最大,包括最早從asp到php,基本上都是國內這兩年流走的技術,基本還原管就是通過對提交變量的不過濾形成注進怎麼然後用惡意用戶能夠提交一dsql查詢語句,導致還要數據被竊取、數據丟光了失或損壞,或被入侵到後台管理。
基本還原管我就不說嚕,我們看看下面兩篇文章就很明白了:
http://www.4ngel.net/article/36.htm
http://www.4ngel.net/article/30.htm
那我們既然了解了基本的注射入侵的方式,那我怎麼去防範呢?這個就我們應該從代碼去進手
我們知道Web上提交數據有兩種方式,一種是get、一種是post,那很多常見的sql注射是從get方式進手,而且注射的語句裡面一定是包含一dsql語句,因為沒有sql語句,又如何進行? sql語句有四大一句:
select、update、delete、insert,那我們如果在我們提交數據中進行過濾是否能避免呢d問題呢?
於是我使用正則就構建函數如下:
以下為引用的內容: /* } |
函數里的select,insert,update,delete,union,into,load_file,outfile /*,./,../,'等等危險的參數字符拼全部過濾扔,那就能夠控制提交的參數了,程序可以這麼構建:
以下為引用的內容: <?php if (inject_check($_GET['id'])) { exit('你提交的數據非法,請檢查後重新提交!'); } else { $id = $_GET['id']; echo '提交的數據合法,請繼續!'; } ?> |
/*
函數名稱:verify_id()
函數作用:校驗提交的ID類值是否合法
參 數:$id: 提交的ID值
返 回 值:返回處理後的ID
函數作者:heiyeluren
*/
function verify_id($id=null)
{
if (!$id) { exit('沒有提交參數!'); } // 是否為空判斷
elseif (inject_check($id)) { exit('提交的參數非法!'); } // 注射判斷
elseif (!is_numeric($id)) { exit('提交的參數非法!'); } // 數字判斷
$id = intval($id); // 整型化
return $id;
}
呵呵,那麼我們就能夠進行校驗了,於是我們上面的程式代碼就變成了下面的:
以下為引用的內容: <?php if (inject_check($_GET['id'])) { exit('你提交的數據非法,請檢查後重新提交!'); } else { $id = verify_id($_GET['id']); // 這裡引用了我們的過濾函數,對$id進行過濾 echo '提交的數據合法,請繼續!'; } ?> |