首先接受一个概念asp中只承认双引号AccessSQL中只承认单引号HTML由于其不严谨单双引号都承认以上是我的一点经验总结最终正确性还有待证实
在asp中要输出一个双引号需要使用转义字符两个双引号("")
例如
要输出字符串abc则responsewrite("abc")
要输出字符串"abc则responsewrite("""abc")//两边的双引号括起表示内部为一个字符串终于剩余两个双引号转义输出为一个双引号
要输出字符串ab"c则responsewrite("ab""c")
要输出一个双引号"则responsewrite("""")//这就是解释了为什么要写四个双引号了
此外还有另外一种方法就是使用ACSII字符
例如
要输出ab"c则responsewrite("ab"&chr()&"c")
接下来让我们再看看SQL中的单引号问题我们考虑这个问题主要是为了允许自己在进行字符串数据库处理的时候不至于出错和防止SQL注入
来看看最简单的SQL注入有一个留言板其表单有一个name项
在目标页面有如下代码
<%
name=RequestForm("name")
ConnExecute"InsertIntoGuestBook(name)VALUES(’"&name&"’)"
%>
如果我们提交的name为Jacky则上面的SQL语句为InsertIntoGuestBook(name)VALUES(’Jacky’)很明显这样符合我们的本意
可是如果我们提交的是I’mJacky则上面的语句变为InsertIntoGuestBook(name)VALUES(’I’mJacky’)然后不幸的事情发生了系统找到的第一个单引号是I’m中的单引号于是系统认为用户想提交的字符串(包括引号)仅仅只是’I’接下来的mJacky’)系统就无法解释了于是就认为你的语法错了
如何解决呢?那就是再进行数据库处理前先将一个单引号替换为两个单引号让系统将其解释为转义字符代码如下
<%
name=RequestForm("name")
name=Replace(name"’""’’")//即name=Replace(namechr()chr()&chr())
ConnExecute"InsertIntoGuestBook(name)VALUES(’"&name&"’)"
%>
再提交I’mJackySQL语句变为InsertIntoGuestBook(name)VALUES(’I’’mJacky’)在写入数据的时候SQL会自动识别出两个单引号的转义字符从而最终写入数据库的数据则为I’mJacky这就是我们所期待的正确结果