一,HTML里面,一句典型的
<input name="name1" id="id1" value="
XXX">或
<input name="name1" id="id1" value='
XXX'>
这里首先澄清一点,HTML里面没有反斜杠'/'转义符这一说,不要在HTML里把/当作转义符。如果在HTML出现你觉得象是转义符的"/",那么它也许是为其它后续的文本处理埋下伏笔的。
如果想让这"XXX"里支持任何的文本而不产生页面错误,基本上需要处理以下几个特殊字符的转义:
1. " 双引号 " -> "
2. ' 单引号 ' -> '
3. & AND & -> &
4. < 小于号 < -> <
5. > 大于号 > -> >
在value=""这种格式里面,双引号是必须转义的,单引号可不转;
在value=''这种形式里面,单引号是必须转义的,双引号可不转;当然为了万全之策,两个一起转吧。
第三个"&"在普通的时候不会出问题,但在 <等连续出现的时候,就会出现显示问题。所以,为防万一这个"&"是必须转义的。
第四个和第五个我暂时没有发现有转义的必要,但是一个同事说不转可能会出事,那么就一起转吧。
二,Javascript里, 也来一句典型的。
var str = "XXX";或
var str = 'XXX';
首先澄清一点,Javascript里面没有“”是弱引用,''是强引用这一说法。""与''对字符串的引用都是一样的,不同的只是定界符。
但是,'/'反斜杠在Javascript是特殊字符的转义符。
Javascript里面,以下的几个字符需要注意:
1. " 双引号 " -> /"
2. ' 单引号 ' -> /'
3. / 反斜框 / -> //
在"(双引号)作为定界符时,'其实是可以不转义的;相反当'(单引号)作为定界符时,"也是可以不转义的;但是为了广义的兼容,我们把两个一起转义。同样,/(反斜杠)无论在哪种定界符时都需要转义。
三,PHP
PHP里面,首先说一下,""是弱引用,''为强引用。这一点跟bash下很相似。
然后,PHP里面也支持/(反斜杠)作为转义符。
关于以上两点一般我们都会注意,我想说的是以下这一点,关于表单提交过后的内容的自动转义形为。
下面是一句典型的表单内容提取的语句:
$name = $_POST['name'];
有时候我们会发现明明表单提交过来的是
,而收到的却是
。这是因为PHP里面的magic quotes gpc打开了,这样,GET、POST或COOKIE过来的'(单引号),"(双引号)和/(反斜杠)都会被自动转义,这三个字符的前面都会被自动加上/(反斜杠作为转义符)。正因为如此,使得你无论如何都不可能提交过来单数个/(反斜框)。:)
int
get_magic_quotes_gpc ( void )方法可以取到这个转换开关的状态,默认情况下,PHP是打开这个开关的。
以下两个函数分别是为字符串加上转义符和为字符串去掉转义符:
string
addslashes ( string str)
string
stripslashes ( string str)
在加上或去掉之前,请尽量先判断一下PHP是否已经自动对提交过来的数据转义过。
PHP里需要注意的特殊字符有:
1. " 双引号 " -> /"
2. ' 单引号 ' -> /'
3. / 反斜框 / -> //
四,bash下面
有时候,我们在PHP里面有这样的命令调用方式:
$result = `/usr/local/bin/command "$parameter"`;
关于bash下特殊字符的转义,改天再用另一篇文章专门来写,这个算起来已经比较复杂了。简单的讲,在""形式的弱引用下,需要注意的字符有如下五个:
1. $(美元符),单个的美元符并不能作什么,但连接字母或数字或符号就成了变量的引用
2. `(back quote),这个是命令包含的起始符
3. /(反斜杠),这个是转义符
4. "(双引号),
5. !(感叹号)
在''强引用形式下,不需要做任何的转义,''(单引号)内的所有字符都将保留原样。这一点是比较明了的。
下面几个例子,如果能够完全肯定的说出他们输出什么,你也就了解了很多转义的奥妙了。值得提起注意的是在调用awk和sed进行二次处理的时候,还有二次转义等一些令人匪夷所思的现象发生。如果不多加注意将会产生一些意想不到的错误。
1. 如下:
b="
" #16个
a=$b
echo $a
a="$b"
echo $a
a='$b"
echo $a
2. 如下:
a=/`/!/$/%/^/&
echo $a
echo "$a"
a="/`/!/$/%/^/&"
echo $a
echo "$a"
a='/`/!/$/%/^/&'
echo $a
echo "$a"
3. 如下:
a="
"
b=$a
echo $b
c=$b
echo $c
d=$c
echo $d
e=$d
echo $e
a="
"
b="$a"
echo "$b"
c="$b"
echo $c
d="$c"
echo $d
e="$d"
echo $e
4. 如下:
pass="
"
echo "" | awk -v pass=$pass '{ print pass }'
echo "" | awk -v pass="$pass" '{ print pass }'
echo "" | awk -v pass='$pass' '{ print pass }'
pass='
'
echo "" | awk -v pass=$pass '{ print pass }'
echo "" | awk -v pass="$pass" '{ print pass }'
echo "" | awk -v pass='$pass' '{ print pass }'
5. 如下:
a="/$/&*()"
echo "saaab" | sed "s/aa/$a/"
a="/$&*()"
echo "saaab" | sed "s/aa/$a/"
这里,我很多都写的是对比例子。如果我没有写出对比例子,有些情况对经验不是很丰富的我们来讲是很难考虑到的。