繁体   English   中英

将文章存储在数据库中的最佳方式? (php和sql)

[英]Best way to store articles in a database? (php and sql)

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

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

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

在这里防止 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 可以注入到您的数据库中。

希望这可以帮助!

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

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

PHP SQL 注射手册

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

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

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

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

if you want to go with lucene, you can try zend_lucene or solr, which is actually a tomcat distro with an webapp that exposes lucene as a web service, so you can access it in a standard way, independantly of the language.

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

将您的文章存储为 TEXT :) 只需将其通过此 php function 以防止注入攻击:

// Prevent MySQL Injection Attacks
function cleanQuery($string){
    if(get_magic_quotes_gpc())  // prevents duplicate backslashes
        $string = stripslashes($string);
    return mysql_escape_string($string);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM