国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

PHP で SQL インジェクション攻撃を防ぐにはどうすればよいですか?
P粉939473759
P粉939473759 2023-08-22 10:23:01
0
2
685
<p>ユーザー入力を変更せずに SQL クエリに挿入すると、次の例に示すように、アプリケーションは SQL インジェクション攻撃に対して脆弱になります。 <pre class="lang-php prettyprint-override"><code>$unsafe_variable = $_POST['user_input']; mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')"); </code></pre> <p>これは、ユーザーが <code>value'); DROP TABLE table;--</code> のようなものを入力できるため、クエリは次のようになります。 <pre class="brush:php;toolbar:false;">INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')</pre> <p>これを防ぐにはどうすればよいですか? </p>
P粉939473759
P粉939473759

全員に返信(2)
P粉891237912

パラメータ化されたクエリを使用するには、Mysqli または PDO を使用する必要があります。 mysqli を使用して例を書き直すには、次のようなコードが必要になります。

リーリー

読んでおきたい重要な関數(shù)は mysqli::prepare です。

また、他の人が示唆しているように、PDO のような高レベルの抽象化レイヤーを使用する方が便利/簡単であると思われるかもしれません。

あなたが言及した狀況は非常に単純ですが、より複雑な狀況ではより洗練された方法が必要になる可能性があることに注意してください。特に:###

    ユーザー入力に基づいて SQL の構(gòu)造を変更したい場合、パラメータ化されたクエリは役に立ちません。また、必要なエスケープは
  • mysql_real_escape_string に含まれていません。この場合、ユーザーの入力をホワイトリストに渡して、「安全な」値のみが許可されるようにすることをお勧めします。
P粉771233336

どのデータベースを使用する場合でも、SQL インジェクション攻撃を回避する 正しい 方法は、 データを SQL から分離することです そうすることで、データはデータの形式で殘り、 は SQL では使用できません。パーサーは をコマンドとして解釈します。適切にフォーマットされたデータ部分を使用して SQL ステートメントを作成することは可能ですが、詳細(xì)を 完全に理解していない場合は、常に プリペアド ステートメントとパラメーター化されたクエリ を使用する必要があります。これらは、パラメーターとは別に送信され、データベース サーバーによって分析される SQL ステートメントです。これにより、攻撃者は悪意のある SQL を挿入できなくなります。

これを?qū)g現(xiàn)するには基本的に 2 つの方法があります:

  1. PDO の使用 (サポートされているデータベース ドライバーで動作します): リーリー

  2. MySQLi

    の使用 (MySQL の場合): PHP 8.2 以降、
    execute_query() メソッドを使用して、パラメータを準(zhǔn)備、バインドし、SQL ステートメントを?qū)g行できます。 リーリー PHP8.1 より前:

    リーリー

    MySQL 以外のデータベースに接続している場合は、2 番目のドライバー固有のオプションを參照できます (たとえば、PostgreSQL の場合は、

    pg_prepare()
  3. および
pg_execute() を使用できます。

)。 PDO はユニバーサル オプションです。 接続を正しく設(shè)定してください

PDO

PDO

を使用して MySQL データベースにアクセスする場合、実際の

プリペアド ステートメントはデフォルトでは使用されないことに注意してください。この問題を解決するには、準(zhǔn)備されたステートメントのシミュレーションを無効にする必要があります。以下は、

PDO: を使用して接続を作成する例です。 リーリー 上記の例では、エラー モードは厳密には必須ではありませんが、 追加することをお勧めします。このようにして、PDO は PDOException をスローしてすべての MySQL エラーを通知します。

ただし、 が行う必要があるのは、最初の行 setAttribute() です。これは、PDO に、シミュレートされたプリペアド ステートメントを無効にし、実際の

プリペアド ステートメントを使用するように指示します。これにより、ステートメントと値が MySQL サーバーに送信される前に PHP によって解析されなくなります (そのため、潛在的な攻撃者は悪意のある SQL を注入できません)。

コンストラクターのオプションで charset を設(shè)定できますが、PHP の「古い」バージョン (5.3.6 より前) は DSN の charset 引數(shù)を黙って無視することに注意することが重要です。 ###。 Mysqli

mysqli の場合、同じルーチンに従う必要があります: リーリー ###説明する### prepare

に渡す SQL ステートメントは、データベース サーバーによって解析され、コンパイルされます。パラメーター (上記の例では、

?

または

:name

のような名前付きパラメーター) を指定することにより、フィルターする場所をデータベース エンジンに指示します。次に、
execute

を呼び出すと、準(zhǔn)備されたステートメントが指定されたパラメーター値と結(jié)合されます。

ここで重要なのは、SQL 文字列との組み合わせではなく、パラメーター値とコンパイルされたステートメントの組み合わせです。 SQL インジェクションは、データベースに送信する SQL を作成するときに、スクリプトをだまして悪意のある文字列を含めることによって機(jī)能します。したがって、実際の SQL をパラメータとは別に送信することで、予期しない結(jié)果が発生するリスクを制限できます。

プリペアド ステートメントを使用して送信されたパラメータはすべて文字列として扱われます (ただし、データベース エンジンはパラメータに対して何らかの最適化を?qū)g行するため、パラメータが數(shù)値になる可能性があります)。上記の例では、$name 変數(shù)に 'Sarah'; DELETE FROMemployees が含まれている場合、結(jié)果は検索文字列 "'Sarah'; DELETE FROMemployee のみになります。 " 、空のテーブルは得られません。

プリペアド ステートメントを使用するもう 1 つの利點(diǎn)は、同じセッション內(nèi)で同じステートメントが複數(shù)回実行された場合、解析とコンパイルが 1 回だけ行われるため、速度がある程度向上することです。

ああ、挿入の操作方法を?qū)い亭椁欷郡韦?、ここに例を示しま?(PDO を使用):

リーリー


準(zhǔn)備されたステートメントは動的クエリに適していますか?

プリペアド ステートメントをクエリ パラメーターに使用することはできますが、動的クエリ自體の構(gòu)造はパラメーター化できず、特定のクエリ関數(shù)はパラメーター化できません。

これらの特定のシナリオのベスト プラクティスは、ホワイトリスト フィルターを使用して、可能な値を制限することです。

リーリー

最新のダウンロード
詳細(xì)>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート