2012-02-25 74 views
0

我想將PHP變量傳遞給Javascript,而不觸發任何新的http請求(又名:直接插入標記)。但我想要的內容(沒有任何可能改變我的價值的消毒,即使它們在標記本身)。當然,我也想保持安全。這會有什麼副作用嗎?

我已經想出了迄今爲止最好的方法包括JSON + BASE64_ENCODE +數據URI方案:

<script type="text/javascript" src="data:text/javascript;base64,<?php echo base64_encode('var thing = '.json_encode($thing)); ?>"></script> 

我的問題是:將這個有什麼副作用?我可以安全地使用這個嗎?

+4

有一件事情是它不會在IE 7和8中工作,甚至可能不是9。然後我真的不明白這個練習的重點?這實現了什麼,簡單地插入純文本JavaScript不? – 2012-02-25 21:48:04

+0

我做了一些非常相似的事情(JSON/base64),在我的情況下,它是用一個URL參數發送複雜的數據客戶端 - >服務器。它運行良好。 – 2012-02-25 21:49:25

+0

但是對於你的情況,如果你的JSON編碼字符串,你應該能夠直接將它放入標記中,它不需要編碼或轉義(JSON編碼實際上爲你逃脫任何字符串)。 – 2012-02-25 21:50:37

回答

2

我當然不會這樣做。您正在引入不必要的兼容性問題(IE)。通過base64編碼,你膨脹了你的JSON的大小~37%

<script type="text/javascript">var thing = <?php echo json_encode($thing); ?></script> 

實際上,你可能會在運行的唯一的問題是,如果$thing在字符串中的「</script>」的地方。(它看起來像json_encode()居然逃脫所有斜槓/,所以這不是一個問題。) HTML解析器會忽略其他任何看起來像標記的<script>塊。

如果你的頁面不是UTF-8,你必須注意文本編碼。

+2

+1,但爲了完整性,可能遇到的另一個問題是輸出JSON UTF-8)在ISO-8859-1或其他非UTF-8上下文中。 – 2012-02-25 22:07:29

+0

實際上,我測試@ Pekka的解決方案,包含一個包含''字符串的數組,並且工作得很好。 – 2012-02-25 22:08:12

+0

json_encode讓我的腳本標記爲' <\/script>'。nice(: – 2012-02-25 22:12:41