2

準備されたステートメント内で HTML コンテンツを処理する方法を探しています。

私のアプリケーションは基本的な WYSIWYG エディターを提供し、ユーザーがコンテンツを保存した後、私のスクリプトは HTML データを sqlite データベースに保存します。

しかし、準備されたステートメントを使用している場合、HTML は自然にエスケープされます。

これは私がこれまでに行ったことです:

try {

    /* Create databases and open connections */
    $dbh = new PDO( 'sqlite:db/coaching.sqlite' );

    /* Set Error Mode for Exception Handling */
    $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

    /* Prepare SQL Statement */
    $query = $dbh->prepare( "UPDATE Content SET Value=:value WHERE Token=:token" );

    /* Bind Param to Statement */
    $query->bindParam( ':token', $_POST['id'], PDO::PARAM_STR);
    $query->bindParam( ':value', $_POST['value'], PDO::PARAM_STR);

    /* Execute Query */
    $query->execute();

    /* Echo Data */
    echo $_POST['value'];

    /* Close connections to Database */
    $dbh = NULL;

}
catch( PDOException $e ) {

    /* Print Error-Messages */
    echo $e->getMessage();
}
4

2 に答える 2

7

準備済みステートメントは変数をエスケープしません。コマンドと変数はデータベースに同時に転送されますが、独立しています。データベースでデータがエスケープされている場合は、別の理由があります。たとえばmagic_quotes、オンになっています。スクリプトでエコーget_magic_quotes_gpcして、オンかオフかを確認できますか? オンになっている場合は、さまざまなテクニックを使用してオフに設定できます。これで問題は解決します。

さらに、コメントに従って、準備されたステートメントはSQLインジェクション攻撃を防ぐため、変数のエスケープについて心配する必要はありません。理解するのが難しいかもしれないのは、準備されたステートメントが機能する方法です。クエリがあるとします:

$query = "SELECT `id` FROM `users` WHERE `login` = '" . $login . "' AND `password` = '" . $password ."'";

$loginそのまま$passwordクエリに直接渡されます。誰かが に渡そうとするmylogin' --$login、クエリは次のようになります。

$query = "SELECT `id` FROM `users` WHERE `login` = 'mylogin' -- ' AND `password` = 'anypassword'";

データベースに送信されます。このようにして、攻撃者は任意のアカウントにアクセスできます。

準備されたステートメントが行うことは、クエリとは無関係にクエリ引数を転送することです。クエリは、データベースに転送される前に変数を構築するものではありません。代わりに、変数は何らかの形でクエリの隣に転送されます。それらはクエリで参照されます。このようにして、意図的であろうとなかろうと、クエリが偽装されることはありません。

準備されたステートメントを使用すると、例$loginはそのまま転送され、クエリ構造には影響しません。

乗客が実際に飛行機に搭乗せずに飛行機で乗客を運ぶことが可能である場合、それは「準備されたフライト」と呼ばれます:)乗客はルートに影響を与えて飛行機をハイジャックすることはできません. 彼らは飛行機の着陸とともに目的の空港に現れたでしょう。

于 2012-04-19T08:27:31.797 に答える
2

エンコードされたデータを保存しようとしましたか?

http://php.net/base64_encode

またはhttp://php.net/serialize

データベースが使用される前/後に使用すると機能するはずです

于 2012-04-18T20:29:50.527 に答える