簡體   English   中英

是否有必要為javascript字符串“轉義”字符“<”和“>”?

[英]Is it necessary to “escape” character “<” and “>” for javascript string?

有時,服務器端將生成要嵌入內聯JavaScript代碼的字符串。 例如,如果“UserName”應由ASP.NET生成。 然后看起來像。

<script>
   var username = "<%UserName%>";
</script>

這不安全,因為用戶可以擁有他/她的名字

</script><script>alert('bug')</script></script>

這是XSS漏洞。

所以,基本上,代碼應該是:

<script>
   var username = "<% JavascriptEncode(UserName)%>";
</script>

JavascriptEncode的作用是在“/”,“'”和“”之前添加字符“\\”。因此,輸出html就像.var username =“</ script> alert(\\'bug \\')</ script > </ SCRIPT>“;

瀏覽器不會將“ </ script> ”解釋為腳本塊的結尾。 所以,XSS避免了。

但是,那里仍然有“<”和“>”。 建議也要逃避這兩個字符。 首先,我認為將“<”改為“&lt;”並不是一個好主意。 和“>”到“&gt;” 這里。 並且,我不確定將“<”更改為“\\ <”並且“>”更改為“\\>”可以被所有瀏覽器識別。 似乎沒有必要對“<”和“>”進行進一步編碼。

對此有什么建議嗎?

謝謝。

根據您使用的標記語言,問題有不同的答案。

如果您使用的是HTML,那么您不能用實體表示它們,因為腳本元素被標記為包含CDATA。

如果您使用的是XHTML,那么您可以將它們表示為具有顯式CDATA標記的CDATA,或者您可以使用實體來表示它們。

如果您正在使用XHTML,但是將其作為text / html提供,那么您需要編寫符合XHTML規則但仍適用於text / html解析器的內容。 這通常意味着使用顯式CDATA標記並在JavaScript中對它們進行注釋。

<script type="text/javascript">
// <![CDATA[
  …
// ]]>
</script>

不久前,我寫了一些關於這個的方法和原因

不,你不應該在HTML中的<script>中使用HTML實體來逃避<>

  • 使用JavaScript字符串轉義規則(將\\替換為\\\\" with \\"
  • 替換</ with <\\/ ,以防止轉義出<script>元素。

在XHTML中它更復雜。

  • 如果您將XHTML作為XML(與IE不兼容的方式)發送並且不使用CDATA塊,那么除了JavaScript字符串轉義之外,您還需要轉義實體。
  • 如果您將XHTML作為XML發送並使用CDATA塊,則不要轉義實體,而是將]]>替換為]]]]><![CDATA[>以防止轉義它(除了JavaScript字符串轉義)。
  • 如果您將XHTML作為text/html發送(99%的人都這樣做),那么您必須同時使用XML CDATA塊,XML CDATA轉義和HTML轉義。

便宜又簡單的方法:

<script type="text/javascript">
    var username = "<%= Encode(UserName) %>";
</script>

其中Encode中的編碼方案是將輸入的每個字符轉換為與JavaScript兼容的關聯\\xABCD表示。

另一種便宜又簡單的方法:

<script type="text/javascript">
    var username = decodeBase64("<%= EncodeBase64(UserName) %>");
</script>

如果你只處理ASCII。

當然, pst用嚴格的方式擊中頭部。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM