将文章存储在数据库中的最佳方式? (php和sql)
Posted
技术标签:
【中文标题】将文章存储在数据库中的最佳方式? (php和sql)【英文标题】:Best way to store articles in a database? (php and sql) 【发布时间】:2011-10-11 11:33:25 【问题描述】:我想将文章存储在数据库中,但我似乎找不到有关执行此操作的最佳方法的太多信息,从我所阅读的内容来看,大多数人似乎对如何有效地执行此操作存在分歧。很多人会提出一种方法,其他人会指出 sql 注入问题,我似乎找不到太多关于这个相当新的话题。
这是一篇文章的html:
<div id="main">
<article>
<header>
<h3> Title </h3>
<time pubdate="pubdate"> 2011-07-22 </time>
</header>
<p> Article Text </p>
</article>
</div>
理想情况下,我想最好将构成每篇文章的 html 块存储到数据库中,但这似乎有很多问题,就像我说的那样,我找不到很多关于这个特定主题的帖子,并且作为 php 和数据库的新手,我想在继续之前获得一些关于解决此问题的最佳方法的输入。
【问题讨论】:
我不明白为什么人们说 SQL 注入问题。我认为使用参数绑定,这些问题大多已成为过去。我错了吗? 【参考方案1】:当我存储大量用户文本时,我只是将其 base64,然后在显示它之前,确保通过 htmlspecialchars 运行它,这将使 html 无法正常工作,因此htmlspecialchars(base64_decode($content))
可以正常显示。
如果您使用 bbcode 进行格式化,请确保在开始格式化 bbcode 之前运行 htmlspecialchars
。
这不是唯一的方法,您可以在不使用 base64 的情况下清理输入,但我认为没有理由不这样做,尤其是当没有人需要直接查看数据库时。
【讨论】:
【参考方案2】:将其存储在 SQL 数据库中很好,但您可以而且必须防止代码中的 SQL 注入。
即,在将所有用户输入发送到数据库之前清理所有用户输入。
PHP Manual on SQL injection
【讨论】:
【参考方案3】:我认为最好的方法是只存储纯文本,但当您想使用额外的格式时,通常情况并非如此。您可以将 html 标签转换为 bbcodes 或类似的标签,这可以防止 sql 注入,但是如果您转义 html 内容,它将与任何其他内容一样安全。对您放入数据库的任何数据执行 mysql_real_escape_string 就可以了。
但是,最佳做法是将 html 代码与文章文本一起存储为 html 文件,您可以在用户请求数据时提供该文件,但在数据库中您可以只存储纯文本以用于索引和搜索目的。这是理想的,因为无论如何您都不需要 html 内容进行搜索,并且如果内容是要存储在数据库中的纯文本,它还可以防止 sql 攻击。但是当用户请求文件时,获取该文章的 html 文件的内容,其中包含格式化的文本并提供服务。
【讨论】:
【参考方案4】:使用来自 Zend_Lucene 或通过 solr 的 lucene 或 sphinx。它们将使文章的索引速度更快,您也可以对它们进行全文搜索。在这些情况下使用 lucene 或 solar 进行索引和搜索几乎是一个标准程序,并且可以让您扩展到数百万篇文章。
sphinx 是一个与 mysql 守护进程“并行”运行的守护进程。要使用 sphinx,您可以使用 pecl sphinx 扩展。
如果你想使用 lucene,你可以试试 zend_lucene 或 solr,它实际上是一个带有 webapp 的 tomcat 发行版,它把 lucene 公开为一个 web 服务,所以你可以独立于语言以标准方式访问它。
选择其中任何一个都可以。您可以按全文(内容)、类别或您需要索引的任何内容进行索引。
【讨论】:
【参考方案5】:这里防止sql注入最安全的方法是使用prepared statement。
$stmt = $con->prepare("INSERT INTO Articles (Title, Date, Article) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $title, $currentDate, $articleBody);
问号代表您将通过的值。 “sss”是说这 3 个变量中的每一个都是一个字符串,然后你可以调用这个准备好的语句并将正确的值传递给它。
$title = $_POST[title];
$currentDate = date("Y-m-d H:i:s");
$articleBody = $_POST[article];
$stmt->execute();
这将确保不会将恶意 sql 注入到您的数据库中。
希望这会有所帮助!
【讨论】:
【参考方案6】:将您的文章存储为 TEXT :) 只需先通过此 php 函数将其传递以防止注入攻击:
// Prevent MySQL Injection Attacks
function cleanQuery($string)
if(get_magic_quotes_gpc()) // prevents duplicate backslashes
$string = stripslashes($string);
return mysql_escape_string($string);
【讨论】:
我的建议是使用 PDO => net.tutsplus.com/tutorials/php/…。如果您想对数据库进行测试,这会更安全、更快且非常好。要进行测试,只需在内存模式下使用 SQLite => new PDO('sqlite::memory:')以上是关于将文章存储在数据库中的最佳方式? (php和sql)的主要内容,如果未能解决你的问题,请参考以下文章
在 SQL Server 2008 R2 和 SQL Server Compact 4 中存储日期/时间数据的最佳方式
将css数据存储在数据库中并将其称为类似于css文件的最佳方式是啥