在MySQL数据库中存储HTML的最佳实践

3
我正在开发一个小型博客,允许用户使用所见即所得编辑器添加帖子到网站上,因此我将在我的数据库中存储这篇文章。
经过研究Markdown后,我得出结论它不适用于我的需求,因为我需要上传本地视频,所以现在我计划将WYSIWYG编辑器生成的HTML存储到我的数据库中。
然而,我有一些关于SQL注入和XSS攻击的担忧,但是我已经研究出了一个解决方案,那就是使用HTML purifier。
如果我使用HTML purifier来删除不需要的HTML标签,那么将HTML存储在我的数据库中是否安全?

只要您安全地插入数据(即使用预处理语句和参数绑定),我认为这应该足够安全,但这只是我对这个主观问题的看法。 - Phil
你可以使用一个简化版的所见即所得编辑器,并且还可以使用strip_tags PHP函数来允许一些HTML标签。为了防止SQL注入,你必须以正确的方式转义值,或者使用预处理语句。 - José Carlos PHP
我理解这显然是一个主观问题,但在这种情况下(Markdown 不支持本地视频嵌入),将 HTML 存储在数据库中,并正确净化它,是否被认为是最佳实践呢? - HP.
2
我不会存储HTML,那只会引来麻烦。你怎么能确定你已经过滤掉了所有潜在的危险标签呢?我建议仍然使用存储文本内容的Markdown,并找到另一种方法来附加视频。例如,可以发明自己的Markdown语法来嵌入视频,然后在应用程序呈现内容时,以安全的方式替换原始的HTML标签来嵌入视频。Markdown也允许使用原始的HTML。请参考http://forums.apricitysoftware.com/t/add-video-html-block-in-markdown-using-markdownpad2/199 - Bill Karwin
感谢您的输入。由于所使用的所见即所得编辑器输出的是HTML代码,如果我去除标签并进行净化,然后将其转换为Markdown(添加自定义的视频Markdown语法),这样做是否更安全且更好的实践方式来达到我想要的效果?非常感谢所有的评论,我只是想弄清楚专业人士如何处理这种情况。 - HP.
有一些编辑器可以通过配置选项来限制用户在文本中输入的内容。此外,如果在保存到数据库列之前对HTML进行编码(BCD?),至少可以避免SQL注入的问题。在页面中显示/包含时,只需解码即可。@Phil的答案也适用。您可能还会遇到的另一个问题是发送/显示HTML。如果可以提供访问服务器文件的权限。 - Sloan Thrasher
3个回答

11
在数据库中存储HTML本身并不是不安全的,就像存储纯文本一样,并不会存在固有的不安全因素。使用预处理语句和正确的占位符可以轻松地减轻SQL注入的风险。转义既不是必要的,也不是防止SQL注入的最佳实践。预处理语句才是。

相反,XSS等与HTML相关的漏洞与数据库无关,而与从不受信任的来源向查看者呈现HTML有关。如果HTML仅存储在文件中而没有数据库,那么同样的漏洞也会存在,因此没有必要保护数据库免受恶意HTML的侵害。数据库对存储的HTML内容不具有知识或漏洞,因为它不渲染或解释HTML...只要您的数据库交互使用预处理语句即可。没有任何可以接受的理由可以避免使用它们。

为了夸大这个观点到极端,将包含病毒的文件作为二进制大对象存储在数据库中是完全安全的,因为数据库不会将其存储的数据作为代码执行。漏洞存在于下载这些病毒的用户之间。


嗨,感谢您提供非常详细的答案。您在提到准备语句时提到了“适当的占位符”。您能详细解释一下这是什么意思吗?因为我对这个概念还不太清楚。在我的应用程序中,一个准备语句的示例可能是`$query = mysqli_prepare($db, "INSERT INTO blog_posts (bpost_heading,bpost_caption,bpost_content,bpost_date,bpost_uid) VALUES (?,?,?,?,?)");if($query) { mysqli_stmt_bind_param($query, "ssssi", $pheading,$pcaption,$pcontent,$pdate,$uid); mysqli_stmt_execute($query);} mysqli_stmt_close($query);` - HP.
1
是的,@HP。那些是正确使用的占位符。我使用这个短语是因为在准备好的语句中正确使用占位符使它们本质上是安全的。我曾经见过开发人员将查询字符串连接起来(例如"... VALUES('$pheading',...")),然后将其用作准备好的语句,这当然完全违背了使用准备好的语句的目的。 - Michael - sqlbot
感谢你的所有帮助! - HP.

0

0

你可以将HTML内容保存在MySQL字段中,类型为“blob”。在将HTML内容返回之前,你必须使用像PHP中的base64_encode这样的函数对其进行编码,然后可以使用base64_decode获取该内容。


这并没有回答问题。一旦你有足够的声望,你将能够评论任何帖子;相反,提供不需要询问者澄清的答案。 - 来自审查 - Webdeveloper_Jelle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接