2011-07-23 69 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可以注入到您的數據庫中。

希望這有助於!

相關問題