セキュリティなぜセキュリティなのか。弱いサイト作る→悪人がサイト改ざん→閲覧→勝手にリダイレクトされて攻撃される。チェック(バリデーション)→想定外の値が渡されたら処理中断、エラー表示をさせる。除外(null、不正文字列など)チェックエラーメッセージ→エラーであることがわかるメッセージだけを表示するべき。親切すぎるエラーメッセージはだめ。→PHPのWEBアプリケーションは基本Apacheモジュールとして動作させるのが一般的。MyController→コンテンツ内に悪意あるスクリプトを直接埋め込んで攻撃する。※ユーザから投稿を許可している場合特に注意。(掲示板、ブログコメントなど)・悪意あるサイトへのリダイレクト・cookie情報をとられてサイトの管理者権限を乗っ取られる。例getメソッドでURLに~~.php?id=1ある場合などで、javascriptコードを書かれるとコードが実行されてしまうため危険。対策htmlspecialchars()関数を使うことで無害化。第二引数にはENT_QUOTESを指定するべき。'UTF-8');→指定しないとシングルクォートはエスケープされなくなる為。※自分で初期化した変数以外は、基本全ての変数にはこれで対策したほうがベター。MyController複数のサイトを横断させたから→クロスサイトと呼ばれる。リンクを踏ませるなど間接的な方法で悪意あるスクリプトを実行させる攻撃のこと。スクリプト挿入攻撃と基本は同じくユーザ投稿型で特に注意。スクリプト挿入攻撃との違い→XSSは間接的(攻撃対象と異なるサイト、メールなどを介する)であるという点。他のサイトからリンクが貼られていて、リンクURLにjavascriptコードなどを埋め込まれると悪意あるサイトにリダイレクトされてしまうなど。スクリプト挿入と同じくhtmlspecialchars()にてエスケープする。・クロスサイトリクエストフォージェリ(CSRF)正規の権限を持つユーザに対して、意図しない操作を行わせること。ユーザ自身に操作させるため、権限チェックだけでは防げない。→正規の権限で記事が削除される。時はパスワード認証をさせる※2つを併用するのが望ましい。※ワンタイムトークンの注意点タブブラウザで同じページを複数回開いた場合、最新タブ以外は不正なトークン扱いになるので利便性は低下。対策トークンを保持するセッション変数を配列型にして、トークンチェック時にin_array()などを使うことで対応可能。無制限にトークンを保持するよりはトークン保持数を制限したり有効時間を決めたりした方が良い。追記PerfectPHPでこう書いてあったが、どうもワンタイムトークンは必要ないようだ。理解を深めるために下記がいい。hiddenパラメタは漏れやすいのか?結論、PHPのセッション強度をあげることで対応すればよいぽい。「現在時刻」+「IPアドレス」+「乱数」php.iniの設定変更でさらに強度を上げることができる。1hash_function:ハッシュ化するアルゴリズムを指定できる推奨:SHA512(開発環境はMD5)2session.entropy_file:追加するランダムな値を指定できる(初期設定では/dev/urandomが設定されているがコメントアウトされている)/dev/urandom:乱数を生成してくれる擬似デバイス3session.entropy_length:entropy_fileから読み込むバイト数を指定できる(初期設定ではコメントアウトされている)・SQLインジェクションDBに対する命令文を改ざんして意図しない操作を行うこと。DBの内容をとられたりすると被害が甚大なので確実に防衛しよう。pass='パスワード'という文がプログラム中にあった場合。ユーザがadminでパスが空白、もしくは1と1が等しいユーザ情報を取得する問い合わせとなってしまうので危険。対策プリペアドステートメントを利用。→値と置き換える為のプレースホルダを含んだSQLを事前に準備して、SQL実行時に値をプレースホルダに割り当てる機能のこと。※環境によってプリペアドステートメントを利用することが出来ない場合は、DBエンジンに合わせたエスケープ関数を実行する。pg_escape_string()関数mysql_real_escape_string()関数など。Objects)の利用をおすすめ。※PHP5.1.0以降だとデフォルトでPDOが有効。DBエンジンを意識せずに共通のAPIでDB操作可能となる。プリペアドステートメントについてもう少し詳しく。"');これエスケープされてないので下記のようにするのが望ましい。//PDOクラスのprepare()メソッド実行でPDOStatementクラスのインスタンスになる。//PDOStatementクラスのexecute()メソッド実行で、クエリがDBに発行される。引数にはプレースホルダを指定。いうのは動的パラメータが入るという指定のこと。プレースホルダとよばれる。任意のIDを強制的に利用させること。→セッションハイジャックを成立させる手段になってしまうので、セッションを使う際にはセットで対策が必要。正規のユーザ以外ログインユーザ専用ページは表示されないように見えるページがあるとする・・・・セッションIDが分かっていてURLの後ろに付与してアクセスするとまたログイン画面が出てくる。次にクッキーを削除してもう一度URLの後ろに付与してアクセスすると今度はログインユーザ専用ページが表示されてしまう。セッションアダプション自身が発行したものではないセッションIDを受け入れてセッションが初期化されてしまう。Monsterバグ(クロスドメインクッキーインジェクション)クッキーに意図するIDを埋め込んでセッション固定攻撃を仕掛ける。古いブラウザの不具合を利用して「.co.jp」や「.gr.jp」などのセカンドレベルドメインに対して任意のクッキーをセットする攻撃方法。※最新のブラウザなら基本対応されてるが一応覚えておいて損はなし。対策ログイン時の認証成功した段階でセッションIDの再発行を行う。session_regenerate_id()関数が使える。■セッションハイジャック何らかの方法で取得したセッションIDを使って正規ユーザのセッションを乗っ取る。クレジットカード使われたり、個人情報をとられたりしちゃう。これも確実に防ぐ必要がある。・リファラによる漏えい→PHPのデフォルトではクッキー利用するが、利用出来ない場合はGET、POST変数が利用されるので注意。→リダイレクトさせて盗んで、元のサイトにリダイレクトさせちゃえばユーザが気づく事もないので怖い。→もろいサイトに対して指定したセッションIDを含むリンクを貼っておくだけで、あとは勝手にリンクを踏んでサイトに移動後、ログインを待ってればセッションIDがとられてしまう。Accept-Language、User-Agentは通常セッション途中で変更されないのでこれを元にチェックすると多少はリスク低下できる。→重要な作業前に再度パスワードチェックさせる。ユーザビリティ低下はする。他にも細かく具体的に攻撃方法が書いてあるいいサイトがあった。前編)Tweet広告を非表示にする関連記事2018-03-22【AWS】1章シンプルに始める~サーバーレスシングルページアプリケーション(OREILLY本)まとめ...ちょっと前に掲題の本を買いました。DBに対して外部から任意の操...2017-02-07【Wordpress】テストから本番に移行するまずはWordpressの基本動作をおさらい。»プロフィールid:hiromode某PR会社勤務。2015年からフロントエンド従事。自分でサービスを作り流行らせるのが目標。主なスキルはHTML,CSS,JavaScript(Vue.js、jQuery),インフラ(AWS、VPS)、CakePHP、Gitなど。備忘録アイデアのつくり方を読んだメモAWSからのメールが迷惑メールになるときWordpress+S3+Cloudfrontで実現する、冗長構成対応の画像配信とメディアアップロードしてS3保存Wordpress等のサイトが500エラーで突然見れなくなった時に疑うメモリ不足とSwap領域について月別アーカイブはてなブログをはじめよう!hiromodeさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。