2011-11-28 8 views
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 

答えて

0

脆弱性は、あなたが$nameに置き換える時点で起こります。代用する前に必ずエスケープしてください。

1

再度エスケープする必要があります。エスケープするすべてのことは 'SQL、これはコマンド指向ではありません'と言うことです、それはデータの一部です '。だから、もしあなたが "'one'"をエスケープすると、SQLは "\ 'one \'"を保存し、出力します "" one '"。つまり、あなたはもう一度逃げなければならないということです。

さらに、通常のmysql_関数を使用する代わりに、mysqli_またはPDOのプリペアドステートメントを使用します。私はエスケープの必要性を取り除くため、私自身のプログラミングアプローチを変更しています。 (基本的な考え方は、データを 'place'で解析する必要があるクエリ文字列を送信する代わりに、プレースホルダを使用してクエリ文字列を送信し、 、Y、Zを使用すると、実際のクエリの処理が破損することはありません)

関連する問題