2010-10-07 62 views
1

我有一个IE7问题,不想通过使用HTMLTMPL的ajax调用来传递pickle对象。它适用于IE8(兼容模式)以及Firefox。IE7与Python Pickle对象

newhash['pickled'] = pickle.dumps(hash) 

由于JS不喜欢换行,我的正则表达式出来使用:

我已经使用命令腌制对象

newhash['pickled'] = re.sub('\n', 'LINEBREAK', newhash['pickled']) 

当我赶在Python我腌对象,它会取出LINEBREAK并放回\ n。我的ajax调用如下所示:

$.getJSON('/folder/MyPython.py', {'mode':'MyFunction', 'pickled':"<TMPL_VAR pickled ESCAPE="NONE">"}, function(data){ 

我在它之前及之后立即发出警报,并且所有事情都按预期工作。如果我在函数(数据)部分提醒,则没有任何提示。但是,如果我在ajax调用中取出“pickled”键,则一切正常。 pickle对象是我的python执行计算所需的所有变量,所以不通过它不是一个选项。

我腌对象是这样的:

(dp0LINEBREAKS'rlbool'LINEBREAKp1LINEBREAKL1LLINEBREAKsS'class7'LINEBREAKp2LINEBREAKS'50'LINEBREAKp3LINEBREAKsS'fedxbool'LINEBREAKp4LINEBREAKL1LLINEBREAKsS'weight1'LINEBREAKp5LINEBREAKS'1500'LINEBREAKp6LINEBREAKsS'conwaybool'LINEBREAKp7LINEBREAKL1LLINEBREAKsS'originzip'LINEBREAKp8LINEBREAKS'37130'LINEBREAKp9LINEBREAKsS'company'LINEBREAKp10LINEBREAKS''LINEBREAKp11LINEBREAKsS'destinationzip'LINEBREAKp12LINEBREAKS'37130'LINEBREAKp13LINEBREAKsS'class6'LINEBREAKp14LINEBREAKS'50'LINEBREAKp15LINEBREAKsS'mode'LINEBREAKp16LINEBREAKS'Crawl'LINEBREAKp17LINEBREAKsS'averitlogin'LINEBREAKp18LINEBREAKS'QVSINC'LINEBREAKp19LINEBREAKsS'accessories'LINEBREAKp20LINEBREAK(lp21LINEBREAKsS'address'LINEBREAKp22LINEBREAKS'330%20Robert%20Rose%20Blvd.'LINEBREAKp23LINEBREAKsS'active'LINEBREAKp24LINEBREAKL1LLINEBREAKsS'averittbool'LINEBREAKp25LINEBREAKL1LLINEBREAKsS'id'LINEBREAKp26LINEBREAKL19LLINEBREAKsS'averitpass'LINEBREAKp27LINEBREAKS'MERIDIAN'LINEBREAKp28LINEBREAKsS'shipmentdate'LINEBREAKp29LINEBREAKS'2010-10-08'LINEBREAKp30LINEBREAKsS'city'LINEBREAKp31LINEBREAKS'Murfreesboro'LINEBREAKp32LINEBREAKsS'class5'LINEBREAKp33LINEBREAKS'50'LINEBREAKp34LINEBREAKsS'last'LINEBREAKp35LINEBREAKS'Morgan'LINEBREAKp36LINEBREAKsS'originstate'LINEBREAKp37LINEBREAKS'TN'LINEBREAKp38LINEBREAKsS'zip'LINEBREAKp39LINEBREAKS'37129'LINEBREAKp40LINEBREAKsS'phone'LINEBREAKp41LINEBREAKS'615%20713-5432'LINEBREAKp42LINEBREAKsS'destinationstate'LINEBREAKp43LINEBREAKS'TN'LINEBREAKp44LINEBREAKsS'Accessories'LINEBREAKp45LINEBREAK(lp46LINEBREAKsS'comments'LINEBREAKp47LINEBREAKg11LINEBREAKsS'estesbool'LINEBREAKp48LINEBREAKL1LLINEBREAKsS'origincity'LINEBREAKp49LINEBREAKS'Murfreesboro'LINEBREAKp50LINEBREAKsS'class8'LINEBREAKp51LINEBREAKS'50'LINEBREAKp52LINEBREAKsS'state'LINEBREAKp53LINEBREAKS'TN'LINEBREAKp54LINEBREAKsS'email'LINEBREAKp55LINEBREAKS'chris2'LINEBREAKp56LINEBREAKsS'vitranbool'LINEBREAKp57LINEBREAKL1LLINEBREAKsS'saiabool'LINEBREAKp58LINEBREAKL1LLINEBREAKsS'destinationcity'LINEBREAKp59LINEBREAKS'Murfreesboro'LINEBREAKp60LINEBREAKsS'class3'LINEBREAKp61LINEBREAKS'50'LINEBREAKp62LINEBREAKsS'class4'LINEBREAKp63LINEBREAKS'50'LINEBREAKp64LINEBREAKsS'class1'LINEBREAKp65LINEBREAKS'50'LINEBREAKp66LINEBREAKsS'class2'LINEBREAKp67LINEBREAKS'50'LINEBREAKp68LINEBREAKsS'address2'LINEBREAKp69LINEBREAKg11LINEBREAKsS'first'LINEBREAKp70LINEBREAKS'Chris'LINEBREAKp71LINEBREAKs. 

我只能假设,有在这里IE7有一个问题,一些字符。

在此先感谢您的帮助。

回答

4

首先,阅读Why Python Pickle is Insecure。不要使用可以被用户修改的腌制对象。

相反,为什么不简单地使用JSON,这显然是用于JavaScript的。它包含在Python> = 2.6中,也可用于旧版本。由于你的数据只是一本字典,所以JSON应该工作得很好。

另一种选择是base64编码,它不应该让你陷入特殊字符的困扰。

+0

,我遇到的问题是因为IE7中的URL长度。不过,我绝对应该刚刚使用JSON开始。 – Chris 2010-10-07 15:10:18

+1

@thejew:很高兴知道,没有看到。对于可能变大的对象,应该使用POST参数,因为URL长度通常受到客户端/浏览器的限制。 – AndiDog 2010-10-07 15:32:11

1

这意味着腌渍的数据可以在用户身上进行更改?会有很高的安全风险。

+0

在大多数情况下,我会同意你的看法。然而,我们的情况有点不同。腌制的数据从不改变我们系统中的任何东西。这些数据就是他们在此页面之前的页面中放置的内容。该数据将放入网络抓取工具并发送到其他网站以获取结果。它只会伤害用户改变这些数据。对我们或我们正在爬取的网站没有安全风险。 – Chris 2010-10-07 13:26:50

+3

@thejew:只要你解开它,它可能会造成伤害。请参阅我答案中的链接。而且由于Python只在服务器上运行,这对您的服务器而言是一种安全风险,而不是用户。 – AndiDog 2010-10-07 13:33:20

+0

我读过链接,我绝对同意。我应该从技术上切换到JSON – Chris 2010-10-07 19:25:54

0

答案是URL长度。最大请求的URL长度是2083年,我正在考虑它。固定!