用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);/***得到结果是:*<script>alert('test')</script>
*<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(帖子有很多回复)的话,那可不是一个好的解决方案啊!
湖上湖
叮当猫咪
相关分类