Parsedown 解析 Markdown 過濾 XSS 時應如何處理 html 轉義

來源:互聯網
上載者:User
用 Parsedown 對 Markdown 進行解析的時候,遇到了一些 XSS 過濾方面的問題。

發現 Parsedown 會對 代碼 地區內的 html 代碼進行轉義,代碼地區外的卻不進行轉義,如以下代碼所示

PHPtext($test);/**  * 得到結果是:  * 
<script>alert('test')</script>
* * */

這樣,這句還是被成功執行了

既然如此,那我先自己給它轉義一下

PHPtext($test);/**  * 得到結果是:  * 
&lt;script&gt;alert(&#039;test&#039;)&lt;/script&gt;
*

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

*/

雖然 XSS 是被過濾掉了,但是代碼地區的內容就被轉義了兩次

然後我發現 SF 的 Markdown 好像是在後端就解析好的,例如這個頁面,它的部分源碼如下:

html

我現在的代碼是這樣的
<html>
<head>

<title>Untitled Document</title>

<script>    function test(){        <?php            $conn = mysql_connect("localhost", "username", "123123");            mysql_select_db("username", $conn);            mysql_query("INSERT INTO ChargerTogether (Chat) VALUES ('test')");            $result= mysql_query("SELECT *FROM ChargerTogether");            echo "<p> {$result} </p>>";        ?>    }</script>

</head>
<body>
<input type="button" onClick="javascript:test();">

</body>
</html>

但這樣是錯誤的
我該怎樣做呢

這裡的轉義就做得很好。

我想到的解決方案是:先轉義,再用 Parsedown 進行解析,接著正則匹配出解析後 內的代碼,對其進行反轉義(一次)。

不知道是不是還有別的更好的轉義函數,或者說 有沒有其他的能夠過濾 XSS 的 Markdown 解析類

P.S. 我在 github 上面找到有個 markdown-js。用這個東西的話可以把經htmlspecialchars(()轉義後的字串直接輸出到一個 textaera 裡,它能夠正確地解析。雖然我可以把那個文字框隱藏起來,但是如果需要輸出很多段 Markdown (文章有很多回複)的話,那可不是一個好的解決方案啊!

回複內容:

用 Parsedown 對 Markdown 進行解析的時候,遇到了一些 XSS 過濾方面的問題。

發現 Parsedown 會對 代碼 地區內的 html 代碼進行轉義,代碼地區外的卻不進行轉義,如以下代碼所示

PHPtext($test);/**  * 得到結果是:  * 
<script>alert('test')</script>
* * */

這樣,這句還是被成功執行了

既然如此,那我先自己給它轉義一下

PHPtext($test);/**  * 得到結果是:  * 
&lt;script&gt;alert(&#039;test&#039;)&lt;/script&gt;
*

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

*/

雖然 XSS 是被過濾掉了,但是代碼地區的內容就被轉義了兩次

然後我發現 SF 的 Markdown 好像是在後端就解析好的,例如這個頁面,它的部分源碼如下:

html

我現在的代碼是這樣的
<html>
<head>

<title>Untitled Document</title>

<script>    function test(){        <?php            $conn = mysql_connect("localhost", "username", "123123");            mysql_select_db("username", $conn);            mysql_query("INSERT INTO ChargerTogether (Chat) VALUES ('test')");            $result= mysql_query("SELECT *FROM ChargerTogether");            echo "<p> {$result} </p>>";        ?>    }</script>

</head>
<body>
<input type="button" onClick="javascript:test();">

</body>
</html>

但這樣是錯誤的
我該怎樣做呢

這裡的轉義就做得很好。

我想到的解決方案是:先轉義,再用 Parsedown 進行解析,接著正則匹配出解析後 內的代碼,對其進行反轉義(一次)。

不知道是不是還有別的更好的轉義函數,或者說 有沒有其他的能夠過濾 XSS 的 Markdown 解析類

P.S. 我在 github 上面找到有個 markdown-js。用這個東西的話可以把經htmlspecialchars(()轉義後的字串直接輸出到一個 textaera 裡,它能夠正確地解析。雖然我可以把那個文字框隱藏起來,但是如果需要輸出很多段 Markdown (文章有很多回複)的話,那可不是一個好的解決方案啊!

剛剛把 Parsedown 源碼裡所有(共三處)轉義用的語句(如下所示)給注釋掉,

PHP$text = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8');

這句出現在了以下三個方法中:
protected function blockCodeComplete($Block)protected function blockFencedCodeComplete($Block)protected function inlineCode($Excerpt)

然後再修改一下 function text($text)

function text($text)    {        #添加下面這行        $text = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8');        # Code...    }

這麼做雖然說是解決了,但是可能不是最完美的解決方案,還請各位大大繼續提供更好的方案~

我也遇到這個問題了,後來發現,只要把代碼塊外面的 寫成即可,這樣就會轉換成文字了。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.