用 Parsedown 對 Markdown 進行解析的時候,遇到了一些 XSS 過濾方面的問題。
發現 Parsedown 會對 代碼
地區內的 html 代碼進行轉義,代碼
地區外的卻不進行轉義,如以下代碼所示
PHP
text($test);/** * 得到結果是: * <script>alert('test')</script>
* * */
這樣,
這句還是被成功執行了
既然如此,那我先自己給它轉義一下
PHP
text($test);/** * 得到結果是: * <script>alert('test')</script>
* <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 代碼進行轉義,代碼
地區外的卻不進行轉義,如以下代碼所示
PHP
text($test);/** * 得到結果是: * <script>alert('test')</script>
* * */
這樣,
這句還是被成功執行了
既然如此,那我先自己給它轉義一下
PHP
text($test);/** * 得到結果是: * <script>alert('test')</script>
* <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... }
這麼做雖然說是解決了,但是可能不是最完美的解決方案,還請各位大大繼續提供更好的方案~
我也遇到這個問題了,後來發現,只要把代碼塊外面的 寫成即可,這樣就會轉換成文字了。