それぞれ実施するかはサイトの特性にあわせるとして、PHPでサイト作成する場合のセキュリテイ対策の備忘。
CakePHPについては、2.xの情報なのでご注意ください。
CORS(Cross-Origin Resource Sharing)対策
- 対策方法:Access-Control-Allow-Originヘッダの出力
- 設定方法:nginxのconfに記述。制限できるなら対応ドメインを指定。ドメインの複数指定は単純に2つ記述ではないので注意。
nginxの該当ドメインの設定ファイルで
add_header Access-Control-Allow-Origin http://hogehoge.com;
意図しないサイトからiframeのソースとして使われないための対策
- 対策方法: X-Frame-Optionsヘッダの出力
- 設定方法:nginxのconfに記述。同サイトは許可であれば、SAMEORIGIN。
nginxの該当ドメインの設定ファイルで
add_header X-Frame-Options SAMEORIGIN;
CSRF(Cross-Site Request Forgery)対策
- 対策方法:CakePHPのSecurityコンポーネント利用が便利
- 設定方法:フォームを利用するコントローラでSecurityコンポーネントを利用設定。ビューではフォームをFormヘルパのcreate/endメソッドで開始/終了する
コントローラ
class HogeController extends AppController {
:
public $components = array('Security');
:
}ビュー
Form->create('hoge', array('type' => 'post')); ?>:
Form->end(); ?>上記後、formタグのすぐ後にdata[_Token][key]が自動挿入されていれば成功。
SQLインジェクション
- 対策方法:CakePHPのModelを利用する際に、find/save等のデータアクセスメソッドを利用する。色々な理由でqueryメソッドを利用する場合は、個別でエスケープする。CakePHP2.xまではSanitizeクラスが使えるが、3.xでは削除予定らしいので注意。
クロスサイトスクリプティング(cross site scripting)
- 対策方法:基本的にデータを出力する際はh()で括る。フォームの場合は、$this->Form->inputで項目を出力する。
Cookieのsecure 属性
- 対策方法:サーバ全体がHTTPSというポリシーであれば、php.iniのsession.cookie_secureを1に。個々のアプリケーションで設定する場合は、CakePHPのコントローラのbeforeFilterで、$this->Cookie->secure = trueを指定。
- 備考:Apacheの場合は、.htaccessでも可能。ロードバランサー配下の場合、CakePHPでHTTPSプロトコルが判別できない場合がある。この場合はphp.iniで設定すると対応できることもある。