10文字を表示しています。関数で取得することができます。変更されていることが確認できます。カウンタは1つずつ増えていきます。セッションクッキーが設定されているかどうかを判定しています。関数は、現在のセッション名を取得または設定する関数です。セッションの名前を持つクッキーに保存されています。"初回のアクセスです。設定によりセッションの動作が変わります。マニュアルにいろいろなオプションが記載されています。生成するハッシュ関数を指定します。bits)で、こちらの方がビット数が多いので、その分だけ安全と言えます。session.save_pathセッションファイルを保存するディレクトリを指定します。共有サーバーでは、他人がアクセスできないディレクトリを指定するようにします。関数を引数なしで実行しても確認できます。よりセッション管理を行うかどうかを指定します。(有効)に指定します。使用することを指定します。埋め込む攻撃を防ぐことができます。付加をするかどうかを指定します。漏洩する危険性が高まります。攻撃への対策等を講じる必要があります。セッションハイジャック他人のセッションIDがわかれば、そのセッションを乗っ取ることができ、そのような攻撃をセッションハイジャックと言い、非常に危険な攻撃です。値)がわかれば、セッションハイジャックが可能です。知るには、いろいろな方法があるので以下のような対策を行う必要があります。漏洩する危険性が高まります。よるセッション管理を禁止して、クッキーのみでセッション管理を行うようにすることができます。付加されてしまうので危険性が高まります。有効にしないようにします。よりクッキー情報が盗まれてセッションハイジャックされる可能性があります。対策を確実に行うようにします。属性を指定する方法も有効です。クッキーの操作ができなくなります)。MD5(128ビット)によるハッシュ値なので、簡単には推測することは難しいです。生成する場合は、推測が難しい値を生成する必要があり注意が必要です。SHA1(160ビット)のハッシュ値に変更できるので、こちらの方がより安全になります。指定もできるようです。セッション名はセッションクッキーのキーとして保存されるので、デフォルトの「PHPSESSID」のままだとセッションクッキーだと特定されてしまいます。以下のようにセッション名を変更するのも対策になると思います。セッション名は英数字のみで構成されている必要があり、少なくとも英字が1文字含まれている必要があります。指定する攻撃を「セッション固定化攻撃」と言います。よるセッションの管理を禁止することです。以下のように設定します。変更セッションが開始されるページや、ログイン直後、また一定時間が経過するたびに、session_regenerate_id()関数を使ってセッションIDを変更することは、セッションハイジャック全般に対する有効な対策になります。指定するようにします。漏洩セッションファイル名は「sess_l8clhs9sv7a682dos0637qu0g1」のように「sess_」+「セッションID」により構成されています。以下のように設定できるので、共有サーバーでは、他人がアクセスできないディレクトリを指定します。何らかの方法でユーザーにリクエストを送信させることにより、正当なユーザーに意図しない処理を実行させる攻撃方法をCSRF攻撃(クロスサイトスクリプティングフォージェリー)と言います。(IPA)リクエスト強要(CSRF)対策」からの引用です。Forgery)とは、別のサイトに用意したコンテンツ上の罠のリンクを踏ませること等をきっかけとして、インターネットショッピングの最終決済や退会等Webアプリケーションの重要な処理を呼び出すようユーザを誘導する攻撃である。Webサーバ宛に送出されるという性質を、この攻撃は悪用する。Webアプリケーションである。Webアプリケーションである。Webアプリケーションは、ユーザの意図に反してリクエストが送出されたことを検証できない。具体的には次のようなWebアプリケーションが対象となる。Webサーバに罠のリンクが用意される。ユーザがその罠を踏んで、攻撃手段が仕込まれる。Cookieをはじめとする認証データ、識別データは、HTTPリクエストの対象コンテンツ(「目的地」)が正規のものでありさえすれば、Webアプリケーションが用意したものでない偽のフォームやハイパーリンク(「偽の出発地」)から発せられたものであっても送出される。WebセッションIDを搭載し、サーバがそのIDを見て個々のブラウザを識別している。Webアプリケーションは、HTTPリクエストに伴って送られてきたCookieに正規のセッションIDが入っていさえすれば、そのリクエストが受け入れて、ユーザ本人の意志に反した処理を行ってしまうおそれがある。ユーザがログイン中に攻撃されると、ログイン後にしか操作しないような重要なトランザクションを送ってしまうことになる。この攻撃の構図は、ユーザがログインしていることを要さない画面のフォームについても成立しうる。Webアプリケーションが受け付けないようにすることである。そのためには、代金決済やコミュニティ脱退等の重要な処理の場面において、秘密の「照合情報」をWebアプリケーションとブラウザの間でやりとりし、第三者が用意した偽のコンテンツから発せられたリクエストを区別できるようにする。hiddenフィールドとして埋め込み送信し、フォームデータを処理するプログラムによってそのランダム値がフォームデータ内に含まれていることを確認する。そのランダム値がフォ-ムデータに含まれていない場合、処理を見合わせるようにする。対策の1つが「トークン方式」で、セッションの開始時やログイン時にトークン(ランダムな文字列)を発行し、そのトークンが一致する場合にのみ処理を実行します。処理ページの直前のページ(入力ページ等)に以下のようなコードを記述してトークンを発行します。固定トークン方式では、セッション中にトークンの値が変わりません。セットされてない場合は、セッション変数にトークンを代入します。関数は、マイクロ秒単位の現在時刻に基づいた一意な文字列を返します。関数で乱数を取得しています。)パラメータ$prefix(string):返される文字列の先頭に付加される接頭辞を指定します。$more_entropy(bool):返される文字列の後に別のランダムな文字列を追加するかどうかを真偽値で指定します。指定すると、別のランダムな文字列が追加されます。一意な識別子を文字列で返します。関数は、乱数値を生成する関数です。間の擬似乱数値を返します。ハッシュ値を返します。関数で生成した文字列をパラメータに指定して、そのハッシュ値を取得してセッション変数に代入しています。等)を使って計算した値です。40文字の16進数で返します。type="hidden")を設定します。された隠しフィールドの値が、サーバーに保存されている値と一致するかを調べて、一致した場合のみ処理を実行するようにします。die('不正なアクセスです。die('不正なアクセスです。された場合、これらの変数はセットされているはずです。即座に処理を中止します。即座に処理を中止します。された場合はトークンがセッションに保存されていません。このような実装を行えば、トークンの値がわからない限り安全です。処理ページの直前のページでパスワード入力を要求して、処理ページではパスワードが正しい場合のみ処理をするという方法もあります。対策は無効化されてしまう可能性があります。サンプル以下は、メールアドレスを登録するサンプルです。対策が目的なので、登録などの処理は省略してあります。以下が使用するファイルです。session_csrf1.php(入力ページ)session_csrf2.php(確認ページ)session_csrf3.php(完了ページ)session_validation.php(検証やエスケープ処理の関数を記述したファイル)以下は入力ページです。セットされていないので「null」で初期化します。19~22行目:CSRF対策の固定トークンを発行します。トークンの値を代入しています。この値をフォームの隠しフィールド(39行目)に挿入します。checkInput($_POST);}//セッション変数に値が代入されていればその値を。/></form></body></html>以下は、確認ページです。14~21行目:固定トークンを確認しています。29行目:エラーメッセージを格納する配列を初期化しています。この例ではメールアドレスの登録だけなので、配列にする必要はありませんが、複数の項目を検証する場合を考えて配列にしています。31~38行目:POSTされたデータの内容を検証しています。52行目から:エラーがある場合は、エラーのメッセージを表示し、入力ページへ戻るボタンを表示します。フォームの隠しフィールドにはトークンの値を入れておきます。エラーがない場合は、確認のためのメールアドレスを表示し、登録画面へのボタンと、入力画面に戻るボタンを表示し、隠しフィールドにはトークンの値を入れておきます。die('不正な入力です。die('不正な入力です。'*メールアドレスは必須です。'*メールアドレスの形式が正しくありません。アドレスを登録します。</body></html>以下は、完了ページです。このページでは、本来ならメールアドレスを登録する処理やメールを送信する処理を行い、その結果により表示する内容を変更しますが、このサンプルではそれらの処理は省略しています。15~22行目:トークンを確認しています。31~39行目:メールアドレスを登録する処理が成功した場合、セッションを破棄します。41行目:メールアドレスを登録する処理が失敗した場合の処理を記述します(省略)。die('不正な入力です。die('不正な入力です。'<p>ありがとうございます。以下のアドレスの登録が完了いたしました。href="session_csrf1.php">入力画面へ戻る</a></p></body></html>以下は、検証やエスケープ処理の関数を記述したファイルです。die('不正な入力です。die('不正な入力です。die('不正な入力です。制御文字は使用できません。以下は、セッションを使ったコンタクトフォームのサンプルです。contact1.phpサンプルでは、実際にはメールは送信されません。完了ページ」の順で遷移します。ページデザイン入力ページユーザーが「名前」「e-mail」「件名」「問い合わせ内容」を入力するページです。スパム防止のために、画像認証機能(Securimage)も付けます。確認ページ入力された値を確認・検証して、不備がある場合は、エラーを表示して再度入力フォームを表示します。入力された値に問題がなければ、入力された値をユーザーに確認してもらい、間違いがなければ送信ボタンをクリックして送信してもらいます。完了ページ問い合わせの受付が完了したことを知らせるページで、入力されたデータをメールで送信し、問題がなければ送信完了のメッセージを表示します。デザインとプログラムの分離デザイン(HTML)とプログラム(PHP)が混在している場合、プログラムが長くなってくるとそれぞれの内容がわかりづらくなってきてしまいます。プログラムを別々のファイルに分けて管理するようにします。文を使うことで簡単にできます。HTML(テンプレート)を読み込むようにします。Webブラウザ(外部)からアクセスできない領域に配置します。all)するように設定します。以下はこのサンプルでのフォルダ構成です。ここでは、わかりやすいように「contact」フォルダ内に全てのファイルを配置します。「libs」フォルダ内に「templates」フォルダを作成し、テンプレートファイルを配置します。「libs」フォルダには、「.htaccess」「functions.php」を配置します。このサンプルでは、上記のフォルダ構成にしているので、「libs」フォルダは外部からアクセスできないように、以下の内容の「.htaccess」を配置します。contact3.phpへcontact3.phpPOSTされたデータをチェック、固定トークンを確認し、メール送信で使用する変数にセッション変数の値を代入してメールを送信。渡して完了画面を表示。以下はプログラムから、テンプレートを表示する関数です。された値などを配列に格納しているので、それらを配列のキーを変数名とする変数に代入して渡すようにしています。その際に変数の値を全てエスケープ処理します。構文を使い、配列「$data」の全ての要素をループ処理します。その際、可変変数を使ってキーの値($key)を変数名としています。関数は、別途定義してあるエスケープ処理の関数で、値をエスケープ処理します。値が変数として展開されます。文は以下のようになっています。“マジック”定数の1つで、実行中のファイルが絶対パスで定義されます。テンプレートファイルへの絶対パスになります。die('不正な入力です。die('不正な入力です。die('不正な入力です。制御文字は使用できません。サイトからダウンロードして解凍し、適当な場所に「securimage」というフォルダを作成してそこに配置します。このサンプルでは、「contact」フォルダ内に配置します。Securimage(カスタマイズ)画像と表示された画像を再表示するリンクを表示するには、以下のコードをフォームの表示したい位置に記述します。要素を適当な位置に記述します。編集することで、大きさや色などのカスタマイズが可能です。画像の大きさ、ひずみ具合、表示される線の数を以下のように指定しています。Securimage(カスタマイズ)に記載されています。読み込みと生成は以下のように記述します。このサンプルでは「contact2.php」に記述します。Securimage();キーワードが正しいかを判定するには、以下のように記述します。'*画像認証の確認キーワードが誤っています。唯一ユーザーが直接コンタクトフォームにアクセスできるページになります。アクセスできないように設定されているか、外部からアクセスできない場所に保存されています。アクセスしてトークンを発行されていないと直接アクセスしてもエラーになります。この処理は、ユーザーの初回アクセス時、フォーム送信後エラーがあって再度表示される時、フォーム送信後エラーがなく確認ページで「入力画面へ戻る」をクリックした時に行われます。以下のようになります。session_start()関数は、必ず、Webブラウザへの出力が行われる前に、呼び出す必要があります。変更します(セッションハイジャック対策)。第1パラメータには必ず「TRUE」を指定します。関数が記述されているファイル(functions.php)を読み込みます。テンプレート(contact1_view.php)に渡す配列です。最初に初期化しておきます。15~18行目:テンプレート(contact1_view.php)を表示する際、初回アクセス時は入力データがないのでこの初期化をしないとエラーとなってしまいます。変数には値が入っています。変数にはまだ何も入っていません。対策の固定トークンを生成しています。渡され、その後隠しフィールドに挿入します。//配列を初期化//初回以外ですでにセッション変数に値が代入されていれば、その値を。ユーザーがコンタクトフォームにアクセスした際に表示されるページです。$data)によりこのページが表示され、その際にエラーメッセージを表示するための部分です。27行目~56行目:ユーザーに入力してもらうフォームです。44行目~49行目:画像認証(Securimage)の部分です。する、隠しフィールドです。表示されているキーワードを半角英数字でご記入ください。へ」のボタンをクリックすると以下の処理が行われます。セッションを開始します。インスタンスを生成して画像認証が利用できるようにします。13~21行目:固定トークンを確認(CSRF対策)。両方の値がセットされているかを確認して、されていなければ処理を中止します。されたトークンの値とセッションに保存されているトークンの値を比較して、値が一致しなければ処理を中止します。24~29行目:POSTされたデータを変数に格納しています。前後にあるホワイトスペースを削除して整形し、再び変数に代入しています。40行目:この後の値の検証で発生するエラーを格納するための配列を初期化します。42~77行目:入力された値が空でないか、形式があっているか、文字数が制限範囲内かなどを全ての値に対して検証しています。詳細は「フォームの検証」を参照ください。値が正しいかを検証しています。80~88行目:値を検証してエラーがあった場合の処理です。渡して入力ページを表示します。された値をそれぞれのフィールドに表示します。89~103行目:値を検証してエラーがない場合の処理です。された値をセッション変数に代入し、セッション変数を使えるようにします。渡して確認ページを表示します。die('不正アクセスの疑いがあります。die('不正アクセスの疑いがあります。'*お名前は必須項目です。'*お名前は30文字以内でお願いします。'*メールアドレスは必須です。'*メールアドレスの形式が正しくありません。'*件名は必須項目です。'*件名は100文字以内でお願いします。'*内容は必須項目です。'*内容は500文字以内でお願いします。'*画像認証の確認キーワードは6文字で入力してください。'*画像認証の確認キーワードが誤っています。値などが検証されて問題がない場合に、このページは表示されます。使って入力された値を表示して、ユーザーに確認してもらいます。関数ですでにエスケープ処理されているので、出力の際のエスケープ処理は不要です。27~29行目:入力ページへ戻るためのフォームです。する必要はありません。