javascript - 为什么需要 8 个反斜杠?

标签 javascript proxy escaping cgi xss

在编写一个“简单”cgi shell 脚本代理服务器以将引用的 xml 包装在 jsonp 样式回调中时,我遇到了转义反斜杠的问题(通过反复试验和 Opera 优秀的调试器解决了这个问题)。我仍在试图弄清楚为什么需要额外的一组反斜杠(8 vs. 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

最佳答案

一次传递由 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'

关于javascript - 为什么需要 8 个反斜杠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15318221/

相关文章:

javascript - 为什么这个 HTML5 地理位置相关的 javascript 代码会出错?

javascript - 在 FireFox 中工作但不能在 IE 中工作...有点像

java - 为什么 tomcat servlet 不使用 JVM 参数 http.proxyHost?

firefox - 配置系统范围的代理设置

batch-file - 批处理 : How to replace % sign within a variable?

powershell - 如何转义未知字符串并将其传递给 native 命令

javascript - 如何在 ForceDirectedTree amcharts 中的气泡上添加自定义事件

javascript - Vuex : state change not updating input field

.net - 为每个 FiddlerCore session 动态设置上游代理

php - PHP 转义字符串中的 JS(用于函数)