人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當前位置:蘿卜系統下載站 > 技術開發教程 > 詳細頁面

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

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

更新時間:2022-08-25 文章作者:未知 信息來源:網絡 閱讀次數:

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

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

網站地圖xml | 網站地圖html
主站蜘蛛池模板: 民乐县| 西华县| 美姑县| 临澧县| 梁平县| 阳江市| 昌乐县| 开江县| 新津县| 定兴县| 潮安县| 涿鹿县| 罗定市| 崇文区| 资兴市| 渭南市| 荆州市| 印江| 渑池县| 涿州市| 会昌县| 镇坪县| 霍邱县| 闻喜县| 赞皇县| 铁岭市| 南丰县| 化州市| 南岸区| 抚顺县| 扬州市| 连城县| 上饶县| 清水河县| 龙岩市| 于都县| 酉阳| 榕江县| 宝清县| 芮城县| 修武县|