2013-08-28 181 views
1

這可能是一個愚蠢的問題,但我想澄清這一點。當我們關閉一個JavaScript兩次時發生了什麼。當我們關閉腳本兩次時會發生什麼?

<script type="text/javascript"> 
alert("hello"); 
</script> 
</script> 

我這樣做,但像我們關閉腳本,並且不會有任何這樣的執行沒有錯誤將引發我相信我沒有得到任何error.its。這會在任何情況下造成麻煩嗎?

爲什麼問這是我想插入一個</script>在用戶提交腳本的插件的末尾。這樣我就不必爲驗證做額外的編碼工作了,如果這樣可以很好地工作而不會產生任何麻煩

+2

我認爲瀏覽器忽略了它。但它不是有效的XHTML。 –

+0

這樣做的目的是什麼? – Lion

+0

這是額外的無效標記,爲什麼你會擁有它呢? –

回答

1

大多數瀏覽器只會刪除/忽略一個額外的標籤。我看不出這會造成任何問題,但這是一個相當醜陋的做法。目前我沒有更好的建議。

0

沒什麼。瀏覽器忽略它,但它顯然不會通過標準。

據我所知,如果瀏覽器遇到開頭<script>標籤,它會假設一切,直到關閉</script>標籤爲腳本。所以從</script>開始將不起作用,但會導致「意外」異常。

+0

會導致任何問題嗎? – sun

0

效果可能會因瀏覽器而異,但在所有情況下都會忽略第二個標籤。

2

瀏覽器會將此視爲額外的意外結束標記。不要緊,它可以是</script>,也可以是</link>或其他任何在同一個上下文中允許的內容。

除非啓用strict/XML模式,否則大多數瀏覽器都會默默忽略這些額外的標記。對於嚴格模式,您應該在控制檯中收到錯誤。

要正確包裹由用戶提供的插件,我建議這種策略:

  • 始終包裹在他們自己的標籤(所以你可以肯定的結構總是正確的)。

  • 檢查你把兩個標記之間的<script<script></script>,如果你發現任何人報告錯誤的字符串。

這裏的想法是,用戶不應該在他們的代碼中使用腳本標記,並且將他們放在他們所屬的位置。

+1

'文件。寫(「<」+「script」+「>」)' –

+1

(甚至不認爲你可以禁止'document.write') –

+0

我知道'document.write'。上面的要點是爲了防止意外使用'

0

XHTML規則比HTML的要嚴格得多。當在XHTML文件的腳本中使用特殊XML 字符(例如&和<)時,它們會導致錯誤 。最簡單的解決方法是使用外部腳本文件。 但是,如果您只需編寫內聯腳本,則需要 將CDATA(字符數據)部分包含在文件中。在CDATA 部分內,可以自由使用特殊的XML字符。以下 示例使用與XHTML和HTML語法兼容的CDATA部分。

<script type="text/javascript"> 
//<![CDATA[ 
    alert((1 < 2) && (3 > 2)); 
//]]> 
</script> 

此外,它不是一個正確的做法,如果腳本嵌入比它會打破W3C合規性。

0

要回答你的直接問題:什麼都不會發生,它只是無效(x)瀏覽器忽略的HTML。

要回答你的問題,間接在意見橫空出世:

@DanFromGermany所以你說的驗證是有唯一的出路,否則這種方式不推薦

驗證外部資源總是至關重要的。

例如,簡單的讀外部腳本到<script></script>標記,告訴瀏覽器「這是沒有外部內容」,並在此授予更多的訪問,例如讀取cookie並設置從(外部內容始發餅乾....你的域名)

通過<script src="...">包含來自不同主機/域的外部JS,告訴瀏覽器「這是第三方腳本,不能像內部腳本那麼多」。因此不允許讀取或設置您的cookie和內容。

爲什麼投入</script>沒有幫助:

攻擊者容易能夠旋擰你的整個網站,讓它很容易消失。

請參閱以下內容:

<script> 
<!-- external script start --> 

</script> 
</head> 
<body> 

Attackers website start 


<div style="display:hidden;"> 

everything below disappears 

<!-- 

<!-- external script end --> 
</script> 
</head> 
<body> 
<!-- your website start !--> 

不過,如果你避免這種情況,攻擊者可以隨時使用document.write();插入HTML到您的網站。

也許最好的方法是通過iframe,從空白頁和獨立(子)域執行給定的JS。

把東西放入數據庫,或保存一個JS,讓它由不同的用戶執行需要額外的驗證。

+0

我的插件情況是用戶將會看到他們在腳本部分給出的預覽。例如jsfiddle類的東西。 – sun

+0

jsfiddles在空白頁中執行,但最重要的是,在獨立域下(從jsfiddle.net到http://fiddle.jshell.net/_display/)執行,因此執行的腳本作爲第三方腳本執行。 – DanFromGermany

相關問題