2011-07-23 23 views
4

私はデータベースに記事を格納したいが、これを行うための最良の方法については多くの情報を見つけることができない。多くの人が方法を示唆し、他の人は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

ストアテキストとしてあなたの記事は:)ただ、インジェクション攻撃を防ぐために、最初にこの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 DBにそれを格納することは結構ですが、あなたは、あなたのSQLインジェクションから保護しなければならないことができますあなたのコードで。

つまり、すべてのユーザー入力をクリーンアップしてからdbに送信します。

PHP Manual on SQL injection

1

私は最善の方法は、ただ純粋なテキストを格納することであると思いますが、あなたは余分な書式設定を使用する場合、通常はそうではありません。 htmlタグをbbcodesまたはSQLインジェクションを防ぐことができる同様のタグに変換することができます。ただし、HTMLコンテンツをエスケープすると他のコンテンツと同じように安全です。 mysql_real_escape_stringは、データベースに格納したデータに関係なく、正常に動作します。

しかし、ユーザーがデータを要求したときに表示できるHTMLファイルとして記事のテキストとともにhtmlコードを保存するのがベストプラクティスですが、データベースでは索引作成や検索目的でテキストを保存するだけです。これは、とにかく検索するためのhtmlコンテンツを必要とせず、コンテンツが純粋にデータベースに格納されるテキストの場合はSQL攻撃を防ぎますので、理想的です。しかし、ユーザーがファイルを要求すると、フォーマットされたテキストを含むその記事のhtmlファイルの内容を取得し、それを提供します。

2

これまで大量のユーザーテキストを保存していたのですが、表示する前に必ずhtmlspecialcharsで実行するようにしてください.htmlが正常に機能しないので、htmlspecialchars(base64_decode($content))は表示に問題ありません。
フォーマットにbbcodeを使用している場合は、012bを実行してから、bbcodeのフォーマットを開始してください。

これは唯一の方法ではなく、入力をbase64'ngせずにサニタイズすることができますが、特に誰も直接データベースにアクセスする必要がない場合は、その理由はありません。

1

は、Zend_Luceneまたはsolrからのluceneまたはsphinxを使用します。それらは記事の索引付けをより速くするでしょうし、あなたもそれらの全文検索を行うことができます。このような場合にluceneやsolarを使って索引付けして検索することは、ほとんど標準的な手順であり、何百万件もの記事に拡張できます。

sphinxは、mysqlデーモンと「並行して」実行するデーモンです。 sphinxを使うためには、pecl sphinx拡張を使うことができます。

もしあなたがluceneと一緒に行きたいなら、luceneをウェブサービスとして公開している実際にはtomcatディストリビューションであるzend_luceneまたはsolrを試すことができます。したがって、言語とは無関係に標準的な方法でアクセスできます。

いずれかを選択しても問題ありません。フルテキスト(コンテンツ)、カテゴリ、または索引付けする必要があるもので索引付けすることができます。

1

ここでSQLインジェクションを防ぐ最も安全な方法は、prepared statementを使用することです。

$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をデータベースに注入できないことを確認します。

願っています!

関連する問題