sql >> データベース >  >> RDS >> Mysql

mysql_*関数をPDOおよびプリペアドステートメントに置き換える

    興味深い質問をありがとう。どうぞ:

    危険なキャラクターから逃れる

    あなたのコンセプトは完全に間違っています。
    実際、「危険な文字」は神話であり、存在しません。mysql_real_escape_stringはエスケープされますが、文字列区切り文字 。この定義から、制限があると結論付けることができます。これは、文字列に対してのみ機能します。 。

    ただし、安全な文字を含む可能性のある他の攻撃に対しては依然として脆弱ですが、データを表示したり、場合によってはデータを悪意を持って変更または削除したりすることに対して有害である可能性があります。

    ここではすべてを混ぜ合わせています。
    データベースと言えば、

    • 文字列の場合、脆弱ではありません。 文字列が引用符で囲まれてエスケープされている限り、できません 「データを悪意を持って変更または削除する」。*
    • 他のデータタイプデータの場合-はい、役に立たない 。しかし、それがいくぶん「安全でない」からではなく、単に不適切な使用のためです。

    表示データはオフトピックだと思います PDOはデータの表示とも関係がないため、PDO関連の質問で。

    ユーザー入力のエスケープ

    ^^^注目すべきもう1つの妄想!

    • ユーザー入力はエスケープとはまったく関係ありません 。前者の定義から学ぶことができるように、「ユーザー入力」ではなく、文字列をエスケープする必要があります。だから、もう一度:

      • ソースに関係なく、エスケープ文字列があります
      • ソースに関係なく、他の種類のデータをエスケープすることは無意味です。

    要点はわかりましたか?
    さて、脱出の限界と「危険なキャラクター」の誤解を理解していただければ幸いです。

    私の理解では、PDO/プリペアドステートメントを使用する方がはるかに安全です

    そうではありません。
    実際、4つあります 動的に追加できるさまざまなクエリパーツ:

    • 文字列
    • 番号
    • 識別子
    • 構文キーワード。

    したがって、エスケープは1つの問題のみをカバーしていることがわかります。 (ただし、もちろん、数値を文字列として扱う場合(引用符で囲む場合)、該当する場合 、安全にすることもできます)

    プリペアドステートメントがカバーしている間-うーん-2つの問題全体!大したこと;-)

    他の2つの問題については、私の以前の回答 PHPで文字列をデータベースに送信する場合、htmlspecialchars()を使用して不正な文字を処理する必要がありますか、それとも正規表現を使用する必要がありますか?

    現在、関数名が異なるため、mysql_query、mysql_fetch_array、mysql_num_rowsなどは機能しなくなります。

    これは、もう1つのPHPユーザーの重大な妄想です。 、 自然災害、大惨事:

    古いmysqlドライバーを使用している場合でも、裸のAPI関数を使用しないでください 彼らのコードで!日常的に使用するために、それらをライブラリ関数に配置する必要があります。 (魔法の儀式としてではなく、コードを短くし、繰り返しを少なくし、エラーを防ぎ、一貫性を保ち、読みやすくするためです。)

    同じことがPDOにも当てはまります!

    もう一度質問を続けてください。

    しかし、それらを使用することで、mysql_real_escape_stringのようなものを使用する必要がなくなりますか?

    はい。

    しかし、これは大まかにデータベースからユーザーをフェッチするために何をすべきかという考えだと思います

    フェッチするのではなく、クエリに任意のデータを追加する

    私が間違っていなければ、PDO:PARAM_STRの後に長さを指定する必要があります

    できますが、そうする必要はありません。

    さて、これはすべて安全ですか?

    データベースの安全性に関しては、このコードに弱点はありません。ここで確保するものはありません。

    表示セキュリティについては、このサイトでXSSを検索してください。 キーワード。

    私がその問題に光を当てることを願っています。

    ところで、長い挿入については、私がいつか書いた関数、PDOを使用してヘルパー関数を挿入/更新

    ただし、ライブラリを利用して、自作のプレースホルダーよりも自作のプレースホルダーを優先するため、現時点ではプリペアドステートメントを使用していません。 私は上で述べました。したがって、以下のrihaによって投稿されたコードに対抗するには、次の2行と同じくらい短くなります。

    $sql  = 'SELECT * FROM `users` WHERE `name`=?s AND `type`=?s AND `active`=?i';
    $data = $db->getRow($sql,$_GET['name'],'admin',1);
    

    ただし、もちろん、プリペアドステートメントを使用して同じコードを使用することもできます。

    * (yes I am aware of the Schiflett's scaring tales)



    1. MariaDBでのSHOWCOLLATIONの仕組み

    2. 中央値を計算する最も速い方法は何ですか?

    3. MySQLのバージョンを確認する方法

    4. SAPLumiraとJDBC-ODBCブリッジ