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

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

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

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

PHP

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

CodeIgniter

CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

Q&A

解決済

2回答

1403閲覧

CodeIgniter View内でのincludeのセキュリティリスク

frodo821

総合スコア322

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

PHP

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

CodeIgniter

CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

0グッド

1クリップ

投稿2018/12/14 12:45

編集2018/12/14 12:48

CodeIgniterでViewの共通部分をgeneral_view.phpとして定義しました。そしてgeneral_view.phpの中で、ほかのViewを呼ぶためにincludeを使っています。

php

1<!doctype html> 2<html> 3 <head> 4 <!-- 省略 --> 5 </head> 6 <body> 7 <main> 8 <!-- ほかのViewを読み込み --> 9 <?php include __DIR__.$view.'.php'; ?> 10 </main> 11 </body> 12</html>

$view変数の中身には、例えばURLをhttp://hogehoge.com/viewとするとviewが入ってきます。このコードに関して2点質問がございます。

  1. このようなやり方ではディレクトリトラバーサルなどのセキュリティリスクを発生させてしまうのでしょうか?
  2. これが誤ったやり方である(脆弱性になりうる)ならどのようにしてViewの部分的な共通化を行えばよいのでしょうか。それとも、共通化を行う方法はないのでしょうか?

どなたかご教授いただければ幸いです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

CodeIgniter は非常にゆるいフレームワークなので、適当にコーディングしても動きますが、フレームワークの基本ぐらいは使ってあげると良いです。

本件だと、
チュートリアル
を一通り進めると、コントローラに追加する方法が記述されています。

他にもいくつか方法はありますが、セキュリティ的に気になる場合は大抵の場合フレームワーク側に用意があるのでドキュメントから探してみると良いです。

投稿2018/12/15 08:06

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

frodo821

2018/12/15 08:11

複数回ロードを行うと追記されて行くんですね。静的ページの回は読み飛ばしてしまっていました。 ありがとうございます。
guest

0

このようなやり方ではディレクトリトラバーサルなどのセキュリティリスクを発生させてしまうのでしょうか?

ディレクトリトラバーサルができるかというと微妙な気はします。まず、以下のようなリクエストをブラウザはそのまま受け付けません。

http://example.jp/../../../../evil

ブラウザにもよるでしょうが、実際には以下のURLにリクエストされます。

http://example.jp/evil

ブラウザを使わなければ、無理やりウェブサーバーに前記のリクエストを投げられますが、手元の環境で試すと、400 Bad Requestになりました。PHP等の処理は開始されないと思います。

ならば大丈夫かというと、気持ち悪いとは思いますね。URLパスの形でパラータを渡すことをPATH_INFOといいますが、PATH_INFOならエラーになるかもしれないが、クエリ文字列 (?view=../../../../etc/passwd) ならエラーにはならないので、さまざまなケースを考えると、そのような作り方は避けたほうがよいように思います。
ちなみに、include/requireにて不正なパス名を渡す攻撃は、ファイルインクルード攻撃といいます。

これが誤ったやり方である(脆弱性になりうる)ならどのようにしてViewの部分的な共通化を行えばよいのでしょうか。それとも、共通化を行う方法はないのでしょうか?

一番簡便な方法は、$viewが英数字のみで構成されていることを確認することです。しかし、これでまったく問題がないとは限らず、同じディレクトリ内に、includeで読まれるとまずいものが入っている場合も考える必要があります。

より安全な方法として、$viewとしてとり得る文字列を配列等に列挙して、その配列に含まれるかどうかをチェックする(ホワイトリスト検査)があります。
あるいは、名前のファイル名を渡さずに、1, 2, 3等の番号で渡し、プログラム内で実際のファイル名に置き換える方法がもっとも安全かと思います。

CodeIgniterでの望ましい作法は、私は知らないので上記はあくまで一般的なお話です。

投稿2018/12/15 07:26

ockeghem

総合スコア11701

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

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

frodo821

2018/12/15 07:57 編集

回答ありがとうございます。 今回の場合はクエリ文字列をコード内で受け取らず、ページのルーティングもmod_rewriteでhttp://hogehoge.com/piyo/をhttp://hogehoge.com/index.php/piyoに書き換えています(ルーティングにはクエリ文字列を使用していません)。 なのでクエリ文字列から直接流し込まれる可能性については無いと考えてもらって構いません。 http://hogehoge.com/index.php?c=general&m=../../../../etc/passwdとしてもhttp://hogehoge.com/index.php/index.php?c=general&m=../../../../etc/passwdになるので404が返ります。 また、インクルードするファイルがあるディレクトリも分けてあるのでそれ以下に余計なファイルは存在しないです。 この状態で何か考えられる脆弱性はありますでしょうか。
ockeghem

2018/12/15 08:18

当方プロですので、ここまで具体的なケースについては費用を頂かないといけません。悪しからず
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問