2

私のタイトルのように、MySQLi や PDO を使用せずにプリペアド ステートメントを作成する方法を知りたいです。主なポイントは、作成のプロセスとそのセキュリティを学習することです。私はこれでほぼ「ゼロ知識」を持っています。トピックをグーグルで検索しようとしましたが、グーグルのスキルが失敗したようです。一部の Web サイトで、準備済みステートメントがかなり安全であることをやみくもに学びましたが、それが安全であるという実際のポイントはわかりません。それがなぜなのかを説明できる人はいますか?それは大きな助けになるでしょう。私は、準備されたステートメントを作成することは、文字列を受け取り、すべての特殊文字を次のように str_replace に置き換える関数を作成するだけであるという独自の仮定を持っています。

$org_sql = 'SELECT * FROM `my_table` WHERE `table_id`=?';
$prepared_sql = replaceQueryString($org_sql, 10);

function replaceQueryString($str, $replace) {
    // Do the replace where ? will be replaced by $replace here.
    return $str;
}

でもそれでセキュリティレベルが上がるのかなと、私には地味に見えます。

これに答えるのに時間を無駄にしたくない場合は、リソースが利用できる場所を教えてください。というわけでまとめ。

  1. MySQL の準備済みステートメントを作成するには?
  2. なぜ安全なのですか?

どうもありがとう。

4

2 に答える 2

5

プリペアド ステートメントは、コードではなく、データベースによって作成および実行されます。それらを自分で実装するには、MySQL プロトコルを実装し、データベースと直接やり取りする必要があります。

準備されたステートメントの仕組みは次のとおりです。

  • クエリをプレースホルダーと共に RDBMS に送信します。
  • RDBMS はクエリを格納し、実行計画を事前に計算します。
  • ステートメントを実行するようにデータベースに個別に指示し、そのパラメーターにバインドする値を渡します
  • RDBMS は、値を使用して格納された計画を実行します。
于 2012-08-28T02:35:32.820 に答える
2

準備済みステートメントには、エミュレートされた準備済みステートメントとネイティブ準備済みステートメントの 2 種類があります。あなたがしていることは、準備されたステートメントをエミュレートすることです。


1.MySQL 準備済みステートメントを作成する方法は?

PHP レベルでは、プレースホルダーを安全な値に置き換えることによってのみ、準備されたステートメントをエミュレートできました。(例: 文字列を引用し、特殊文字をエスケープするなど...)

2.安全な理由は?

準備されたステートメントがSQLインジェクションを防ぐためです。


PS: PDO には、準備済みステートメントのエミュレーションを有効または無効にするPDO::ATTR_EMULATE_PREPARES のオプションがあります

于 2012-08-28T02:35:33.700 に答える