More Related Content
Similar to PHPでセキュリティを真面目に考える (20)
More from Takuya Sato (11)
PHPでセキュリティを真面目に考える
- 3. 少 向
•
PHP
セ
•
な け 基 ミ セ 今
い で 本 の ナ キ 回
か す 的 ネ ー ュ の
も が に タ と リ 内
し 、 初 が 被 テ 容
れ 細 メ る ィ
か 心 ネ
ま 者 イ か
い ン タ
せ ~ と で
ん 解 で 思
説 中 他
。 級 す っ
は 。 た の
者 の
で
- 18. 古いPHP+古いソフトウェアの組み
合わせはもっと危険
特定の脆弱性を狙い撃ちにできる
BOT等でその脆弱性だけを無差別に狙う
動作しているプログラムも知られている
ため、簡単に攻撃できる
- 29. よ廃 古
う墟 い
PHP
なの
も な
の ん
て
- 36. <?php
// 「表」をSJISにする
$a = mb_convert_encoding('表', 'SJIS-win',
'UTF-8');
// addslashesでエスケープ
$b = addslashes($a);
// UTF-8に戻す
$c = mb_convert_encoding($b, 'UTF-8', 'SJIS-
win');
//出力
var_dump($c);
=> string(4) "表¥"
- 49. プレースホルダ
$sql = 'SELECT * FROM hoge WHERE foo = ?;'
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('s', $foo);
$stmt->execute( );
- 50. エスケープ関数で
$sql = 'SELECT * FROM hoge WHERE foo = %s;'
$new_sql = sprintf($sql, $mysqli-
>real_escape_string($foo));
$mysqli->query($new_sql);
- 51. テーブル名は特に危険
$sql = 'SELECT * FROM %s WHERE foo = 1;'
$new_sql = sprintf($sql, $foo);
$mysqli->query($new_sql);
// テーブル名なので'hoge'という指定はできない
// $foo に "hoge INNER JOIN …"とか入ると…?
- 53. MySQLのUTF-8
������ や ������ といった文字が入らない
入れようとするとwarningになるが、空として入る
(errorにはならない)
例えばPHP側で入力チェックをして正常に通過して
も、MySQL側には空文字として入ってしまう、という
ことになる
文字チェックはDB側で行うことが必要
- 57. IPアドレスで
制限しておけば
余裕だぜー
いや他にも
脆弱性は
あるし…
しかもそのIPアドレスリストちゃんと更新してる?