質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

2回答

16452閲覧

CakePHPのセキュリティ対策全般について

tacchan

総合スコア60

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

1クリップ

投稿2016/12/01 15:14

CakePHPで会員制投稿サイトの類を作る際に、考えなくてはならないセキュリティに関しての質問です。
一般的にどの程度の対策を施せばよいのでしょうか?

現在の自分の理解は、

ログイン機能をAuthコンポーネントを用いると良い
(SQLインジェクションを防いでくれる?)

セキュリティコンポーネントを用いることでCSRFに対する対策ができる

htmlentitiesやhtmlspecialcharsでエスケープすることで、XSSを防げる

くらいなものです。
この理解で間違っていないのか、またセキュリティコンポーネントを使うと他にどのような攻撃を防げるのか、
そもそもどの程度の堅牢さなのか、(カスタムしなければスッカスカなのか)
などをお聞きしたいです。

セキュリティ対策は終わりのないことだと理解はしていますが、最低限ここまでやっておく、などのボーダーラインはどの程度なのでしょうか?
セキュリティ初心者なので、色々なご意見、回答をよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
popobot

総合スコア6586

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tacchan

2016/12/02 10:41

とても丁寧な説明ありがとうございます。 イメージとしては、基本的なことを残さずやればよい、という印象を受けました。 ただ、疑問点が数か所あるのですが。 今使っているのはCakephp2.7.7なのですが、このバージョンでもフォームヘルパーを使えば自動でCSRF対策は行われるのでしょうか? 第二に、マニュアルを読んだのですが、フォーム改ざん防止のところに •フォームに新規フィールドを追加することはできません。 •フォームからフィールドを削除することはできません。 •hidden フィールドの値を更新することはできません。 と記載されていますが、ラジオボタン、セレクトボックスなどは使うことができるのでしょうか? (テキストしかダメということではないですよね?) htmlの書き方ではだめで、echo $form->createのようにフォームヘルパーを使わないとダメという認識でよろしいのでしょうか? また、mysqlからデータを取り出してくるのは、自分の場合はすべてfindでやっているので、既にSQLインジェクションの対策は施してあると捉えていいんですよね? もしかしたら確認するまでもない初心者がにじみ出てる疑問ですみません、不安なもので。
popobot

2016/12/02 13:58

回答欄に追記しました!
tacchan

2016/12/02 14:26

新たな疑問に対しての回答、ありがとうございます。 一つ一つ丁寧に説明があり、とても安心できました。 これから実際に使っていきたいと思います。 その際に、躓いたときにはまたこちらに質問させてもらいますので、 もし見つけてお時間がありましたらご教授してくださると大変勉強になります。 今回はどうもありがとうございました。
guest

0

多くの例が記載されているページです。
PHP開発エンジニア必読!最低限必要なセキュリティ対策

CakePHPとの関連は、Grep でもかければ、どの対策がどこに施されているかは自明でしょう。

投稿2016/12/01 15:54

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

popobot

2016/12/01 20:45

grepをかければ本当にわかりますか?
退会済みユーザー

退会済みユーザー

2016/12/02 15:51 編集

自分の場合、人に聞くより、自分の目で確かめて、実際に動かして検証しますし、そうしています。その方が確実に理解できますから。 技術者の態度としても、「最低限〜」というのは、自身の成長を妨げる気がするので、そのような考え方はできるだけしないようにというのを心がける。とくにセキュリティに関しては、自分の生み出したプロダクトに関しては責任がありますから、プログラムだけの知識だけじゃなく、当然インフラの知識も必要になるわけだし、フレームワークを利用するにしても、フレームワークのコアな部分でどんな処理が走っているのかとかわかっていないと怖くて使えません。 > grepをかければ本当にわかりますか? わかるかどうか、やってみることがまず第一歩だと思います。
popobot

2016/12/02 22:20

コメントありがとうございます。 回答した意図はわかりましたので、評価は戻させていただきました。失礼しました。
tacchan

2016/12/03 10:23

とてもぶっきらぼうな回答ありがとうございます。 素晴らしいご考えの持ち主のようですね。頭が下がる思いです。 人に聞くより自分で確かめて検証する、という主張は一見正しいように聞こえます。 いや、実際正しいのでしょう。 しかし、このサイトを利用していくに当たって、あなたの主張が100%正しいものになると、「これを聞いたら馬鹿にされるかな」、「曖昧な表現しかできないけどこれを聞いたらダメなのかな」、という躊躇が蔓延してしまい衰退の一途を辿る可能性も考えられます。 流石にそんなことは起きないって? そうかもしれませんね。しかし、初心者が聞きづらくなる環境になるのは否めないでしょう。 また話は変わりますが、 >技術者の態度としても、「最低限〜」というのは、自身の成長を妨げる気がするので ……わかっていますよ。 だから「セキュリティ対策は終わりのないことだと理解はしていますが」と前置きを書いたのですが、あなたの目には映りませんでしたか? 出来ることなら、国が運営するサイトのレベルのセキュリティを実装したいものです。 でも、それをここで質問して一体どれほどの人間が回答してくれるでしょうか? あ、一人いましたね。Kosuke_Shibuyaという向上心の塊のような意識高い系のユーザーが。 ありがたいことです。 小学一年生が、テンソル解析の研究をしたい、といっていきなり、集合、コンパクトから教える人がどこにいますか? 足し算、引き算から教えていくでしょう。 それと同じことです。 ガイドラインを聞きたかったのです。しかも、本などではなく生の声として。 あなたの回答を読むと、まるで少女漫画のS系彼氏みたいですね。 壁ドンからの 「いいから俺の後ついて来いよ」 みたいな。これでキャーキャーわめくのは10代女子だけですよ。 なんとなく、テラテイルのバッジ集めを趣味にしてイキがっているおじさんという印象を受けます。 これ以上書いてもただの水掛け論になってしまいますし、あまり荒らすのもよくないので止めておきましょう。 世の中には色々な人がいます。ですが、自分のレベルが高いからと言って鼻で笑う、もしくは態度がなっていないとツンツン指摘するような態度は止めたいものです。 どのレベル、どの立場の人でも、その人自身にとっては精一杯頑張っている、悩んでいるという前提の下で交流したいものですね。 (私自身、あなたが引用したサイトのページはここに投稿する前に拝見してました) この後、あなたも言い分はあると思いますが、私はこれで終わらせていただきます。 また、私とKosuke_Shibuyaさんの相性が良くないと思われるので、これ以降、私の質問への回答はご遠慮していただきたく思います。 最後に、コメント欄にこのようなことを書き込んでしまい、テラテイルの運営の皆様、申し訳ありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問