在PHP編號那時候,如果考慮到一d比較基本的安全問題,首先一點:
1.初始化你的變量
為什麼這麼說?我們看看下面d代碼:
以下為引用的內容:
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)
{
echo '登陸成功!';
include('admin.php');
}
else
{
echo '你不是管理員,無法進行管理!';
}

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問題呢?

於是我使用正則就構建函數如下:

以下為引用的內容:

/*
函數名稱:inject_check()
函數作用:檢測提交的值是不是含有SQL注射的字符,防止注射,保護伺服器安全
參 數:$sql_str: 提交的變量
返 回 值:返回檢測結果,ture or false
函數作者:heiyeluren
*/
function inject_check($sql_str)
{
return eregi('select|insert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile', $sql_str); // 進行過濾

}

函數里的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 '提交的數據合法,請繼續!';
}
?>
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 zxc5867146 的頭像
    zxc5867146

    Web Security 防禦

    zxc5867146 發表在 痞客邦 留言(0) 人氣()