0

ここSOにはSQLインジェクションに関する多くの警告がありますが、私が見つけた誰も実際に答えていません.どうしてそれが起こるのですか? この質問では、MySQL と PHP を想定しています。

基本的なmysql_は、クエリ内で 2 番目のクエリを受け入れませんよね?

つまり、基本的にこれは

$unsafe = "');DROP TABLE table;--";    
mysqli_query($con,"INSERT INTO table (Column) VALUES ('$unsafe'");

実際に有害なことは何もしませんか?これについて私を修正してください。

私はmysqli_を使った経験がないので、PDO と「準備済みステートメント」にスキップします。

PDOを使い始めた頃は情報不足で、基本的には安全だなと思って使っていました。

$stm = $pdo->prepare("INSERT INTO table (Column) VALUES ('$unsafe');
$stm->execute();

ただし、 PDO とmysql_の場合は同じです。すぐに使用できる複数のクエリはサポートされていませんよね? 繰り返しますが、これについて私を修正してください。

では、私が間違っていなければ、これは安全であると見なされますか?

$stm = $pdo->prepare("INSERT INTO table (Column) VALUES (?);
$stm->execute(array($unsafe);

複数のクエリがサポートされていない場合、データベースにアクセスできない悪意のあるユーザーは、どのようにして悪意のあるデータを挿入するのでしょうか?

それとも彼らですか?

4

2 に答える 2

1

複数のクエリがサポートされていない場合、データベースにアクセスできない悪意のあるユーザーは、どのようにして悪意のあるデータを挿入するのでしょうか?

「SQL インジェクション」は「2 番目のクエリ」とは異なります。

それとも彼らですか?

確かにそうです。

2 番目のクエリは単なるです。任意の有効な SQL ステートメントを指定できます。SQL インジェクションは、不適切な形式のクエリのエクスプロイトです。開発者が SQL を適切にフォーマットしない場合、リテラルの制限を破って SQL 本体にコードを追加する可能性があります。

2 番目のクエリを追加することで、SQL インジェクションは実際に可能ですか?

はい、使用している API によって異なります。

于 2013-10-29T18:47:15.517 に答える
0

mysql + php を使用した 2 つのクエリは誤謬です

本当に息子に名前をつけましたか

ソース: http://xkcd.com/327/

通常のクエリ関数は最初のクエリのみを実行するため、これを可能にするための意図的な手順がなければ、mysql および php では機能しません

それが不可能だという意味ではありませ

SQL インジェクションは非常に現実的です

しかし、上記はSQLインジェクションに関してはほとんど意味がありません。スタックオーバーフローに関する多数の質問を含む、SQLインジェクションに関する膨大量の情報があります。質問の例を挙げると、これは機能する同等の攻撃です

$id = "123 OR 1 = 1 --";
mysqli_query($con,"DELETE FROM table WHERE id = $id LIMIT 1");

つまり、コメントなど、自分のコメントを削除するためのインターフェイスを見つけることです。id がエスケープされていない場合、すべてのコメントを削除するのは簡単です。しかし、この例は氷山の一角にすぎません。

任意の SQL ステートメントの実行は悪用可能です

質問のこのコード:

$stm = $pdo->prepare("INSERT INTO table (Column) VALUES ('$unsafe')");
$stm->execute();

PDO を使用する利点はありません。つまり、mysql/mysqli ドライバー (単純に使用) で機能するエクスプロイト (本当に膨大な数の) は、この方法で使用される pdo で機能します。

パラメータ化されたクエリは、SQL インジェクションから保護します

パラメーター付きの準備済みステートメントで PDO を 使用すると、値が適切にエスケープされ、SQL インジェクション攻撃が防止されるため、はい、これはインジェクションから安全です。

$stm = $pdo->prepare("INSERT INTO table (Column) VALUES (?)");
$stm->execute(array($unsafe));

データベースへのアクセス権を持たない悪意のあるユーザーは、どのようにして悪意のあるデータを挿入しますか

やりたいことを実行するか、別の方法で実行するための情報を提供するSQLを実行する方法を見つけるだけです。

例えば:

function login() {
    $username = "irrelevant' OR is_admin = 1 --";
    $password = hash('irrelevant');
    $query = "SELECT id from users where username = '$username' AND password = '$password'";
    ...
}

悪意のあるユーザーは、どのようにしてインジェクションを気にせずにシステムの管理機能にアクセスできたのでしょうか? とても簡単に。

インジェクションに関する一般的な情報については、以前の参考文献を参照してください。

于 2013-10-30T09:37:17.273 に答える