【问题标题】:Best practice for storing HTML in mysql DB在 mysql DB 中存储 HTML 的最佳实践
【发布时间】:2019-06-05 22:25:17
【问题描述】:

我正在开发一个迷你博客,它允许用户使用所见即所得编辑器将帖子添加到网站,因此我将把这篇帖子存储在我的数据库中。

研究过降价后,我得出的结论是它不适合目的,因为我需要上传本地视频,这就是为什么我现在计划将所见即所得编辑器中的 HTML 存储到我的数据库中。

不过,我确实对 SQL 注入和 XSS 攻击有些担忧,但我研究了一种解决方案,即 HTML 净化器。

如果我使用 HTML 净化器来删除不需要的 HTML 标签,那么这是将 HTML 存储在我的数据库中的安全解决方案吗?

【问题讨论】:

  • 只要您安全地插入数据(即带有参数绑定的准备好的语句),我会说它可能足够安全,但这只是我对这个主观的看法问题
  • 您可以使用有限版本的所见即所得编辑器,也可以使用 strip_tags PHP 函数只允许几个 HTML 标签。为了防止 SQL 注入,您必须以适当的方式对值进行转义,或者准备语句。
  • 我明白这显然是一个主观问题,但在这种情况下(Markdown 不支持本地视频嵌入)将 HTML 存储在数据库中并正确净化它被认为是最佳实践?
  • 我不会存储 HTML,它只是自找麻烦。你如何确定你已经过滤了所有潜在的危险标签?我会坚持为文本内容存储降价,并找到另一种附加视频的方式。例如,发明您自己的 markdown 语法来嵌入视频,然后在您的应用呈现内容时,替换原始 html 标签(以安全的方式)来嵌入视频。 Markdown 也允许原始 html。见forums.apricitysoftware.com/t/…
  • 感谢您的意见。由于 WYSIWYG 编辑器输出 HTML ,如果我剥离标签并净化然后将其转换为 markdown(添加我自己的自定义视频 markdown 语法),这将是实现我想要的更安全和“更好的实践”的方式。感谢所有的 cmets,我只是想弄清楚专业人士将如何处理这种情况。

标签: php html mysql markdown htmlpurifier


【解决方案1】:

您可以将 html 存储在 sql 中...但首先将它们转义。

看这里的例子...

http://php.net/manual/en/function.html-entity-decode.php

【讨论】:

    【解决方案2】:

    在数据库中存储 HTML 本质上并不安全,就像存储纯文本本质上不安全一样。通过使用准备好的语句和适当的占位符可以轻松降低 SQL 注入的风险。转义既不是必要的,也不是防止 SQL 注入的最佳实践。准备好的语句是。

    相反,XSS 和其他与 HTML 相关的漏洞与数据库无关,而与将 HTML 呈现给来自不受信任来源的查看者有关。如果 HTML 只是存储在文件中,根本没有数据库,那么同样的漏洞也会存在,因此不需要保护数据库免受恶意 HTML 的攻击。数据库不知道或易受存储的 HTML 内容中包含的内容的影响,因为它不会再次呈现或解释 HTML……只要您的数据库交互使用准备好的语句。没有可接受的理由来避免这些。

    将这一点夸大到极端,将包含病毒的文件作为 blob 存储在数据库中是完全安全的,因为数据库不会将存储在其中的数据作为代码执行。该漏洞将针对下载这些病毒的用户。

    【讨论】:

    • 您好,感谢您提供非常详细的回答。在提到准备好的语句时,您提到了“适当的占位符”。您能否详细说明一下,因为我不清楚这到底意味着什么。我的应用程序中准备好的语句的示例是$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。这些是正确使用的占位符。我使用这个短语是因为它是在准备好的语句中正确使用占位符,这使得它们本质上是安全的。我见过开发人员将查询字符串连接起来(例如"... VALUES('$pheading',..."),然后将其用作准备好的语句,这当然完全违背了使用准备好的语句的目的。
    • 感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    • 2015-11-05
    • 2011-01-20
    • 2010-11-10
    • 2011-05-12
    • 2010-11-08
    • 2011-11-23
    相关资源
    最近更新 更多