Home >Backend Development >PHP Tutorial >Parsedown 解析 Markdown 过滤 XSS 时应如何处理 html 转义
用 Parsedown 对 Markdown 进行解析的时候,遇到了一些 XSS 过滤方面的问题。
发现 Parsedown 会对 <code>代码 区域内的 html 代码进行转义,<code>代码区域外的却不进行转义,如以下代码所示
<code>PHP</code><code><?php include 'Parsedown.php'; $test = "```\n<script>alert('test')\n```\n<script>alert('test')</script>"; $Parsedown = new Parsedown(); echo $Parsedown->text($test); /** * 得到结果是: * <pre class="brush:php;toolbar:false"><code><script>alert('test')</script></code>* <script>alert('test')</script> * */
这样,<code><script>alert('test')</script>这句还是被成功执行了
既然如此,那我先自己给它转义一下
<code>PHP</code><code><?php include 'Parsedown.php'; include 'com.func.php'; $test = "```\n<script>alert('test')\n```\n<script>alert('test')</script>"; $test = htmlspecialchars($test, ENT_QUOTES); $Parsedown = new Parsedown(); echo $Parsedown->text($test); /** * 得到结果是: * <pre class="brush:php;toolbar:false"><code><script>alert('test')</script></code>*
<script>alert('test')</script>
*/虽然 XSS 是被过滤掉了,但是<code>代码区域的内容就被转义了两次。
然后我发现 SF 的 Markdown 好像是在后端就解析好的,例如这个页面,它的部分源码如下:
<code>html</code><code><br><br><p>我现在的代码是这样的<br> <html><br> <head><br><br> <title>Untitled Document</title></p> <pre class="brush:php;toolbar:false"><code><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> </code>