2010-10-07 71 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年,我正在考慮它。固定!