[PHP-users 24232] クロスサイトスクリプティングとSQLインジェクションの防止策

鈴木孝征 Suzuki Takamasa takamasa @ thaliana.myhome.cx
2005年 1月 27日 (木) 10:02:04 JST


PHP-users MLの皆様へ。鈴木孝征と申します。

LinuxWorld 3月号を読みましてウェブアプリケーションを作成する上で
改めていろいろ注意するべき点があると感じました。

件名にかきましたとおりクロスサイトスクリプティング(XSS)とSQLイ
ンジェクションを防止する上でPHPでするべき対策について教えてく
ださい。

まずXSSについてですが、XSSはユーザーが入力した値をHTMLに組み込
んで返すときに起きると理解しています。私が現在取り組んでいる案件
ではそのような処理がいくつかあるのですが、ユーザーが入力した値は
そのユーザーしか見られないようになっています。ユーザーのなりすま
しなどの危険性を考えない場合、つまりユーザーAが入力した値はユー
ザーAしか見ないことが保障されているのならば、XSSの問題は存在し
ないと考えてよろしいのでしょうか。

またユーザーAの入力した値($a)をユーザーBに表示する場合PHPの関数
htmlspecialcharsを使用して表示すればそれのみでXSSの危険は完全に
防止できるのでしょうか。

次にSQLインジェクションの防止策についても教えてください。ユーザー
の入力した値をもとにデータベース(私はPostgreSQLを使用しています)
を検索する処理を行っています。ユーザーの入力した値は下記のような
SQLで利用しようと考えています。

$value = $_REQUEST['value'];
pg_query($connection, "select * from table1 where column1 = '$value'");

このとき$valueに'(シングルクォーテーション)が入っているとSQLイン
ジェクションの危険があるので、$valueをサニタイジングしなければいけ
ないと思います。

PHPの関数を眺めるとaddslashesという関数が見つかりシングルクォー
テーションをクォートしてくれることが期待できます。$valueを
$value = addslashes($value)とすれば上記のSQLにおいてはSQLインジェク
ションを完全に防止することができるのでしょうか。

ウェブアプリケーション作成の注意点を書いたものはときどき見るのです
が、PHPでの具体的な処理方法について確認したかったので投稿させてい
ただきました。もちろん「完全」とか「100%」などと断言することは
難しいと思いますが、皆様が安全だと確信して行っている処理について教
えていただければ幸いです。



PHP-users メーリングリストの案内