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

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

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腳來的所有信息。




主站蜘蛛池模板: 日韩影院在线 | 亚洲你懂的 | 天天狠天天操 | 日韩欧美一区二区三区不卡在线 | 色橹 | 亚洲国产综合精品中文字幕 | 午夜在线日韩免费精品福利 | 日韩一级片在线免费观看 | 亚洲a在线视频 | 性大交| 婷婷伊人 | 亚洲欧美在线免费观看 | 欧美又大又粗又长又硬 | 伊人免费在线观看高清版 | 中文字幕一区二区在线视频 | 日本在线看免费 | 婷婷综合久久中文字幕一本 | 人人看人人添人人谢 | 亚洲成年男人的天堂网 | 天天做天天爱天天操 | 日韩精品欧美高清区 | 日韩中文字幕一在线 | 青春草在线视频免费观看 | 一本久久道aa兔费看 | 天天热| 三级韩国一区久久二区综合 | 天天干天天操天天 | 天堂√在线官网 | 亚洲成a人片在线观看精品 亚洲成a人片在线观看导航 | 色婷婷久久综合中文久久蜜桃 | 天天干夜夜谢 | 天天射综合网站 | 亚洲an| 午夜影院在线视频 | 欧美性乱 | 日韩精品欧美激情国产一区 | 日本叼嗨 | 亚洲国产一区二区a毛片 | 亚洲欧美日韩另类在线专区 | 亚洲日本网站 | 最好免费高清视频观看韩国 |