我想将文章存储在数据库中,但我似乎无法找到关于最佳方法的大量信息,从我所看到的内容看来,似乎大多数人都在如何有效地做到这一点。很多人会建议一种方式,其他人会指出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和数据库的人,我希望在继续之前获得一些关于最佳方法的输入。
答案 0 :(得分:2)
当我存储大量用户文本时,我只需要它64位,然后在显示它之前,确保通过htmlspecialchars运行它,这将使html无法正常工作,因此htmlspecialchars(base64_decode($content))
可以正常工作显示。
如果您使用bbcode进行格式化,请确保在开始格式化bbcode之前运行htmlspecialchars
。
这不是唯一的方法,你可以在没有base64'ng的情况下清理输入,但我认为没有理由不这样做,特别是当没有人需要直接看到数据库时。
答案 1 :(得分:1)
答案 2 :(得分:1)
我认为最好的方法是只存储纯文本,但通常情况并非如此,当您想要使用额外的格式时。您可以将html标签转换为bbcodes或类似的标签,这可以阻止sql注入,但是如果你转义html内容,它将像任何其他内容一样安全。对你放入数据库的任何数据都做mysql_real_escape_string也没关系。
但是,最佳做法是将html代码与文章文本一起存储为html文件,您可以在用户请求数据时提供该文件,但在数据库中,您只需存储纯文本以进行索引和搜索。这是理想的,因为你不需要html内容进行搜索,如果内容纯粹是要存储在数据库中的文本,它也会阻止sql攻击。但是,当用户请求文件获取该文章的html文件的内容时,该文件包含格式化文本并提供该文件。
答案 3 :(得分:1)
使用lucene或sphinx,来自Zend_Lucene或通过solr。他们会更快地为文章编制索引,你也可以对它们进行全文搜索。在这些情况下使用lucene或solar来索引和搜索几乎是一个标准程序,并且可以让你扩展到数百万篇文章。
sphinx是一个与mysql守护进程“并行”运行的守护进程。使用sphinx,你可以使用pecl sphinx扩展。
如果您想使用lucene,您可以尝试使用zend_lucene或solr,这实际上是一个带有webapp的tomcat发行版,它将lucene作为Web服务公开,因此您可以以标准方式访问它,与语言无关。
选择其中任何一个都可以。您可以按全文(内容),类别或任何需要索引的内容进行索引。
答案 4 :(得分: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注入您的数据库。
希望这有帮助!
答案 5 :(得分: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);
}