首先接受一個概念:asp中只承認雙引號,Access SQL中只承認單引號,HTML由於其不嚴謹,單雙引號都承認。以上是我的一點經驗總結,最終正確性還有待證實。
在asp中,要輸出一個雙引號,需要使用轉義字符:兩個雙引號("")。
例如,
要輸出字符串 abc , 則 response.write("abc")
要輸出字符串 "abc , 則 response.write("""abc") //兩邊的雙引號括起,表示內部為一個字符串。終於剩余兩個雙引號,轉義輸出為一個雙引號。
要輸出字符串 ab"c , 則 response.write("ab""c")
要輸出一個雙引號 " , 則 response.write("""") //這就是解釋了為什麼要寫四個雙引號了
此外,還有另外一種方法,就是使用ACSII字符
例如,
要輸出 ab"c , 則 response.write("ab" & chr(34) & "c")
接下來,讓我們再看看SQL中的單引號問題。我們考慮這個問題,主要是為了允許自己在進行字符串數據庫處理的時候不至於出錯,和防止SQL注入。
來看看最簡單的SQL注入,有一個留言板,其表單有一個name項。
在目標頁面,有如下代碼:
<%
name = Request.Form("name")
Conn.Execute "Insert Into GuestBook (name) VALUES (’" & name &"’)"
%>
如果我們提交的name為 Jacky, 則上面的SQL語句為 Insert Into GuestBook (name) VALUES (’Jacky’),很明顯,這樣符合我們的本意。
可是,如果我們提交的是 I’m Jacky, 則上面的語句變為 Insert Into GuestBook (name) VALUES (’I’m Jacky’), 然後,不幸的事情發生了,系統找到的第一個單引號是I’m中的單引號,於是系統認為用戶想提交的字符串(包括引號)僅僅只是’I’.接下來的 m Jacky’) 系統就無法解釋了,於是就認為你的語法錯了。
如何解決呢?那就是再進行數據庫處理前先將一個單引號替換為兩個單引號,讓系統將其解釋為轉義字符,代碼如下:
<%
name = Request.Form("name")
name = Replace(name, "’", "’’") //即 name = Replace(name, chr(39), chr(39)&chr(39))
Conn.Execute "Insert Into GuestBook (name) VALUES (’" & name &"’)"
%>
再提交 I’m Jacky, SQL語句變為 Insert Into GuestBook (name) VALUES (’I’’m Jacky’), 在寫入數據的時候,SQL會自動識別出兩個單引號的轉義字符,從而最終寫入數據庫的數據則為 I’m Jacky ,這就是我們所期待的正確結果。