1

ユーザーからの入力を取得してデータベースに保存する Web アプリケーションがあるとします。さらに、セキュリティの脆弱性がないと仮定しましょう。ユーザー入力を正しくエスケープし、バインド パラメータを使用します。

データベースから取得したデータは、疑いを持って処理する必要がありますか (つまり、潜在的に汚染されている/悪意があるとして)?


例(試してみるのが怖いので結果はわかりません)。これはデータベースです:

create table mytable (id int primary key, name varchar(50));

create table othertable (name varchar(50), xyz int, 
    ... `name` is an fk ...);

insert into mytable (id, name) values(1, '"abc"; drop table mytable;');

insert into othertable (name, xyz) values('"abc"; drop table mytable;', 45475);

次に、この疑似コードを実行します (おそらく PHP から):

# run query 'select * from mytable where id = 1';

# put the `name` in $name

# run query 'select * from othertable where name = $name'
# $name is not escaped, no other precautions taken
4

2 に答える 2

1

あなたは再び逃げなければなりません。エスケープするのは、「SQL、これはコマンド指向ではなく、データの一部です」と言うことだけです。したがって、 "'one'"をエスケープすると、SQLは "\' one \'"を格納し、..."'one'"を出力します。つまり、もう一度すべてを脱出する必要があります。

さらに良いことに、通常のmysql_関数を使用する代わりに、mysqli_またはPDOのいずれかからのプリペアドステートメントを使用します。私は自分のプログラミングアプローチを移行しています。なぜなら、それらはエスケープの必要性を取り除くからです。(基本的な考え方は、データを「インプレース」で解析する必要のあるクエリ文字列を送信する代わりに、プレースホルダーを使用してクエリ文字列を送信し、SQLに「以前に提供したクエリを覚えているか」を通知することです。値Xを使用します。 、Y、およびZが含まれています。その結果、値が実際のクエリの処理を損なう可能性はありません)

于 2011-11-28T18:22:29.600 に答える
0

脆弱性は、を置き換えた時点で発生します$name。代用する前に必ず脱出してください。

于 2011-11-28T17:36:03.040 に答える