【问题标题】:Backslashes being added into my cookie in Python在 Python 中将反斜杠添加到我的 cookie 中
【发布时间】:2010-10-17 03:11:27
【问题描述】:

我正在使用 Python 的 SimpleCookie,我遇到了这个问题,我不确定它是否与我的语法有关。此外,这是我的 Python 课程的功课,所以它旨在教授 Python,所以这与我在现实世界中的做法相去甚远。

无论如何,所以基本上我将信息输入保存在 cookie 中的表单中。我正在尝试使用输入的新信息附加到以前的 cookie。但由于某种原因,在第三次数据输入时,cookie 突然在其中获得“\”。我不确定他们来自哪里。

这是我得到的输出类型:

"\"\\"\\\\"test:more\\\\":rttre\\":more\":and more"

#!/usr/local/bin/python

import cgi,os,time,Cookie
#error checking
import cgitb
cgitb.enable()

if 'HTTP_COOKIE' in os.environ:
    cookies = os.environ['HTTP_COOKIE']
    cookies = cookies.split('; ')
    for myCookie in cookies:
        myCookie = myCookie.split('=')
        name = myCookie[0]
        value = myCookie[1]
        if name == 'critter' :
            hideMe = value

#import critterClass

#get info from form
form = cgi.FieldStorage()
critterName = form.getvalue('input')
input2 = form.getvalue('input2')
hiddenCookie = form.getvalue('hiddenCookie')
hiddenVar = form.getvalue('hiddenVar')

#make cookie
cookie = Cookie.SimpleCookie()

#set critter Cookie
if critterName is not None:
    cookie['critter'] = critterName
#If already named
else:
    #if action asked, append cookie
    if input2 is not None:
        cookie['critter'] = hideMe+":"+input2
    else:
        cookie['critter'] = "default"

print cookie


print "Content-type: text/html\n\n"



if ((critterName is None) and (input2 is None)):
    print """
    <form name="critter" id="critter" method="post" action="critter.py">
    <label for="name">Name your pet: <input type="text" name="input" id="input" /></label>
    <input type="submit" name="submit" id="submit" value="Submit" />
    </form>
    """
else:
    formTwo ="""
    <form name="critter2" id="critter2" method="post" action="critter.py">
    <label for="name">%s wants to: <input type="text" name="input2" id="input2" /></label>
    <input type="hidden" name="hiddenVar" id="hiddenVar" value="%s" />
    <input type="submit" name="submit" id="submit" value="Submit" />
    </form>
    [name,play,feed,mood,levels,end]
    """
    print formTwo % (critterName,critterName)

if 'HTTP_COOKIE' in os.environ:
    cookies = os.environ['HTTP_COOKIE']
    cookies = cookies.split('; ')
    for myCookie in cookies:
        myCookie = myCookie.split('=')
        name = myCookie[0]
        value = myCookie[1]
        if name == 'critter' :
            print "name"+name
            print "value"+value

【问题讨论】:

  • 非常有趣的格式。我看了看修复它,但它是标签汤。 :) 再试一次,清理它看起来像普通的 Python 代码,然后选择代码块并单击编辑器上方的“代码示例”按钮(“101010”之一)。
  • 我很抱歉,希望这会更好。

标签: python


【解决方案1】:

正如其他人所解释的,反斜杠正在转义您插入到 cookie 值中的双引号字符。这里的(隐藏)机制是SimpleCookie 类。 BaseCookie.output() 方法返回适合作为 HTTP 标头发送的字符串表示形式。它将在双引号字符之前和反斜杠字符之前插入转义字符(反斜杠)。

print cookie

语句激活BaseCookie.output()

在您的字符串通过 cookie 的 output() 方法进行的每次行程中,反斜杠都会相乘(从第一对引号开始)。

>>> c1=Cookie.SimpleCookie()
>>> c1['name']='A:0'
>>> print c1
Set-Cookie: name="A:0"
>>> c1['name']=r'"A:0"'
>>> print c1
Set-Cookie: name="\"A:0\""
>>> c1['name']=r'"\"A:0\""'
>>> print c1
Set-Cookie: name="\"\\\"A:0\\\"\""
>>> 

【讨论】:

    【解决方案2】:

    其他人已经指出这是引号和反斜杠的反斜杠转义的结果。我只是想指出,如果您仔细查看您引用的输出结构,您可以在此处看到该结构是如何构建的。

    您从 SimpleCookie 获得的 cookie 值用引号括起来——(未处理的)cookie 具有,例如,

    `'[...], critter="value1", [...]'`
    

    拆分', ''=' 后,您将得到一个包含"value1" 的字符串。然后将一个新值附加到该字符串,以便该字符串包含"value1":value2

    下一次,你会得到那个字符串,但是用另一组引号包裹它——从概念上讲,""value1":value2"。但为了使网络浏览器在开头不会看到两个引号字符并认为仅此而已,内部的引号集被转义,因此它实际上返回为"\"value1\":value2"

    然后你附加另一个块,在服务器和客户端之间来回传递另一个传递,下一次(因为这些反斜杠现在也需要转义)你得到"\"\\"value1\\":value2\":value3"。以此类推。

    正如已经指出的那样,正确的解决方案是让SimpleCookie 进行解析,而不是自己切分字符串。

    【讨论】:

    • 感谢您抽出宝贵时间了解整个处理链。
    【解决方案3】:

    正如其他人已经说过的,一旦您在 cookie 的末尾添加“and more”,您就会遇到字符串转义问题。

    在此之前,从 SimpleCookie 返回的 cookie 标头不包含引号。 (如果 cookie 值中没有空格,则不需要使用引号。)

    # HTTP cookie header with no spaces in value
    Set-Cookie: cookie=value
    
    # HTTP cookie header with spaces in value
    Set-Cookie: cookie="value with spaces"
    

    我建议最初使用相同的 SimpleCookie 类来解析 cookie 标头,从而避免您手动进行,并且还可以正确处理字符串的转义。

    cookies = Cookie.SimpleCookie(os.environ.get('HTTP_COOKIE', ''))
    print cookies['critter'].value
    

    edit:对空格的整个处理不适用于这个问题(尽管在某些情况下它可能会在你意想不到的时候咬你。)但我建议使用 SimpleCookie 进行解析仍然有效。

    【讨论】:

      【解决方案4】:

      反斜杠用于“转义”字符串中原本具有特殊含义的字符,实际上剥夺了它们的特殊含义。经典案例是您可以在带引号的字符串中包含引号的方式,例如:

      Bob said "Hey!"
      

      可以这样写成字符串:

      "Bob said \"Hey!\""
      

      当然,您可能希望在其中使用常规反斜杠,因此“\”仅表示单个反斜杠。

      编辑:针对您对另一个答案的评论(关于使用正则表达式删除斜杠),我认为您选择了错误的一端。斜线不是问题,它们是一种症状。问题是您正在执行往返处理表示引用字符串的字符串,就好像它们是普通的旧字符串一样。想象一下两个朋友 Bob 和 Sam 正在交谈:

      Bob:  Hey!
      Sam:  Did you say "Hey!"?
      Bob:  Did you say "Did you say \"Hey!\"?"?
      

      这就是为什么直到第三次才出现。

      【讨论】:

        【解决方案5】:

        斜线是转义双引号的结果。显然,第一次通过时,您的代码会看到双引号,并通过添加反斜杠来转义它。然后它读取转义的反斜杠,并通过在反斜杠前面加上 -- 反斜杠来转义反斜杠。然后它读取....

        当你调用 append 时,问题就出现了。

        【讨论】:

          【解决方案6】:

          我不确定,但它看起来像常规的 Python 字符串转义。例如,如果您有一个包含反斜杠或双引号的字符串,Python 通常会以转义形式打印它,以使打印的字符串成为有效的字符串文字。

          以下sn-p说明:

          >>> a='hell\'s bells, \"my\" \\'
          >>> a
          'hell\'s bells, "my" \\'
          >>> print a
          hell's bells, "my" \
          

          不确定这是否相关,也许有更多领域知识的人可以加入。

          【讨论】:

          • 你认为如果我写一个正则表达式来取出转义它会起作用吗?看了一圈,发现没有像php那样的unescape()函数。
          • 原始字符串将按原样打印而不是转义,但不确定 SimpleCookie 是否支持。
          猜你喜欢
          • 1970-01-01
          • 2011-05-16
          • 1970-01-01
          • 1970-01-01
          • 2015-10-23
          • 1970-01-01
          • 2019-03-03
          • 2013-05-29
          • 1970-01-01
          相关资源
          最近更新 更多