SiteFactoryCMS1.1版新增功能快遞:URL地址傳遞參數(shù)的數(shù)據(jù)類(lèi)型檢查
程序在什么環(huán)境下最安全?這是開(kāi)發(fā)組從最初設(shè)計(jì)SiteFactory時(shí)就一直在討論和研究的問(wèn)題。在SiteFactory 1.0版的開(kāi)發(fā)中,我們用了很多措施來(lái)保證系統(tǒng)的相對(duì)安全,具體可以查看想博客文章和官網(wǎng)介紹。今天要給大家介紹的SiteFactory? CMS 1.1版中新安全措施中一種——地址參數(shù)檢查措施。
什么是地址參數(shù)
比如我們?cè)L問(wèn)charliemorecraft.cn/item/88.aspx,因?yàn)槲覀兿到y(tǒng)做了UrlRewrite,實(shí)際訪問(wèn)的地址是charliemorecraft.cn/item.aspx?id=88 那么“Id=88”就叫做地址參數(shù)。
地址傳遞參數(shù)做類(lèi)型檢查有什么好處
以上面的地址為例子,“88”通常用來(lái)作為查詢條件的,如果處理不好,很容易造成萬(wàn)惡的SQL注入漏洞。當(dāng)然單單就“ID=88”來(lái)說(shuō),堵住漏洞的方法有很多種,感覺(jué)最好的辦法就是限制用戶輸入。當(dāng)我們知道這個(gè)頁(yè)面只接受一個(gè)ID參數(shù),并且是數(shù)字類(lèi)型的話,那么我們?cè)谧層脩敉ㄟ^(guò)url傳遞Id時(shí),這個(gè)參數(shù)就只能是數(shù)字,是其他類(lèi)型就給出錯(cuò)誤提示,拒絕其進(jìn)一步的訪問(wèn)。
下面是出錯(cuò)演示:
比如,當(dāng)我們?cè)L問(wèn) charliemorecraft.cn/item.aspx?id=88時(shí),則一切正常。當(dāng)我們?cè)L問(wèn)charliemorecraft.cn/item.aspx?id=d’d 則會(huì)出現(xiàn)如下提示:
其他錯(cuò)誤提示還有 參數(shù)太多,缺少參數(shù),參數(shù)錯(cuò)誤等提示。
這次在SiteFactory 1.1版中已經(jīng)默認(rèn)開(kāi)啟了這個(gè)驗(yàn)證。我們對(duì)于所有前臺(tái)的頁(yè)面(管理后臺(tái)由于站長(zhǎng)可以改目錄使別人猜不到而沒(méi)有做判斷)也都在Config/QueryStrings.config中進(jìn)行了配置。
如何修改QueryStrings.config?
用Editplus或者其他文本編輯器打開(kāi)這個(gè)文件(Config/QueryStrings.config),首先看到第一行
Mode這里作用是設(shè)置參數(shù)檢查的方式。OnlyList的意思是只檢查QueryStrings.config中列出的文件。我們也可以設(shè)為All,這樣就是所有請(qǐng)求網(wǎng)站的aspx文件都會(huì)被檢查。如果這些文件沒(méi)有被配置在QueryStrings.config中,那么就說(shuō)明這些文件是不允許帶任何參數(shù)的。
Page節(jié)的說(shuō)明
在page節(jié)中有兩個(gè)參數(shù),第一個(gè)參數(shù) url就是要判斷的頁(yè)面,要注意這里的地址填寫(xiě),填寫(xiě)不對(duì)就出錯(cuò)了。第二個(gè)參數(shù)abortOnError 是否忽略錯(cuò)誤。就是說(shuō)當(dāng)有人傳遞url地址時(shí),地址附加的參數(shù)和page中配置的不一樣,如果把a(bǔ)bortOnError設(shè)置為false,就是不進(jìn)行錯(cuò)誤提示,允許用戶繼續(xù)操作。如果page中沒(méi)有abortOnError或者把a(bǔ)bortOnError設(shè)置為了true,那么就會(huì)出現(xiàn)錯(cuò)誤提示,并終止操作。
什么時(shí)間下用abortOnError設(shè)為true,什么時(shí)間下設(shè)為false?
當(dāng)我們已知這個(gè)頁(yè)面能夠接受多少參數(shù),每個(gè)參數(shù)類(lèi)型也都清楚,那么為了網(wǎng)站安全,建議盡量設(shè)置為true。不能預(yù)計(jì)參數(shù)或者懶惰不想配置每個(gè)頁(yè)面參數(shù)的話,就設(shè)置為false。比如SiteFactory1.1中,這個(gè)page節(jié)<page url="~/PayOnline/PayResult99bill.aspx" abortOnError="false">我們不能預(yù)知在線支付接口那里會(huì)返回多少個(gè)參數(shù),我們就設(shè)置為false。,但是我們?cè)趐age下設(shè)置的頁(yè)面參數(shù),仍然會(huì)進(jìn)行檢查。
注意page ,abortOnError是區(qū)分大小寫(xiě)的,大家在修改或者添加配置時(shí)不要寫(xiě)錯(cuò)了。
page節(jié)下的param節(jié)
在param節(jié)中,name就是參數(shù)名,實(shí)際地址中是什么就要寫(xiě)什么,name值不區(qū)分大小寫(xiě)。datatype 代表的是這個(gè)參數(shù)的數(shù)據(jù)類(lèi)型,datatype的值是區(qū)分大小寫(xiě)的。Int表示只接受數(shù)字類(lèi)型的。Datatype還有String,Bool等共三種類(lèi)型。如果我們把id的datatype改成了String 類(lèi)型,那么我們最初訪問(wèn)charliemorecraft.cn/item.aspx?id=d’d就不會(huì)出錯(cuò)了。
optional參數(shù)是代表這個(gè)參數(shù)是否是必須的。當(dāng)我們?cè)趐aram中沒(méi)有加optional或者optional=”true”時(shí),這就代表是這個(gè)參數(shù)是必須的。optional=”false”就代表是可選的。當(dāng)我們把參數(shù)設(shè)置為optional=”true”時(shí),如果我們?cè)谠Lcharliemorecraft.cn/item.aspx時(shí)沒(méi)有帶參數(shù),就會(huì)提示“缺少參數(shù)錯(cuò)誤”。如果設(shè)置為optional=”false”,那么就不會(huì)提示這個(gè)錯(cuò)誤。
另外對(duì)于param,當(dāng)數(shù)據(jù)類(lèi)型是String時(shí),我們還可以設(shè)定參數(shù)的長(zhǎng)度。類(lèi)似的情況如下:
這時(shí)的Pay只能接受3個(gè)字符長(zhǎng)度的參數(shù),當(dāng)我們傳遞給Pay=aabc時(shí),就會(huì)提示出錯(cuò)。而傳遞給Pay=aab時(shí),就沒(méi)有問(wèn)題。
如果修改錯(cuò)誤提示為其他文字
有些用戶可能對(duì)于 參數(shù)錯(cuò)誤,參數(shù)太多,缺少參數(shù)等錯(cuò)誤提示,感覺(jué)不夠個(gè)性化或者想要改成英文的??梢酝ㄟ^(guò)修改App_GlobalResources文件夾下的ErrorMessage.resx文件。App_GlobalResources是存放資源的文件夾。我們把很多錯(cuò)誤提示都放到了ErrorMessage.resx中,下個(gè)版本我們可能會(huì)提供多語(yǔ)言支持。這個(gè)文件可以用Editplus或者DreamWeave進(jìn)行打開(kāi),找到PageParamLessThen、PageParamMoreThen、PageParamNotContains、PageParamUnequal等幾個(gè)參數(shù),修改value中的值就可以了。如果想要在value中嵌入html碼,需要首先進(jìn)行轉(zhuǎn)義,比如把“<”變成“<”,把“>”變成“>”。
2 <value><li>缺少參數(shù)!</li></value>
3 </data>
當(dāng)你的網(wǎng)站出現(xiàn)參數(shù)錯(cuò)誤一類(lèi)的提示時(shí),就要檢查一下Config/QueryStrings.config中,看配置是否和實(shí)際的一樣了。
任何疑問(wèn)或者建議,請(qǐng)發(fā)郵件到powereasydeveloper@qq.com
用戶登錄
還沒(méi)有賬號(hào)?
立即注冊(cè)