Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
第一回 社内勉強会 PHP Application Security Checklist に学ぶ PHP セキュリティ (Excerpt) | ODP
[go: Go Back, main page]

第一回 社内勉強会 Security Checklist に学ぶ PHP  セキュリティ Yuya Takeyama  2010/05/21 (Fri)
本日の目的 Webにおけるセキュリティの基本を再確認 「知ってて当然」とされる事柄はあまりに多い。 共通の語彙を身につければ、コミュニケーションコストも下がる。
PHP におけるセキュリティの難所を知る PHP に特化した、より実践的な話。 教材として PHP Application Security Checklist を使用。
自社サービスにおける問題点の共有
このあと、そのための時間をとる予定。
この機会にぶっちゃけましょう。
アジェンダ Web におけるセキュリティのおさらい ・クロスサイトスクリプティング
・ SQL インジェクション
PHP のセキュリティ
・本当はおそろしい php.ini ・ 5c 問題の無間地獄
Cross Site Scripting Cross Site Scripting Cross Site Scripting Cross Site Scripting
略して
CSS
・・・だと Cascading Style Sheet と混同するので
XSS 一般的には と呼ばれています (DVD のプロテクト技術にも CSS ってのがありましたが・・・ )
簡単に 言うと
サイトを越えて 悪意のあるコードを 実行すること
Input from $_GET, $_POST, $_COOKIE and $_REQUEST is considered tainted.
直訳
$_GET 、 $_POST 、 $_COOKIE 、そして  $_REQUEST  からの入力は 汚染 を考慮されているか。
Understood that only some values in $_SERVER and $_ENV are untainted.
直訳
汚染 されていないのは  $_SERVER  と  $_ENV  のいくつかの値だけであることを理解しているか。
つまり
入力の 汚染 を 常に 疑うこと
出力は 常に エスケープ すること
SQL Injection
例
MySQL による ユーザー認証
SELECT * FROM users WHERE user = ' yuya ' AND pass = ' doom ' 色 がついているのは、ユーザーのフォームへの入力による値
パスワードが一致しないと レコードが引けない (= ログインできない ) はずだけど・・・
SELECT * FROM users WHERE user = ' yuya' OR 1 # ' AND pass = ' doom '
もっと酷い ケース
SELECT * FROM users WHERE user = ' ';TRUNCATE users # ' AND pass = ' doom '
ただし
PHP の mysql_query  関数は ;( セミコロン ) 区切りによる 複数のクエリ の同時送信は できない 。
さておき
どうしたら SQL インジェクションから 自由になれるか
入力の 汚染 を 常に 疑うこと
出力は 常に エスケープ すること
SELECT * FROM users WHERE user = ' yuya \ ' OR 1 # ' AND pass = ' doom ' SQL 文のエスケープをしてあげる ※ SQL 文は PHP アプリケーションから 見れば出力ですね
Web におけるセキュリティのまとめ 入力の汚染を常に疑う
出力を常にエスケープする
これを守るだけで、その他の脅威
 ・ディレクトリトラバーサル
 ・クロスサイトリクエストフォージェリ  (CSRF)
 ・コマンドラインジェクション等
も防ぐことができます。
本当は おそろしい php.ini
ここで再び PHP Application Security Checklist
register_globals is disabled.
直訳
register_globals は 無効化されているか
http://example.net/?debug=on にアクセスすると ” on” という値を持った 変数 $debug が 勝手に できてしまう
現在は デフォルトで Off になっているので とりあえず 安心
php.ini には こういう 地雷 がいっぱい しかも On だったりするから困る
addslashes() は マルチバイトを 扱えないから 使用禁止!
magic_quotes_gpc も On にするの禁止!
addslashes() is not used.
Magic quotes is disabled.
PHP Application Security Checklist さんも そう言ってるので!
magic_quotes_gpc の問題点 エスケープされたもの、されてないものが混在するため、余計煩雑。ありがた迷惑。
そもそも addslashes() がイケてない ( 日本になんて生まれるんじゃなかった )
マルチバイト文字を抜きにしても、 addslashes() ではエスケープできない DB もある。 (SQLite とか )
PHP6 では削除予定
5c 問題の 無間地獄
addslashes() じゃない SQL のエスケープについて 考えてみる
mysql_real_escape_string()
これで 安心?
否

第一回 社内勉強会 PHP Application Security Checklist に学ぶ PHP セキュリティ (Excerpt)