PHP如何将HTML字符串保存到数据库中
Posted
技术标签:
【中文标题】PHP如何将HTML字符串保存到数据库中【英文标题】:PHP how to save HTML string into database 【发布时间】: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 类型的二进制文件?或者任何其他你想建议的(可能是序列化或打包)?
【问题讨论】:
***.com/help/someone-answers 在 wp 中他们使用了addslashes(deslash($content));
。由 wp core 自己编写的 delash 函数,使其泛化并存储在 WordPress 数据库中。它有助于工作。
我希望您的用户不能访问这些 html 数据,否则您将自己打开以进行 xss 攻击
【参考方案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 标签。<textarea>
标签本身不会进入数据库......如果你有其他标签,例如<em>
、<strong>
等混入内容中,我认为这不会照顾到保存它们。【参考方案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" />
<div id="wellcomePage" class="text-left text" dir="rtl">
<p>...some words....</p>
<p>.some words....</p>
<p> </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 攻击敞开大门以上是关于PHP如何将HTML字符串保存到数据库中的主要内容,如果未能解决你的问题,请参考以下文章