2011-07-23 38 views
4

我想将文章存储在数据库中,但似乎无法找到有关执行此操作的最佳方法的很多信息,从我看过的文章中可以看出,大多数人似乎都在如何有效地做到这一点。很多人会建议一种方式,其他人会指出sql注入问题,而我似乎无法找到很多关于这个相当新的主题。将文章存储在数据库中的最佳方式? (php和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

我不明白为什么人们说SQL注入问题。我认为,与param绑定,这些问题大多是过去的事情。我错了吗? – vol7ron

回答

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); 
} 
+1

我的建议是使用PDO => http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/。如果你想测试你的数据库,这是更安全,更快速和非常好的。在内存模式下使用SQLite进行测试=>新的PDO('sqlite :: memory:') – Alfred

1

在SQL数据库中存储它是好的,但你可以和你必须防止SQL注入在你的代码中。

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

PHP Manual on SQL injection

1

我认为最好的方法是只存储纯文本,但通常当你要使用额外的格式事实并非如此。你可以将html标签转换为bbcodes或类似的标签,它可以防止sql注入,但是如果你转义html内容,它将和其他内容一样安全。所以对你放入数据库的任何数据都要执行mysql_real_escape_string,你会没事的。

但是,最好的做法是将html代码连同文章文本一起存储为html文件,您可以在用户请求数据时提供服务,但在数据库中,您只需存储纯文本以进行索引和搜索。这是理想的,因为您不需要html内容来进行搜索,并且如果内容纯粹是要存储在数据库中的文本,它也可以防止sql攻击。但是,随着用户请求文件获取该文章的HTML文件的内容,其中包含格式文本并提供该文件。

2

当我存储大量的用户文本时,我只需要base64它,然后在显示它之前,确保通过htmlspecialchars运行它,这将保持html不起作用,所以htmlspecialchars(base64_decode($content))可以正常显示。
如果您使用bbcode进行格式化,那么在开始格式化bbcode之前,请确保运行htmlspecialchars

这不是唯一的方法,你可以在没有base64的情况下清理输入,但我没有理由不去,特别是当没有人需要直接查看数据库时。

1

使用lucene或sphinx,无论是从Zend_Lucene还是通过solr。他们会更快地为文章编制索引,您也可以对它们进行全文搜索。使用lucene或太阳能在这些情况下进行索引和搜索几乎是一个标准程序,并且可以让您扩展到数百万篇文章。

sphinx是一个与mysql守护进程“并行”运行的守护进程。对于使用狮身人面像,你可以使用pecl sphinx扩展。

如果你想使用lucene,你可以尝试使用zend_lucene或solr,它实际上是一个tomcat发行版,它提供了一个将lucene作为web服务公开的web应用程序,所以你可以通过标准方式访问它,而不依赖于语言。

选择其中任何一个都可以。你可以通过全文(内容)和类别索引,或者索引索引。

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

希望这有助于!

相关问题