在Python中转义JavaScript字符串

8

我有一个Python脚本,用于构建一些JavaScript代码,并将其作为JSON数据发送到浏览器。我希望对JavaScript字符串进行转义,并使用单引号进行分隔。由于json.dumps使用双引号作为分隔符(正如JSON规范所要求的那样),因此我无法使用它。

在Python中是否有JavaScript字符串转义方法?

示例:

def logIt(self, str):
    #todo: need to escape str here
    cmd = "console.log('%(text)s');" % { 'text': str}
    json.dumps({ "script": cmd })

所以logIt('example text')应该返回类似这样的内容:
{
  "script": "console.log('example text');"
}

我认为你的代码返回了你需要的东西... - kirelagin
1
不要使用 logIt('Uh oh\'') - Eric
你为什么关心单引号和双引号的区别? - Eric
哦,是的,我现在明白了。这个问题可能应该在问题中提到... - kirelagin
我关心这个问题,因为单引号的大小只有双引号的1/4,并且我需要发送大量数据。 - Lance Fisher
1个回答

11

json.dumps是一个转义函数 - 它接受任何值,使其成为一个有效的JavaScript文字。

def logIt(self, str):
    cmd = "console.log({0});".format(json.dumps(str))
    json.dumps({ "script": cmd })

生产:

>>> print logIt('example text')
{ "script": "console.log(\"example text\");" }
>>> print logIt('example "quoted" text')
{ "script": "console.log(\"example \\\"quoted\\\" text\");" }

或者:
import string
import json
import functools

quote_swap = functools.partial(
    string.translate, table=string.maketrans('\'"', '"\'')
)

def encode_single_quoted_js_string(s):
    return quote_swap(json.dumps(quote_swap(s)))

是的,我知道json.dumps,但我想避免使用\"代替可以直接使用'的引号。 - Lance Fisher
@LanceFisher:但是你无法避免 \\\" - 原始文本包含 ". 我猜你指的是 \"? - Eric
你是对的,在这个例子中,是 ". json.dumps 把双引号放在它周围。基本上,我想要一个json.dumps()输出单引号而不是双引号。 - Lance Fisher
5
json.dumps可能存在安全风险(如果脚本位于html的<script>标签内)。当使用json.dumps('</script>')时,会返回"</script>"。请参考https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet中的正确转义方法。 - Taha Jahangir
@TahaJahangir:只有在您在上下文中使用它时才会出现问题,例如print '<script>var myData =' + json.dumps(...) + '; ... </script>'。如果JSON没有直接注入页面,就像OP在这个问题中描述的那样,那么就没问题了。 - Eric
@TahaJahangir评论的更新链接:https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html - rboc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接