PHP 網頁設計 技巧

在PHP編碼果陣,如果考慮到一d比較基本既安全問題,首先一點:
1. 初始化你既變量

點解咁講呢?我們睇下下面d代碼:

以下為引用的內容:
if ($admin)
{
echo '登陸成功!';
include('admin.php');
}
else
{
echo '你不是管理員,無法進行管理!';
}

好,我地睇上面d代碼好似係可以正常運行,冇乜問題,咁加入我提交一個非法既參數過去呢,咁效果會點呢?呵呵,你想一下,我地是不是直接就係管理員了,直接進行管理。當然,可能我地唔會犯咁簡單既錯誤,咁一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
    全站熱搜

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