特殊的空格字符
在asp編程中,我們常常使用trim(rtrim,ltrim)函數去掉一些數據的開頭和結尾的空格,筆者最近寫了一個asp聊天室,有下面的一段代碼: <%dimname,title name=trim(request.form("name")) password=trim(request.form("password")) ifname=""orpassword="''thenresponse.redirect"error.asp?error=name&name=null" myDSN="DSN=test;uid=test;pwd=test" setcn=server.createobject("adodb.connection") cn.openmyDSN sql="insertintotest(name,title)values('"&name&"','"&password&"')" cn.execute(sql) cn.close%> 筆者使用了trim函數來去掉開頭和結尾的空格,在一般的情況下,這段程序執行的很正常,但是后來筆者竟然發現有人竟然可以使用空格進來,意思就是說,該用戶的name完全為空格,但是筆者嘗試自己使用空格卻無論都不能通過(即被程序監測了出來),開頭和結尾的空格都被trim函數給去掉了,即使中間有空格,筆者需要的話也可以使用一個函數把中間的空格給去掉,由于筆者使用的是sql數據庫記錄下的用戶資料,于是筆者懷疑他使用了其它什么的東西讓系統看不到,于是去察看紀錄用戶資料的sql數據庫(筆者曾經使用這種方法看到了帶換行符的用戶),但是筆者仍然看到數據庫中的改用戶的資料也是空格,這難道說該用戶使用了一種手段可以繞過我的用戶名和密碼監測嗎???實在找不到程序上的漏洞,于是只能向這位用戶請教,幸運的是這位用戶爽快的告訴了筆者,原來是"Alt+255",按住alt鍵然后依次按下小鍵盤中"2","5","5"就會產生一個比較特殊的東西"空格"字符(這個概念筆者也不是比較清楚,這是一種控制字符,在一些編輯器中可以看到word2000,應該還有其他的控制字符),這個空格字符不同于傳統的按下空格鍵產生的字符,它的asc代碼是255,而傳統的space鍵入的空格的asc代碼是32,trim函數只能認識asc代碼為32的代碼并去除,所以出現了出現空格用戶的情況!針對這種情況筆者設計了下面的兩種函數去掉這個"空格"字符, functionxuankong(str) dimresult dimj j=len(str) result="" dimi fori=1toj selectcasemid(str,i,1) case"<" result=result+"<" case">" result=result+">" casechr(34) result=result+""" case"&" result=result+"&"'以上代碼轉換一些html標記
casechr(255)'防止特殊空格 result=result casechr(13)'防止回車符 result=result+"<br>" casechr(10)'防止換行符 result=result+"<br>" caseelse result=result+mid(str,i,1) endselect next xuankong=result endfunction 然后在你的asp程序中使用這個函數,比如: name=xuankong(trim(request.form("name")))
因為字符0-zasc代碼的數值為48-122這一個區段,所以可以使用如下的方法監測:
dimj j=len(trim(request.form("name"))) fori=1toj ifasc(mid(name,i,1))>122orasc(mid(name,i,1))<48thenresponse..redirect"error.asp?error=special" next, 雖然這種“空格”暫時沒有發現會破壞程序的問題,但是卻是可以讓人搗亂的,還是防了的好,不過這種空格也有一種好處,如果作為你得上網密碼的話,嘿嘿……恐怕沒有幾個人能看到吧!看到的都是以為是space,但是卻不是……筆者不熟悉php和jsp所以不知道在這兩種東西中是否會存在這種問題
|