Parsedown 解析 Markdown 过滤 XSS 时应如何处理 html 转义

用Parsedown对Markdown进行解析的时候,遇到了一些XSS过滤方面的问题。
发现Parsedown会对代码区域内的html代码进行转义,代码区域外的却不进行转义,如以下代码所示
PHPinclude'Parsedown.php';
$test="```\n\n```\n";
$Parsedown=newParsedown();
echo$Parsedown->text($test);
/**
*得到结果是:
*
<script>alert('test')</script>
*
*
*/
这样,这句还是被成功执行了
既然如此,那我先自己给它转义一下
PHPinclude'Parsedown.php';
include'com.func.php';
$test="```\n\n```\n";
$test=htmlspecialchars($test,ENT_QUOTES);
$Parsedown=newParsedown();
echo$Parsedown->text($test);
/**
*得到结果是:
*
&lt;script&gt;alert(&#039;test&#039;)&lt;/script&gt;
*

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

*/
虽然XSS是被过滤掉了,但是代码区域的内容就被转义了两次。
然后我发现SF的Markdown好像是在后端就解析好的,例如这个页面,它的部分源码如下:
html

我现在的代码是这样的

<html>
<head>

<title>UntitledDocument</title>

<script>
functiontest(){
<?php
$conn=mysql_connect("localhost","username","123123");
mysql_select_db("username",$conn);
mysql_query("INSERTINTOChargerTogether(Chat)VALUES('test')");
$result=mysql_query("SELECT*FROMChargerTogether");
echo"<p>{$result}</p>>";
?>
}
</script>

</head>

<body>
<inputtype="button"onClick="javascript:test();">

</body>

</html>

但这样是错误的

我该怎样做呢

这里的转义就做得很好。
我想到的解决方案是:先转义,再用Parsedown进行解析,接着正则匹配出解析后内的代码,对其进行反转义(一次)。
不知道是不是还有别的更好的转义函数,或者说有没有其他的能够过滤XSS的Markdown解析类
P.S.我在github上面找到有个markdown-js。用这个东西的话可以把经htmlspecialchars(()转义后的字符串直接输出到一个textaera里,它能够正确地解析。虽然我可以把那个文本框隐藏起来,但是如果需要输出很多段Markdown(帖子有很多回复)的话,那可不是一个好的解决方案啊!
回首忆惘然
浏览 784回答 2
2回答

湖上湖

刚刚把Parsedown源码里所有(共三处)转义用的语句(如下所示)给注释掉,PHP$text=htmlspecialchars($text,ENT_NOQUOTES,'UTF-8');这句出现在了以下三个方法中:protectedfunctionblockCodeComplete($Block)、protectedfunctionblockFencedCodeComplete($Block)、protectedfunctioninlineCode($Excerpt)然后再修改一下functiontext($text):functiontext($text){#添加下面这行$text=htmlspecialchars($text,ENT_NOQUOTES,'UTF-8');#Code...}这么做虽然说是解决了,但是可能不是最完美的解决方案,还请各位大大继续提供更好的方案~

叮当猫咪

我也遇到这个问题了,后来发现,只要把代码块外面的写成即可,这样就会转换成文字了。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript