欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

php表單提交程序的安全使用方法第2/2頁

 更新時間:2008年07月10日 23:41:00   作者:  
是對一個接收自由提交表單數(shù)據(jù)的文件進行安全性分析,希望對各位有幫助。首先說明一下,代碼中的error()和succeed()是我自定義的函數(shù)

一個學習過PHP的人很容易就能看懂上面的代碼,但為什么我要拿來分析,因為在我學習PHP期間,看了不少程序的代碼,發(fā)現(xiàn)有個很普遍的問題,那就是大多數(shù)程序對于接受來自于表單的數(shù)據(jù)做的檢查還是不夠嚴謹,這恐怕是程序員思維問題,因為這些安全措施都是很容易實現(xiàn)的。
對于一個簡單的評論功能,我們假設它有兩個地方是需要用戶填寫的:評論人的姓名和評論內(nèi)容。那么,我們需要判斷的地方如下:
l        表單是否為空
l        表單長度(該項和上面的項判斷稱為邏輯性判斷,凡事都要符合邏輯)
l        表單內(nèi)容(判斷記錄是否存在于數(shù)據(jù)庫內(nèi),防止重復提交)
l        隱藏變量的過濾(如果有的話,注意上面表單有一個隱藏變量type="hidden",這往往容易讓人忽略)
l        提交時間間隔(這個是最最容易被忽略的)
邏輯判斷很多人都做了,但這僅僅只是解決了程序的邏輯問題,作為安全的程序,我們還要從安全的角度進行判斷,一個沒有做過安全檢查的此類程序,最容易受到以下攻擊:
l        修改隱藏變量進行非法提交(比如注入)
l        重復提交(對Web程序進行DoS攻擊)
編者注:重復提交所形成的攻擊的確是個非常煩人的問題,雖然這種方法沒有什么技術性可言,但卻會讓管理員傷透腦筋,因此很有必要在寫代碼時就加以防范。
修改隱藏變量通常是在本地構造一個表單,然后指定隱藏變量,如果過濾不到位,直接構造:
1' or 1=1 UNION Select * FROM any_table INTO OUTFILE 'c:/www/info.txt
然后提交,會有什么結果不用說了吧?
如果采用POST提交表單后刷新會出現(xiàn)提示,然后確定就可以反復提交,這樣可以浪費服務器的資源,如果量大的話站點速度可能會受少許影響,特別是數(shù)據(jù)量大的搜索引擎。這就是小小表單未做安全過濾的結果,相信任何站點管理員也不想看到吧?所以我們就要進行防御。防御思路如下:
針對隱藏變量我們可以采用過濾,針對重復提交我們可以:
l        采用cookie/session進行提交時間間隔的判斷;
l        提交前用strlen()函數(shù)判斷欲提交的標題和內(nèi)容是否和數(shù)據(jù)庫里已有的一致;
l        完成提交后用Header("Location: url");跳轉到其他頁面
下面我們就對上面的savecomment.php的if代碼段進行分析,關于針對修改變量攻擊的防御代碼大家可以看我在代碼上的注釋。對于采用cookie/session進行提交時間間隔的判斷這兩種方法,我有以下看法:
Cookie:信息存在客戶端,利用工具可以修改、刪除使Cookie失效,因為他是連續(xù)發(fā)送,中間的間隔時間很短,來不急去刪除該Cookie的。但也不排除自己編段小程序來刪除Cookie。如果對Cookie不放心可以采用Session。
Session:信息存放在服務器,攻擊者不可能修改,但會占用服務器一丁點資源。我的服務器好,我就用Session,放心:)。
下面來看看分別用這兩種方式驗證的代碼:
Cookie:

 程序代碼
<?php
if (isset($_COOKIE['beforeid'])) {
error(“對不起,你兩次提交的時間間隔還不到2分鐘<br>”);
} else {
//先檢查相關Cookie是否存在,已存在則給出錯誤提示,不存在則正確執(zhí)行的代碼段,比如插入Insert語句。執(zhí)行完畢以后設置一個Cookie,表示已經(jīng)提交過,60*2表示2分鐘。
setcookie("beforeid",$blogid,time()+60*2,"/","",0);
succeed(“評論提交成功<br>”); }
?>

Session:

 程序代碼
<?php
session_start();
if (session_is_registered("time") && time()-$_SESSION['time']<60*2) {
error(“對不起,你兩次提交的時間間隔還不到2分鐘<br>”);
//$time 前一次提交的時間
} else {
//先檢查相關Session是否存在,已存在則給出錯誤提示,不存在則正確執(zhí)行的代碼段,比如插入Insert語句。執(zhí)行完畢以后設置一個Session,表示已經(jīng)提交過,60*2表示2分鐘。
$time=time();
session_register("time");
succeed(“評論提交成功<br>”);
}
?>


這種時間間隔的方法可以用于各種表單,比如搜索、留言等,它可以有效地控制程序的有序運行。
至于第三個思路是用Header("Location: url");跳轉頁面,我想既然加入了cookie/session驗證就不必貿(mào)然跳轉了,畢竟大家還是想看看提交的相關信息的。
怎么樣?想不到小小的表單驗證有這么大的學問吧?簡單幾行代碼就切斷讓攻擊者的路子,其實這些都很容易的,重要的是開發(fā)人員驗證的思路,我一個人只會加 cookie/session驗證這個思路,結合Envymask的判斷長度這條思路,我又掌握一點。其實開發(fā)安全的程序,安全措施的思路很重要,即使掌握各種防御代碼,但如果考慮不嚴謹,照樣有空子可鉆。
鄙人剛學PHP不到半個月。寫的代碼不夠規(guī)范、嚴謹,在各位高手面前班門弄斧了。
后記:一個小小的程序,已經(jīng)折射出了一些普遍存在的安全問題。在安全代碼的編寫過程中,僅僅注意以上問題還是遠遠不夠的,不過很多重大腳本漏洞的出現(xiàn)卻都是因為這種小問題引起的。平時可以看到,在一個腳本程序出現(xiàn)漏洞之后,往往一兩句代碼就可以將相關漏洞補得很嚴實了。腳本攻防是智者之間的較量,但是智者千慮,必有一失,所以相對于攻擊來說,防范要做到滴水不漏就顯得尤為困難。 

相關文章

最新評論