六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

CGI教學:CGI安全問題(3)

[摘要]2.4 拒絕不合要求的表單數據 CGI腳本可以有幾種方式拒絕接收提交給它的非預期的輸入。編寫CGI時應該使用其中一些技巧或所有這些技巧。 首先,CGI 腳本應設置接收多少數據的限制,不僅限制整個提交,也限制提交中的每個NAME/VALUE對。例如,CGI腳本讀取POST METHOD,檢查CONT...
2.4 拒絕不合要求的表單數據

CGI腳本可以有幾種方式拒絕接收提交給它的非預期的輸入。編寫CGI時應該使用其中一些技巧或所有這些技巧。

首先,CGI 腳本應設置接收多少數據的限制,不僅限制整個提交,也限制提交中的每個NAME/VALUE對。例如,CGI腳本讀取POST METHOD,檢查CONTENT-LENGTH環境變量的大小來確定某輸入是不是合理的預期輸入。如果CGI 腳本設計接收的唯一數據是某人的姓名,那么如果CONTENT-LENGTH大于100字節,就應該有理由返回一個錯誤。沒有哪個合理的姓有那么長,通過設置限制,就能使腳本不再盲目地讀取發送給它的內容。

注意

令人高興的是,不必擔心去限制通過POST方法提交的數據。GET是自限制的并且不會向腳本發送多于1KB的數據。服務器自動限制放人QUERY-STRING環境變量中的數據的大小,而這正是GET發送給CGI程序的信息。

當然,"黑客"們可以很容易地將表單由GET改為PUT從而繞過這種內置的限制。至少,程序應該檢查一下數據是否是用預期的方法提交的;最好是能正確且安全地處理兩種方法。

下一步,應保證腳本知道在接收到不能識別的數據時該怎么辦,例如,如果某表單要求用戶選擇兩個單選按鈕之一,腳本就不應該假設因為一個按鈕未被選擇,另一個就一定被選擇了。下面的Perl代碼就犯了這樣的錯誤:

if ($form_Data{"radio_choice"} eq "button_one"){
# Button One has been clicked }
else {
# Button Two has been clicked }

這段代碼假定因為表單僅提供了兩個選項,而第一項未被選中,那么第二項就肯定被選中了。這不一定是真的。盡管前面的例子沒有什么害處,但在某些情況下這樣的假設可能很危險。

CGI腳本應該能預期這種情形而相應地進行處理。例如,如果出現一些非預期的或"不可能"的情形,可以打印一個錯誤,如下所述:

If ($form_Data{"radio_choice"} eq "button_one") {
#Button One seleted }
elsif ($form_Data{"radio_choice} eq "button_two") {
#Button Two Selected }
else {
#Error }

通過加入第二個if語句--顯式檢查"radio_choice"實際上是"button_two"--這樣腳本更安全了;它不再做假設了。

當然,錯誤不一定是期望腳本在這些情形下生成的。有些腳本過于小心,驗證每個字段,即使是最輕微的非預期數據都生成錯誤信息,這樣往往很掃用戶的興。讓CGI 腳本識別非預期數據然后扔掉它,并且自動選擇一個缺省值也可以。

另一方面,腳本還可幫助用戶糾正錯誤而不是簡單地發一條錯誤消息或設置一個缺省值。如果表單要求用戶輸入機密文字,腳本應能在進行比較之前自動跳過輸入中的空白字符。下面即是一個完成此功能的Perl程序片段。

$user_input =~ s/\s//;
#Remove white space by replacing it with an empty string
if ($user_input eq $secret_Word) {
#Match! }

最后,可以更進一,讓CGI腳本能處理盡可能多的不同的輸入表單。盡管不可能預期到可能發送給CGI程序的所有內容,但對某個特定方面一般經常有幾種常用的方式,因而可以逐個檢查。

例如,僅僅因為所寫的表單使用POST方法向CGI腳本提交數據,并不意味著數據必須按那種方法進來。應該檢查REQUEET_METHOD環境變量來確定是使用了GET還是POST方法并相應地讀取數據,而不是假定數據都是來自預期的標準輸入(stdin)。一個真正編寫成功的CGI腳本能接收無論使用什么方法提交的數據并在處理過程中很安全。以下程序清單即是用Perl編寫的一個例子。

程序清單 CGI_READ.PL 一個充滿活力的讀取格式輸入的程序

#Takes the maximum length allowed as a parameter
#Returns 1 and the raw form data,or "0" and the error text
sub cgi_Read
{
local($input_Max)=1024 unless $input_Max=$_[0];
local($input_Method)=$ENV{'REOUEST_METHOO');
#Check for each possible REQUEST_METHODS
if ($input_Method eq "GET") {
#"GET"
local($input_Size)=length($ENV{'QUERY_STRING'});
#Check the size of the input
if($input_Size>$input_Max) {
return(0,"input too big"); }
#Read the input from QUERY_STRING
return(1,$ENV{'QUERY_TRING'}); }
elsif ($input_Method eq "POST") {
#"POST"
local($input_Size)=$ENV{'CONTENT_LENGTH'};
local($input_Data);
#Check the size of the input
if ($input_Size>$input_Max) {
return(0,"Input too big"); }
#Read the input from stdin
unless (read(STDIN,$input_Data,$input_Size)) {
return(0,"Could not read STDIN"); }
return(1,$Input_Data);
}
#Unrecognized METHOD
return (0,"METHOD not GET POST");
}

 總而言之,腳本應該不對接收的表單數據進行假設,應盡可能預計意料之外的情形并正確地處理不正確的或錯誤的輸入數據。在使用數據之前應按盡可能多的方式測試它;拒絕不合理的輸入并打印一條錯誤消息;如果某項出錯或漏了應自動選擇一個缺省值;甚至可以試圖對輸入進行編碼以成為程序的合理的輸入。選擇哪種方式依賴于自己想花費多少時間和精力,不過記住永遠也不要盲目接收傳給CGI腳來的所有信息。




主站蜘蛛池模板: 欧美艳星nikki办公室 | 一区亚洲 | 欧美做a一级视频免费观看 欧美坐爱视频 | 日本不卡高清免费v | 色噜噜狠狠色综合网图区 | 特级毛片全部免费播放a一级 | 日本香蕉一区二区在线观看 | 唐朝豪放女在线观看 | 日本一区二区高清免费不卡 | 特黄特黄的视频 | 天天操天天干天天射 | 午夜影视在线免费观看 | 色视频综合 | 日日夜夜伊人 | 亚洲成a | 日本免费成人网 | 亚洲mm8成为人影院 亚洲h在线观看 | 青草九九 | 亚欧成人乱码一区二区 | 四虎影院观看视频在线观看 | 新天堂网 | 殴美在线 | 日本高清视频色www在线观看 | 色婷婷综合久久久久中文 | 五月婷婷丁香六月 | 三级精品视频在线播放 | 五级毛片 | 四虎影院国产精品 | 午夜国产精品无套 | 日韩成人影片 | 日韩毛片在线影视 | 天天射天天爱天天干 | 奇米久久 | 做a视频大全 | 亚洲专区欧美专区 | 日本天堂网在线 | 亚洲国产成人久久一区久久 | 亚洲天堂免费在线视频 | 清清草免费视频 | 在线看欧美日韩中文字幕 | 日日干夜夜操视频 |