我在HTML表单中使用HTML rich text editor,来自富文本编辑器的数据被插入到MySQL数据库表中,插入名为first_page
的列中,其类型设置为“TEXT”。 / p>
因此,如果在我的富文本编辑器中,我有以下文字:
<h4 style="text-align: center;">Write your first page!</h4>
在插入数据之前,我执行以下操作以确保数据不受任何HTML注入的影响:
trim(stripslashes(htmlspecialchars($variable)));
然后,当我提交表单时,数据在数据库中显示如下:
<h4 style="text-align: center;">Write your first page!</h4>
然后,当我编写一个查询并在一个单独的页面上打印出我的列的值时,它不会解释HTML而是输出数据,就像普通字符串一样,如下所示:
不确定我在哪里出错了,我想要的是让HTML实际打印为HTML而不是字符串。
已解决
正如@quentin建议的那样,我现在使用HTML Purifier来防止像XSS这样的东西。我的问题的实际答案是使用html_entity_decode将我的HTML解码回适用的字符。
答案 0 :(得分:1)
从XSS中保护网站安全的方法是禁止用户将原始HTML输入数据库。
您无法同时禁止原始HTML并允许提交原始HTML。
您需要使用不同的机制替换对htmlspecialchars
的调用以防止XSS(例如通过DOM解析器运行输入并使用白名单filtering标记和属性)。
(您还应该用prepared statements and placeholders替换stripslashes
(对SQL注入无效)。)
答案 1 :(得分:-1)
您需要使用html_entity_decode将HTML实体转换回其标记。见http://php.net/manual/en/function.html-entity-decode.php
但请记住,这是一个&#34;快速&amp;脏&#34;解决方案,就像使用RegEx来解析HTML一样。我建议听听Quentin在下面的答案中写的内容。 :)