为什么我需要8个反斜杠?

时间:2013-03-10 02:25:26

标签: javascript proxy escaping cgi xss

在编写一个“简单”的cgi shell脚本代理服务器以在jsonp样式的回调中包装引用的xml时,我遇到了一个转义反斜杠的问题(通过反复试验和Opera优秀的调试器解决)。我仍在试图找出为什么需要额外的反斜杠(8对4)。我有理解,每个解析你需要加倍反斜杠的数量,但要么我似乎在某处忽略迭代,要么误解处理。是否在浏览器中解析了两次?

这是最终的工作代码,我试图找出它的工作原理

#!/bin/sh
CB=${QUERY_STRING%%&*}
URL=${QUERY_STRING#*&}
case "$CB" in
    callback=*)
        printf "Content-type: application/javascript\r\n\r\n${CB##*=}(\""
        wget -q --no-check-certificate -U "NetSurf/2.9 (Linux; i686)" -T 20 -O - "$URL" \
            |tr -c [\ -~] " "|sed "s/[\\]/\\\\\\\\/g;s/[\"]/\\\\\"/g"
        printf "\")"
        ;;
    *)exit;;
esac

这是我正在使用的测试页面(编辑 - 替换为更简单的非gzip版本)。

<html><head><title>test</title></head><body><div id="notaniframe"></div>
<script>
    function dummy(data){document.getElementById("notaniframe").innerHTML=data}
    Loaded=0
    setTimeout(function(){if(!Loaded)alert("load failed")},30000);
</script>
<script onload='Loaded=1' src="http://localhost/cgi-bin/xml2jsonp.cgi?callback=dummy&http://stackoverflow.com"></script>
</body></html>

这只是将stackoverflow.com变成了一个div

1 个答案:

答案 0 :(得分:2)

Bash执行一次传球;这个命令:

sed "s/[\\]/\\\\\\\\/g;s/[\"]/\\\\\"/g"

运行此sed脚本:

s/[\]/\\\\/g;s/["]/\\"/g

sed执行一次传球;在替换字符串中,\\表示\。因此,此sed脚本会将\替换为\\,将"替换为\"。如你所愿。 (请注意,"周围的方括号实际上并未在此处执行任何操作,\周围的方括号等同于使用另一个\转义它。)

您可以在Bash脚本中使用单引号而不是双引号来删除一组反斜杠;在单引号内,\没有特殊含义。换句话说,你可以改变这个:

sed "s/[\\]/\\\\\\\\/g;s/[\"]/\\\\\"/g"

到此:

sed 's/[\]/\\\\/g;s/["]/\\"/g'

或者就此而言:

sed 's/\\/\\\\/g;s/"/\\"/g'