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

PHPMySQLIはSQLインジェクションを防ぎます

    読み取りまたは書き込み、永続的または一時的のいずれであっても、任意のクエリを挿入できます。インジェクションは、1つのクエリを終了し、別のクエリを実行することで実行できます( mysqli で可能) )、目的のクエリを無関係にします。

    ユーザーからのものであれ、内部からのものであれ、外部ソースからのクエリへの入力は、クエリへの引数、およびクエリのコンテキスト内のパラメータと見なす必要があります。クエリ内のパラメータはすべてパラメータ化する必要があります。これにより、適切にパラメータ化されたクエリが作成され、そこからプリペアドステートメントを作成し、引数を使用して実行できます。例:

    SELECT col1 FROM t1 WHERE col2 = ?
    

    パラメータのプレースホルダーです。 mysqliの使用 、 prepareを使用してプリペアドステートメントを作成できます 、 bind_param を使用して変数(引数)をパラメーターにバインドします 、 executeを使用してクエリを実行します 。議論を無害化する必要はまったくありません(実際、そうすることは有害です)。 mysqli あなたのためにそれをします。完全なプロセスは次のようになります:

    $stmt = $mysqli->prepare("SELECT col1 FROM t1 WHERE col2 = ?");
    $stmt->bind_param("s", $col2_arg);
    $stmt->execute();
    

    パラメータ化されたクエリの間にも重要な違いがあります およびプリペアドステートメント 。このステートメントは、準備されていますが、パラメーター化されていないため、インジェクションに対して脆弱です。

    $stmt = $mysqli->prepare("INSERT INTO t1 VALUES ($_POST[user_input])");
    

    要約すると:

    • すべて クエリは適切にパラメータ化する必要があります(パラメータがない場合を除く)
    • すべて クエリへの引数は、ソースに関係なく、可能な限り敵対的なものとして扱う必要があります



    1. SQLiteデータベースのテーブルを一覧表示する2つの方法

    2. OrderBy句を使用したMySQLでの並べ替え

    3. SQLServerのライセンスコストを削減

    4. Crontab/Cronを使用してMySQLデータベースを自動的にチェックおよび最適化する