【问题标题】:PHP how to save HTML string into databasePHP如何将HTML字符串保存到数据库中
【发布时间】:2016-09-17 06:02:15
【问题描述】:

作为对 API 调用的响应,我得到了一个完整的 HTML 脚本。完整意味着它包括 HTML CSS 和 Javascript。现在我在 PHP 变量中将该 HTML 作为字符串。

$content = '<html>
<head>
  <script>--Some javascript and libraries included--</script>
  <title></title>
</head>
<body>
   <style>--Some Styling--</style>
</body>
</html>';

现在,将这个变量保存在数据库中的最佳方法是什么?如何?

  • 作为 VARCHAR 或 TEXT 类型的字符串?
  • 作为使用 VARCHAR 或 TEXT 类型进行 Base64 编码的字符串?
  • 作为 BLOB 类型的二进制文件?

或者任何其他你想建议的(可能是序列化或打包)?

【问题讨论】:

  • 在 wp 中他们使用了addslashes(deslash($content)); 。由 wp core 自己编写的 delash 函数,使其泛化并存储在 WordPress 数据库中。它有助于工作。
  • 我希望您的用户不能访问这些 html 数据,否则您将自己打开以进行 xss 攻击

标签: php mysql database string html


【解决方案1】:

我使用 base64 编码的数据以 BLOB 数据类型存储在我的数据库中。样板代码如下。

$content = '<html>
<head>
  <script>--Some javascript and libraries included--</script>
  <title></title>
</head>
<body>
   <style>--Some Styling--</style>
</body>
</html>';

以base64编码数据

$encodedContent = base64_encode($content); // This will Encode

并使用 BLOB 将数据保存在数据库中。现在检索数据后,只需将其解码如下。

$ContentDecoded = base64_decode($content);  // decode the base64

现在 $contentDecoded 的值是纯 HTML。

【讨论】:

  • 我也想知道反对票。为什么人们不指出错误就投反对票?
  • @e4c5 说:你这样增加存储大小
【解决方案2】:

看到这个:我什么都没做......

我像这样使用它..工作得很好,还保存在 mysql 中,也可以正确检索。

    $editorContent = $_POST['textarea'];
    
    $a = $editorContent;
    
    $insert = $db->query("INSERT INTO psd ( psdata) VALUES ( '$a')" );

【讨论】:

  • 这只是获取文本区域的值,而不是任何特殊的 html 标签。 &lt;textarea&gt; 标签本身不会进入数据库......如果你有其他标签,例如&lt;em&gt;&lt;strong&gt; 等混入内容中,我认为这不会照顾到保存它们。
【解决方案3】:

使用 addslashes() 函数将 HTML 存储到变量中。

$html = addslashes('<div id="intro">
<div id="about" align="left">
<h2 class="bigHeader" dir="rtl"HEADER</h2>
<img src="img/Med-logo.png" alt="" />
<div id="wellcomePage" class="text-left text" dir="rtl">
<p>...some words....</p>
<p>.some words....</p>
<p>&nbsp;</p>
</div>
</div>
</div>');

在此之后,形成一个 SQL 查询。

$sql = "UPDATE `Pages` SET `content`= '".$html."'";

从数据库检索时必须添加stripslashes

【讨论】:

    【解决方案4】:

    我建议您使用TEXT。 Blob 通常用于存储图像、音频或其他多媒体对象。阅读更多关于bolobs

    在数据库中存储 HTML 的数据类型为 TEXT

    使用mysql_real_escape_string()将html文本存储到数据库中

    $content = '<html>
    <head>
      <script>--Some javascript and libraries included--</script>
      <title></title>
    </head>
    <body>
       <style>--Some Styling--</style>
    </body>
    </html>';
    
    $html = mysql_real_escape_string($content);
    

    【讨论】:

    • 谢谢@Manjeet 但是您建议的功能 mysql_real_escape_string 已被弃用。我也看到了这个 htmlspecialchars() 函数,但是在数据库中存储大 html 文档是否安全?因为我从未在数据库中看到过直接的 HTML。
    【解决方案5】:

    您可以使用 base64_encode 并将该字符串存储到带有 text/blob 类型字段的数据库中

    【讨论】:

    • 是...在显示时您需要解码该字符串
    • base64 编码/解码不是必需的,因为 BLOB 可以保存任何类型的数据。而且编码/解码占用CPU和内存。
    【解决方案6】:

    如果对它进行 base64 编码,则存储大小会增加大约 30%,并且每次显示时都需要对其进行解码。查看 Wordpress 的table structure,这是使用最广泛的软件,它使用 php 将 html 存储在 mysql 数据库中。他们用什么?长文。在您的情况下,TEXT 可能更好,因为您可能对页面大小有一个很好的了解。

    【讨论】:

    • 谢谢@e4c5 我会看看这个。您建议的链接是更通用的形式。但是是的,我会看看 WP 是如何处理这个问题的。
    • 不,这只是一个例子,无需深入挖掘。只需使用 TEXT,但不要打扰 base64 编码
    • @e4c5 如果 HTML 超出我们的控制范围怎么办?例如,如果我从互联网上获取一个随机站点,我是否应该在存储之前对其进行编码?这是否有助于防止潜在的 sql 注入?
    • 您应该使用准备好的语句来避免 sql 注入。首先,您不应该允许将超出您控制范围的 HTML 保存在数据库中,这将使您对 XSS 攻击敞开大门
    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2018-09-21
    • 2012-07-04
    • 2011-09-30
    • 2016-10-16
    • 1970-01-01
    • 2015-12-03
    相关资源
    最近更新 更多