5

記事をデータベースに保存したいのですが、これを行うための最良の方法について多くの情報を見つけることができないようです。私が読んだことから、これを効果的に行う方法についてほとんどの人の間で分かれているようです。多くの人が方法を提案し、他の人は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とデータベースに不慣れな人私は先に進む前に、これを実行するための最良の方法についていくつかの情報を得たいと思っています。

4

6 に答える 6

2

大量のユーザーテキストを保存するときは、base64を使用します。表示する前に、必ずhtmlspecialcharsを実行してください。これにより、htmlが機能しなくhtmlspecialchars(base64_decode($content))なるため、表示に問題なく機能します。
フォーマットにbbcodeを使用している場合は、bbcodeのフォーマットhtmlspecialcharsを開始する前に必ず実行してください。

これが唯一の方法ではありません。base64を使用せずに入力をサニタイズできますが、特にデータベースを直接確認する必要がない場合は、そうしない理由はありません。

于 2011-07-23T02:21:25.860 に答える
1

Zend_Luceneから、またはsolrを介して、luceneまたはsphinxを使用します。それらは記事の索引付けをより速くします、そしてあなたはそれらに対して全文検索をすることもできます。これらの場合にLuceneまたはSolarを使用してインデックスを作成および検索することは、ほぼ標準的な手順であり、数百万の記事に拡張できます。

sphinxは、mysqlデーモンと「並行して」実行されるデーモンです。スフィンクスを使用する場合は、peclスフィンクス拡張機能を使用できます。

luceneを使用したい場合は、zend_luceneまたはsolrを試すことができます。これは、実際にはluceneをWebサービスとして公開するWebアプリを備えたTomcatディストリビューションであるため、言語に関係なく、標準的な方法でアクセスできます。

それらのいずれかを選択しても問題ありません。フルテキスト(コンテンツ)、カテゴリ、またはインデックスを作成するために必要なものでインデックスを作成できます。

于 2011-07-23T02:45:03.933 に答える
1

SQLデータベースに保存することは問題ありませんが、コードへのSQLインジェクションから保護することは可能であり、保護する必要があります。

つまり、データベースに送信する前に、すべてのユーザー入力をクリーンアップします。

SQLインジェクションに関するPHPマニュアル

于 2011-07-23T01:51:32.553 に答える
1

純粋なテキストを保存するのが最善の方法だと思いますが、通常、追加のフォーマットを使用する場合はそうではありません。htmlタグをbbcodeまたは同様のタグに変換して、SQLインジェクションを防ぐことができますが、htmlコンテンツをエスケープすると、他のコンテンツと同じくらい安全になります。したがって、データベースに入力するデータに対してmysql_real_escape_stringを実行すれば、問題はありません。

ただし、ベストプラクティスは、ユーザーがデータを要求したときに提供できるhtmlファイルとして記事テキストと一緒にhtmlコードを保存することですが、データベースには、インデックス作成と検索の目的で純粋なテキストを保存できます。とにかく検索するためにhtmlコンテンツを必要としないため、これは理想的です。また、コンテンツがデータベースに保存される純粋なテキストである場合は、SQL攻撃を防ぐことができます。しかし、ユーザーがファイルを要求すると、フォーマットされたテキストを含むその記事のhtmlファイルのコンテンツを取得し、それを提供します。

于 2011-07-23T01:52:52.487 に答える
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がデータベースに挿入されないようになります。

お役に立てれば!

于 2013-10-18T14:31:58.493 に答える
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);
}
于 2011-07-23T01:50:54.177 に答える