CakePHPで会員制投稿サイトの類を作る際に、考えなくてはならないセキュリティに関しての質問です。
一般的にどの程度の対策を施せばよいのでしょうか?
現在の自分の理解は、
ログイン機能をAuthコンポーネントを用いると良い
(SQLインジェクションを防いでくれる?)
セキュリティコンポーネントを用いることでCSRFに対する対策ができる
htmlentitiesやhtmlspecialcharsでエスケープすることで、XSSを防げる
くらいなものです。
この理解で間違っていないのか、またセキュリティコンポーネントを使うと他にどのような攻撃を防げるのか、
そもそもどの程度の堅牢さなのか、(カスタムしなければスッカスカなのか)
などをお聞きしたいです。
セキュリティ対策は終わりのないことだと理解はしていますが、最低限ここまでやっておく、などのボーダーラインはどの程度なのでしょうか?
セキュリティ初心者なので、色々なご意見、回答をよろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答2件
0
ベストアンサー
Cakephpのどの機能が対応しているか簡単に記載します。不明な点については補足しますので聞いてください。なるべくどう対策されているか実験してみるといいと思います。
htmlentitiesやhtmlspecialcharsでエスケープすることで、XSSを防げる
基本的には、ビュー側のテンプレート等で変数を出力するときは、自分でエスケープする必要があります。
Cakephpではh()という関数が用意されているので、これを使えばいいと思います。
※なお、ヘルパーを使った場合、自動的にエスケープしてくれるものもあります。
セキュリティコンポーネントを用いることでCSRFに対する対策ができる
Cakephp3ではCSRFコンポーネントを有効にして、FormHelperを使うと自動的に対策してくれます。
Cakephp2以前はセキュリティコンポーネントの一部でしたが、独立しました。
ログイン機能をAuthコンポーネントを用いると良い
(SQLインジェクションを防いでくれる?)
ログインの部分だけを言えば、Authコンポーネントを使えば、自動的にユーザやパスワードが正しいかを確認するSQLを実行してくれるため、SQLインジェクションは防げます。それ以外のSQLについてはfindなどを使えば、パラメータをバインド変数で扱ってくれるので、防げます。ただし、自前のコードでSQLを文字列結合したりしてSQLを直接実行するような場合は防げません。マニュアル参照
セキュリティコンポーネントを使うと他にどのような攻撃を防げるのか、
セキュリティコンポーネントについてはマニュアルに詳細な記載があるのでこれをよく読むといい思います。特にフォーム改ざん防止は、利用者がフォームを改ざんして不正処理することを防いでくれるので、個人的にはとても便利だと思います。
ちなみに、自分は以下のようにすることが多いです。
- h()は、必要な箇所にはすべてやる
- なるべくヘルパーを使う
- CSRFコンポーネントとセキュリティコンポーネントは、原則すべてのフォームで有効にする
- フォームの入力値はバリデートする
- findなどのSQLインジェクションセーフな関数を使う
(追記) コメント欄の追加の説明をここに記載します
今使っているのはCakephp2.7.7なのですが、このバージョンでもフォームヘルパーを使えば自動でCSRF対策は行われるのでしょうか?
Cakephp2のCSRF対策は、Securityコンポーネントの一部なので、このコンポーネントを有効にすれば対策されます。出力されたHTMLの<form>内にtokenが追加されるので見てみたり、値を変更してpostしてみるといいと思います。
第二に、マニュアルを読んだのですが、フォーム改ざん防止のところに
•フォームに新規フィールドを追加することはできません。
•フォームからフィールドを削除することはできません。
•hidden フィールドの値を更新することはできません。
と記載されていますが、ラジオボタン、セレクトボックスなどは使うことができるのでしょうか?
(テキストしかダメということではないですよね?)
基本的にはFormヘルパーで出力したフィールドは大丈夫ですが、javascriptなどで動的にフィールドを追加するような処理があるなら改ざんをみなされてしまいます。そういう場合は、FormヘルパーのunlockFieldで定義しておけば回避できます。hiddenの更新もこれを使えばできるようになります。
htmlの書き方ではだめで、echo $form->createのようにフォームヘルパーを使わないとダメという認識でよろしいのでしょうか?
はい、基本的にformの出力は全部Fromヘルパーを使う必要があります。
また、mysqlからデータを取り出してくるのは、自分の場合はすべてfindでやっているので、既にSQLインジェクションの対策は施してあると捉えていいんですよね?
はい、いいと思います。試しにパラメータをもらうfindがあるなら、シングルコーテーションなどエスケープしないとエラーがでる文字を渡してみるとわかると思いますよ。
もしかしたら確認するまでもない初心者がにじみ出てる疑問ですみません、不安なもので。
必ずご自身でテスト(不正な処理を実施)してみるといいと、理解も深まりますし、不安もなくなると思いますよ
投稿2016/12/01 21:34
編集2016/12/02 13:58総合スコア6586
0
多くの例が記載されているページです。
PHP開発エンジニア必読!最低限必要なセキュリティ対策
CakePHPとの関連は、Grep でもかければ、どの対策がどこに施されているかは自明でしょう。
投稿2016/12/01 15:54

退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2016/12/02 15:51 編集
2016/12/02 22:20

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/02 10:41
2016/12/02 13:58
2016/12/02 14:26