5

我想将文章存储在数据库中,但我似乎无法找到有关执行此操作的最佳方法的太多信息,从我所阅读的内容来看,大多数人似乎对如何有效地执行此操作存在分歧。很多人会提出一种方法,而其他人会指出 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 和数据库不熟悉的人 我想在继续之前获得一些关于解决此问题的最佳方法的意见。

4

6 回答 6

2

当我存储大量用户文本时,我只是将其 base64,然后在显示它之前,确保通过 htmlspecialchars 运行它,这将使 html 无法正常工作,因此htmlspecialchars(base64_decode($content))可以正常显示。
如果您使用 bbcode 进行格式化,请确保htmlspecialchars在开始格式化您的 bbcode 之前运行。

这不是唯一的方法,您可以在没有 base64'ng 的情况下清理输入,但我认为没有理由不这样做,尤其是当没有人需要直接查看数据库时。

于 2011-07-23T02:21:25.860 回答
1

将其存储在 SQL 数据库中很好,但您可以而且必须防止代码中的 SQL 注入。

即,在将所有用户输入发送到数据库之前清理所有用户输入。

SQL 注入 PHP 手册

于 2011-07-23T01:51:32.553 回答
1

我认为最好的方法是只存储纯文本,但是当你想使用额外的格式时通常不是这种情况。您可以将 html 标签转换为 bbcodes 或类似的标签,这可以防止 sql 注入,但是如果您转义 html 内容,它将与任何其他内容一样安全。对您放入数据库的任何数据执行 mysql_real_escape_string 就可以了。

但是,最佳实践是将 html 代码与文章文本一起存储为 html 文件,您可以在用户请求数据时提供该文件,但在数据库中您可以只存储纯文本以用于索引和搜索目的。这是理想的,因为无论如何您都不需要 html 内容进行搜索,并且如果内容是要存储在数据库中的纯文本,它还可以防止 sql 攻击。但是当用户请求文件时,获取包含格式化文本的那篇文章的 html 文件的内容并提供服务。

于 2011-07-23T01:52:52.487 回答
1

在这里防止 sql 注入最安全的方法是使用准备好的语句。

$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 可以注入到您的数据库中。

希望这可以帮助!

于 2013-10-18T14:31:58.493 回答
1

使用来自 Zend_Lucene 或通过 solr 的 lucene 或 sphinx。它们将使文章的索引速度更快,您也可以对它们进行全文搜索。在这些情况下使用 lucene 或 solar 进行索引和搜索几乎是一个标准过程,并且可以让您扩展到数百万篇文章。

sphinx 是一个与 mysql 守护进程“并行”运行的守护进程。对于使用 sphinx,您可以使用 pecl sphinx 扩展。

如果你想使用 lucene,你可以试试 zend_lucene 或 solr,它实际上是一个带有 webapp 的 tomcat 发行版,它把 lucene 公开为一个 web 服务,所以你可以以标准的方式访问它,独立于语言。

选择其中任何一个都可以。您可以按全文(内容)和类别或您需要索引的任何内容进行索引。

于 2011-07-23T02:45:03.933 回答
0

将您的文章存储为 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);
}
于 2011-07-23T01:50:54.177 回答