システム構築事例の話(…?)
- 突発的なアクセスの増加
- Yahooアタック
- Yahooのトピックスにリンクが付くと…
- 動画への直接リンクはやばい
- PHPを選んだ理由
- 簡単
- みんな使っている
- 自由度が高い
- サーバ設定が簡単
- 速い(?)
- しかし
- コードの統一性がない
- セキュリティが最悪
- フレームワークを活用することにした。
- 開発時間の大幅短縮
- ルールに従うと、コードが統一
- DBとの連携が簡単
- 表示が速い(ページキャッシュ機能)
- PHP勉強法
- 参考までに。
- 目標を作る(アプリを1週間で作る。必ず日程を決めておく事。)
- 入門書とリファレンスブックを購入
- 作りたいものに近いサンプルがある本が良い
- 説明を見ながらとにかく作る
- リファレンスブックを見ながらソースコードを読む
- 自作アプリケーションを作成する。
- オープンソースを解読(バグ情報は便利)
- 参加する
- オープンソースを作る
- 勉強会に参加する
- TIPS
- コードのガイドラインを決める
- コードの最適化
- コード最適化ベストプラクティス
- http://d.hatena.ne.jp/koto2/20080518/1211070116など
- セキュリティに気を使え!
- サニタイズ処理だらけの関数等を通して無効化する。
- 英語ができたほうが良い
- 最新情報を得る(セキュリティ等)
- 初級者こそフレームワークを使うべき
- 3カ月以前の自分のソースコードを恥ずかしく思える様になること。
- 常に精進しつづけましょう!
- アイデアをお待ちしております!
- 苦労した点
- ロードバランサ
- 無害化する方法(フレームワークを使わない場合)
- htmlspecialchars()
- mysql_real_escape_string()
- いつも同じようなコードを書いている?
- 以下のようなコードは…
- ロジックとデザインがごちゃまぜになったコード
- ルールが統一されていない
- サーバを移したら動かなくなった。(PHPの場合)
- バージョンの違い
- 設定値の違い
- ライブラリの不足
- セキュリティが不安
- いろいろな攻撃
- フレームワーク(Framework)
- 骨組み
- 土台となるもの
- 主な役割
- 標準的な機能の提供
- ライブラリ
- ヘルパー関数
- CakePHPのpr()
- print_r()の結果を<pre></pre>で囲って出力する
- MVCモデルの実現
- Model
- View
- Controller
- MVCモデルのメリット
- 独立性の確保
- 機能毎の役割が明確になる
- 依存性の抑制
- 保守性の向上
- ORマッピング
- ルールの制定
- 命名規則
- 変数名、テーブル名
- ディレクトリ構成
- コーディングスタイル
- フレームワークのデメリット
- 学習コスト
- どれが良いかわからない
- 色々なフレームワーク
- 場合に応じて使い分ける
- 選定基準
- 実用性
- 安定性
- 機能、対応バージョン
- 開発の継続性
- ライセンス
- 情報の入手しやすさ
- CodeIgniter
- 高速
- 軽量
- ソースの容量は(展開後で)1.2M
- 低い学習コスト
- 日本語のユーザガイドが完備
- CodeIgniterのURL
- index.phpがフロントコントローラ
- URLは、index.php/fuga/piyo/paramなど。
- class fuga extends CI_Controller {
- function piyo($param)
- 便利な機能
- active_record
- form_validation
- View
- 共通部分はinclude
セキュリティについて考えてみよう
- バグ、脆弱性
- バグとは何か?
- なるべきものが、そうならない。
- 脆弱性とは何か?
- バグと言えばバグ。
- そのうち、セキュリティに関係するもの
- 例)脆弱なOSで動作しているサーバがあっても、ファイアウォールで完全に隔離されていれば問題はない。
- 外部から接続できないので。
- セキュリティホール、脆弱性はバグの一部。
- アプリケーションが正常に動作するように作ること。
- 「一定の定義」に従って正常に動作するのであれば問題ない。
- リスクを知り、対応する
- 以下のような問題に対して
- SQL Injectionでデータを取られた
- SQL Injectionでページを書き換えられた
- Webアプリケーションは「最もリスクがあるもの」
- 全世界に向けて公開する前提だと。
- 自分のサーバは人気がないから問題ないだろう。
- クラックする人は、踏み台にするためにサイトの大小に関わらず攻撃してくる!
- 従って、これは間違い。
- リスクとは何か?
- CVEというデータベースがある。
- セキュリティ情報(脆弱性情報)を集めたもの。
- http://cve.mitre.org/
- 入力、処理、出力
- エコーバック問題?
- 9割方、入力と出力の部分で対処がない。
- 基本的に自分のアプリ以外は全て信用できない前提で考える。
- 信頼境界線
- 入力は「全てバリデーション」
- 「サニタイズ」とは違う
- ブラックリスト的考え方。(悪いものを弾く)
- validationはホワイトリスト的考え方。(良いもののみを受け入れる)
- 処理は「ベストプラクティスに従う」
- 話をすると長くなるので省略
- めんどくさい
- 出力
- エスケープを理解し、エスケープする
- ヘルパーを理解し、ヘルパーを使う
- 属性名をエスケープしないヘルパーがあるので、下手すると、そこがXSSの原因になる可能性も。
- エスケープもヘルパーも使えないものはバリデーション
- どうしようもないもの、絶対に安全だとわかっているもの
- そのまま出力
- アプリケーションが正しく動作することを担保する
- 特にセキュリティに特化する場合
- CIAを保証する
- Confidential(機密性)
- Integrity(統合性)
- Availability(可用性)
- セキュリティ対策に役立たないセキュリティ対策はない
- セキュリティ対策とはリスクマネジメント
- リスクを許容できれば、どんな対策でも構わない。
- リスクを理解した上で、どこまでリスクを許容できるのか。
- ただし、他人に迷惑はかけない
- 例えば、文字エンコーディングのバリデーション
- 入力時に文字エンコーディングをバリデーションする。
- 適切な設計も必要
- どれが優れたセキュリティ対策か?よりも、必要なセキュリティ対策か?が重要
0 件のコメント:
コメントを投稿