PHPのセキュリティに関してニコ生で勉強してた内容。
■PHPセキュリティ
register_globals:GETやPOSTで送信された変数をグローバル変数として使用出来る。超危険。初期ではOffになっている。(php.ini)
対処方法→register_globalsをOffにする。
■フォームに入力された値のチェック
入力チェック対策
1.データベース追加スクリプト(サーバ)でもエラーチェックを行う。
2.データベースのテーブル定義にて、未入力不可にする。(テーブル定義時にフィールドのNOT NULLおよびCHECKを指定しておく。)
3.フォームの入力チェック時には、自分で指定したパラメータ以外も来ることを想定しておく。→サーバサイドで適切な値チェックを行う。
■ファイル操作時の注意点
1.「../」等、カレントディレクトリを示す文字列は適切に変換する必要がある。[string str_replace(‘../’, ”, 文字列)] or [bool preg_match(‘\.\./’, 文字列)]
{クロスサイトスクリプティング:ユーザからの入力を動的に反映するWebサイトで発生するセキュリティ上の問題。複数のサイトにまたがって実行される}
■クロスサイトスクリプティング対策
1.「’」や「”」などのスクリプトを実行できてしまう文字を使えるようにしない。
2.htmlspecialcharsや、htmlentitiesを使用して文字をエスケープする。[htmlspecialchars(文字列, flags定数, 文字エンコード)][htmlentitiesでも同様。ただ、HTMLエンティティと等価な意味を有する文字をHTMLエンティティに変換する⇔html_entity_decode()]
・対策をする時
1.データ入力時(ファイル等に直接データ追加,メール経由等でデータ追加等)
2.データ出力時(ファイルに出力時,メール送信時)
補足
<a href=”~”>等に変数を出力する場合はhtmlspecialcharsでは対応出来ないので正規表現等を使う必要がある。(変数にjavascriptが含まれていないか等)
・何故対応出来ない?
URL内に「javascript:」と記述されると実行できてしまうから。(よくある例:javascript: void(0);)グローバル空間にメソッド定義してしまうとそれも呼ぶことができてしまう。
■クエリストリングの考慮
クエリストリング:Webページを呼び出すURLの中のパラメータの部分を指す。(URLの?以降のこと)
1.リダイレクトをする時にはSESSIONを用いるわけでもなく、、、その時に応じて臨機応変に対応(出来るだけリソースは少ない形で)
■複数画面間のパラメータの引渡し
1.inputタグのhidden属性利用は避けれるなら避ける。
2.hidden属性を利用するのであれば、その先のスクリプトでもバリデーションをかける。(アンケートフォーム等)
■ソースコードの流出(インクルードファイルの流出)
「*.inc」等のファイルにアクセスすると、ソースがそのまま表示される可能性がある。
・対策
1.「*.inc」というインクルードファイルの名前の付け方はしないようにする。(「*.inc.php」等が良いはず)
2.拡張子「.inc」もphpとして処理する。(httpd.conf等で、AddType application/x-httpd-php .php .incの様な指定をする)
3.ブラウザからアクセス出来ない場所に置く
補足
・「.htaccess」設定が出来ない時
httpd.conf内の
■セッション管理の注意点
1.URL埋め込みのセッションIDは携帯のみにする。というか携帯でも埋め込みたくない。理由は、REFERERで外部から取得ができてしまうからである。
2.トークンを発行して管理するとなお良い。
■クッキーの改ざん
Cookie:サーバとクライアントのブラウザ間でやりとりされる情報の1つ。自分で内容を改変するのが簡単である。
クッキーの保存時間はしっかりと指定を行う。ECサイト等で管理する場合は、値段は入れておいても良いが、情報の確認は不可欠である。
とりあえず、Cookieを使うなら一度改変して、おかしくならないかテストをした方が良い。
参考文献:九天社「PHP実践のツボ セキュアプログラミング編」
コメント