mysql:10328
From: "TOYOSHIMA,Masayuki" <"TOYOSHIMA,Masayuki" <mtoyo@xxxxxxxxxx>>
Date: Tue, 19 Oct 2004 09:54:07 +0900
Subject: [mysql 10328] place holder と SQL injection
豊島(東京外国語大学アジア・アフリカ言語文化研究所)と申します。
(mysql だけの問題ではないのですが) 次の考え方は正しいでしょうか。
「place holder を使えば、SQL injection は防ぐことができる」
-----------
perl DBI を使って、$user_input にユーザ入力を貰うとして、
my($sql)="SELECT a_field FROM a_db WHERE (some_field LIKE \'$user_input\')";
eval {
my($p)= $DB->prepare($sql);
$p->execute() if ($p);
};
とした場合は、ユーザに
「STRING' OR 'A' = 'A」
とか入れられると、 some_field LIKE 'STRING' OR 'A' = 'A' となって(常に
where 句が真になり)全データを取られる SQL injection の脆弱性が生じますが、
my($sql)="SELECT a_field FROM a_db WHERE (some_field LIKE ?)";
eval {
my($p)= $DB->prepare($sql);
$p->execute($user_input) if ($p);
};
と place holder を使えば、適切な quote 処理が行われるので、それが生じな
い、という主張です。
もっと手の込んだ SQL injection (複文を羅列して勝手に drop table とかする
様なもの)でどうなのか、ちょっと考えが及ばないのですが…。
豊島正之(とよしま まさゆき) mtoyo@xxxxxxxxxx
http://jcs.aa.tufs.ac.jp/mtoyo/
東京外国語大学アジア・アフリカ言語文化研究所
〒183-8534 東京都府中市朝日町3-11-1 代表Fax 042-330-5610
-> 10328 2004-10-19 09:54 ["TOYOSHIMA,Masayuki"] place holder と SQL injection 10329 2004-10-19 22:19 ┣["KAWAI,Takanori" <GC] 10330 2004-10-20 07:51 ┃┗["TOYOSHIMA,Masayuki"] 10334 2004-10-21 04:12 ┗[ayumi <ayumi@xxxxxxx]