09 06/23 PHP と SQL (MySQL) の連携 その3

平成23年度前期 情報科学III (理系コア科目)
PHP と SQL (MySQL) の連携
その4
担当 松永 裕介
月曜日 2限
http://www.c.csce.kyushu-u.ac.jp/~matsunaga/lecture/php/
本資料の一部は、堀良彰准教授、天野浩文准教授等による
以前の講義資料をもとにしています。
悪意のある攻撃
• WEBページを利用する人がすべて善意の人
とは限らない。
• 特に、個人情報や金銭に関係するWEBペー
ジ(上のプログラム)を設計する場合にはセキ
ュリティを十分に考慮する必要がある。
• 詳細は、書籍やWEB上の情報で各自、確認
すること。また、永遠に安全といえる対策はあ
りえないので常に対策を考えておく必要があ
る。
GET を用いた入力フォーム
•
<form action=action.php method=get>
<table> <tr>
<td>アカウント</td>
<td><input type=text name=name></td>
</tr>
<tr>
<td>パスワード</td>
<td><input type=password name=password></td>
</tr>
<tr>
<td> <input type=submit value=ログイン>
<input type=reset value=クリア> </td>
</tr> </table>
</form>
GETを用いた入力フォーム
• 情報科学IIIのWEBページの
– テストページ
のリンクをクリック
名前とパスワードを適当に入れて “ログイン”を
クリック
切り替わったページのURLにはどんな文字列
が表れているか?
MYSQL データベースを用いた
ログイン認証
<?php
$id = mysql_connect(….)
$sql = sprintf(“SELECT * FROM mydb WHERE
name=‘%s’ AND password = ‘%s’” ,
$_POST[‘username’], $_POST[‘password’]);
$result = msql_query($id, $sql);
if (mysql_numrows($result) > 0) {
print “ログインに成功しました。”;
}
…
?>
SQLインジェクション
• SELECT * FROM mydb
WHERE name=‘%s’ AND password =‘%s’
• name に x’ OR 1 = 1 --; を入れると – 以降
はコメントとみなされ、 WHERE 節の条件が
成り立ってしまう。
• ⇒認証のすり抜け
• ⇒データベースに対する不正な操作(書き換
え、削除など)
SQLインジェクションの対策
• ログイン名やパスワードなどの場合には、入
力可能な文字の種類を制限しておいて、’ や
“ などが入力されたらエラーにするようにする
。
• PHP の関数 addslashes() を用いて特殊な
文字をエスケープ(特殊文字の意味を失わせ
る)する。
• 場合場合によって対策を考える必要がある。
• ⇒たとえば、データベースの削除や更新の権
限を設定しておくなど