• ベストアンサー

WordPressの質問(q10197680)の続

DOM-based XSS に関するコードについて考えているのですが、関数の「巻き上げ」が可読性と保守性を損なうようで funcion について修正すべきか考えております。 関数宣言を関数式にして const 変数に代入する方法で修正してみたのですが問題はなさそうでしょうか? 57、62、109、212行目を変更いたしました。 ※関数宣言での巻き上げについて https://qiita.com/kerupani129/items/b2c3619856b048c13394 ※DOM-based XSSのシンクとして働く機能 https://gihyo.jp/dev/serial/01/javascript-security/0006 ※以前アドバイス頂いたコード ※元のコード function lengthCheck() { const left = this.dataset.maxlength - this.value.length; if (left >= 0) { this.nextElementSibling.innerHTML = 'あと<strong>' + left + '</strong>文字'; this.dataset.submit_disabled = this.value.length === 0; } else { this.nextElementSibling.innerHTML = '<strong>' + -left + '</strong>文字超過しています'; this.dataset.submit_disabled = true; } ↓ ※エスケープ処理 function escapeHTML(値) { _ var a = document.createElement('span'); _ a.textContent = 値; _ return a.innerHTML; } 要素.innerHTML = '<strong>' + escapeHTML(文字列) + '</strong>'; ※最新コード https://wandbox.org/permlink/ozofFRK7rkjCXV76

質問者が選んだベストアンサー

  • ベストアンサー
  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.19

・マルチバイト対応をどこまで実装すべきでしょうか? 空白や改行を消したい理由がわかりませんが、必要なのでしょうか。 どちらも、連続する場合はひとつにするとかでいいと思います。

php_learn
質問者

お礼

質問の期限が切れておりました、申し訳ありません。 続きの質問を立てさせていただきました。アドバイスよろしくお願い致します。 https://okwave.jp/qa/q10217484.html

php_learn
質問者

補足

回答ありがとうございます。 サイトを探して連続した改行コード・改行文字を取り除く方法を見つけたのですが、難しく理解できませんでした… 空白や改行を1行ずつにするにはどう書けばよいか分かりますでしょうか? ※正規表現を使い、連続した改行コード・改行文字を取り除く https://www.system-ido.com/risouken/index.php?page=tech&num=13 ※trimについて https://www.php.net/manual/ja/function.trim.php ※js 3連続以上の改行を2行の改行に変換する https://qiita.com/70ki8suda/items/42bd22376a90fc3d1c8e ※【PHP】文字列にある「改行」を削除する方法 https://renoji.com/IT.php?Contents=Program_PHP/String_Delete_LineBreak.html ※最新コード https://wandbox.org/permlink/tqhQfXgXIiiKhsOC

その他の回答 (18)

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.18

・ログイン機能を使い送信を行わない場合は必要ないのでしょうか? 質問をうまく理解できません。 ログイン機能は使うけどフォーム送信はしない、と言うことでしょうか。 CSRF対策するかしないかの話しだと思いますが、ログインするのであれば、何かしらの送信はするとおもうので対策は必要だと思います。 ログイン機能がないのであれば必要ないと思います。

php_learn
質問者

補足

Q.ログイン機能がないのであれば必要ないと思います。 A.回答ありがとうございます、ログイン機能を使わない場合でも必要なのかと思いお聞きいたしました。 実装せずに進めていきます。 安全なウェブサイトの作り方 - 1.7 HTTPヘッダ・インジェクションについてアドバイスお願い致します。 HTTPレスポンスヘッダを直接出力することはないので対策の必要はなさそうですが、改行コードは荒らし対策用に削除しておいた方が良いのではないかと思いました。 マルチバイト対応をどこまで実装すべきでしょうか? 改行可能にしたほうが見やすい場合も考えられるのですが、改行を複数行許してしまうと荒し行為に対応できないため心配です… セキュリティ上改行を許可しない方法と利用者のことを考えて改行を許可する方法どちらが良いと思われますでしょうか? ※安全なウェブサイトの作り方 - 1.7 HTTPヘッダ・インジェクション https://www.ipa.go.jp/security/vuln/websecurity/http-header.html ※【PHP】マルチバイト(全角スペース等)対応のtrim処理 https://qiita.com/fallout/items/a13cebb07015d421fde3 ※現在のコード(sin_functions.phpの53行目になります) https://wandbox.org/permlink/ZDXIlmfet72nwODv

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.17

実行はしていませんが、修正分のコードについてはいいと思います。 ・理解するのが難しかったのですが引数で渡す方法は function 宣言と関数式内の両方に同一の関数を書くという風に認識いたしました。 そうですね。 同じ変数名を書くといいと思います。 PHPにしても他の言語にしても引数の変数名は、関数の外と同じでなければならないわけではありません。 まったく違う変数名にすることも可能ですが、なんの変数なのかわからなくなるので、同じにしておくのが無難です。 もしまた、引数をやめてグローバルにする場合には、そのままの変数名で使える利点もあります。 ただ、同じにしない場合もあります。 例えば、ここ。 ---- function Chk_InputMode($str, $mes) ---- 引数は $str ですが、呼ぶ側は、 ---- CheckUrl($namae, '・お名前にURLは記入できません。', $error); // 追加 CheckUrl($message, '・お問い合わせ内容にURLは記入できません。', $error); // 追加 ---- $namae や $message のように用途の変数名なので、同じにすることはできません。 関数の機能によって、引数の変数名は同じものや違うものになります。 いずれにしても、わかりやすい名前にしておくと、関数内でどのような扱いをしているのかを見失いにくくなると思います。

php_learn
質問者

補足

Q.関数の機能によって、引数の変数名は同じものや違うものになります。 いずれにしても、わかりやすい名前にしておくと、関数内でどのような扱いをしているのかを見失いにくくなると思います。 A.説明ありがとうございます、理解することが出来ました。 関数の機能によって引数の変数名は変わるという事で覚えておきます。 安全なウェブサイトの作り方 - 1.6 CSRF について心配なため dell_ok さんにお聞きしておきたいのですが、ログイン機能を使い送信を行わない場合は必要ないのでしょうか? 以前ヤフー知恵袋でアドバイスを頂いた際に投稿フォームは攻撃の対象になると教えて頂きました。 非同期通信で CSRF 対策を PHP で行うことは可能なのでしょうか…? ※以前教えて頂いたアドバイス プログラムが独立していても、1本でリクエスト分岐していても、送信処理は必ず存在します。 hidden であれリクエストは必ず存在します。 最終リクエストには必ずトークンを埋め、処理前にかならず値を検証するようにしてください。 ※画面還移あり掲示板での CSRF 対策について https://okwave.jp/qa/q10165331.html ※sample.php に画面還移あり掲示板での CSRF 対策済み旧コードを書いております。 https://wandbox.org/permlink/04rbdXXUGzfT1SdE ※安全なウェブサイトの作り方 - 1.6 CSRF https://www.ipa.go.jp/security/vuln/websecurity/csrf.html

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.16

・真逆のブラックリスト方式で.と,と:と;を指定して該当するものをすべて書き込み禁止にすることで両方を防ぐコードが必要になりそうです。 英語での投稿があるとのことでピリオドは除外するような話しもあったような覚えがあるのですがどうでしたか。 ・それぞれ参考サイトを見ながらコードを書いてみたのですが、このような感じになるのでしょうか? そうですそうです。 そんな感じになります。 ・ URL 入力禁止追加後のコード こちらも global を使うのをやめてみてはいかがでしょうか。 ---- CheckUrl($namae, '・お名前にURLは記入できません。'); // 追加 CheckUrl($message, '・お問い合わせ内容にURLは記入できません。'); // 追加 function CheckUrl($checkurl, $mes) { global $errors; if (preg_match("/[\.,:;]/u", $checkurl)) { $errors[] = $mes; } } ---- global → 引数 CheckUrl($namae, '・お名前にURLは記入できません。', $error); // 追加 CheckUrl($message, '・お問い合わせ内容にURLは記入できません。', $error); // 追加 function CheckUrl($checkurl, $mes, $error) { if (preg_match("/[\.,:;]/u", $checkurl)) { $error[] = $mes; } } ----

php_learn
質問者

補足

Q.英語での投稿があるとのことでピリオドは除外するような話しもあったような覚えがあるのですがどうでしたか。 A.回答ありがとうございます。忘れておりました、申し訳ありません。 ピリオドは除外したほうがよさそうですね。 ※sample.php の121行目を修正いたしました。 https://wandbox.org/permlink/kd7qZ6ULowguDAgA Q.こちらも global を使うのをやめてみてはいかがでしょうか。 A.修正ありがとうございます、理解するのが難しかったのですが引数で渡す方法は function 宣言と関数式内の両方に同一の関数を書くという風に認識いたしました。 ※最新コード https://wandbox.org/permlink/DFPsiONiRtSw7jyx

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.15

・以前作成していたものでは質問ページとは別に質問一覧画面を表示する設計にしており、質問ごとに個別で URL を設定していた為同じように質問ごとに URL が発行されるものだと考えておりました。 なるほど、そのことでしたか。 そうですね、URLは確かに発行しています。 ただ、これは自サイトが発行しているものなので問題ありません。 同期非同期も関係ありません。 参考サイトに書かれているのは、「利用者から入力されたリンク先のURL」のようです。 私の記憶では、URLの入力は禁止する、だったと思いますので、そのコードを追加すればいいと思います。 ・要素を動的に生成するというのは HTML を非同期通信で書き換えるものとは別の意味になるのでしょうか? そうですね、別の意味かと思われます。 参考サイトに書かれているのは「<script>...</script> 要素の内容を動的に生成しない」です。 スクリプトではなく、単純なHTMLを動的に生成するのは問題ないと思います。 これも、同期非同期は関係ありません。 ・グローバル変数について理解が出来ていないのですが、変数を使いまわしする場合に必須ということではないのでしょうか? 「使いまわし」と表現するとあやふやになってしまうので控えます。 関数の外の変数を関数の中で使いたい場合にグローバル変数として定義します。 グローバル変数にしなくても、引数として渡すことで、関数の外の変数の値を関数の中で使うことができます。 はっきりとした理由を説明することはできませんが、私としては引数で渡すことをすすめます。 もちろんグローバル変数のメリットはありますが、必要最低限にとどめるべきだと私は思っています。

php_learn
質問者

お礼

申し訳ありません URL 入力禁止追加後のコードを載せ忘れておりました。 確認よろしくお願い致します。 https://wandbox.org/permlink/kMLceA9b6oXf6fZE

php_learn
質問者

補足

Q.そうですね、URLは確かに発行しています。 ただ、これは自サイトが発行しているものなので問題ありません。 A.アドバイスありがとうございます。 確かに「外部からの入力に依存する形で動的に生成される場合、そのURLにスクリプトが含まれていると」という条件が書かれておりました。 自サイトで発行する場合は問題なさそうです。 Q.参考サイトに書かれているのは、「利用者から入力されたリンク先のURL」のようです。 私の記憶では、URLの入力は禁止する、だったと思いますので、そのコードを追加すればいいと思います。 A.回答ありがとうございます、以前調べたものを見返してみると下記のように書いてありました。 入力にJavascriptが含まれる場合をpreg_matchでバリデーションしても、抜け道があり &#106;avascript:alert('crack')やdata:text/html;base64,PHNjcmlwdD5hbGVydCgnY3JhY2snKTwvc2NyaXB0Pg== をURL(プロトコル)として入力できるためチェックにはならず 参考サイトに書いてある通りホワイトリスト方式でhttp://以外のプロトコルを拒否することで該当しないJavascriptなど危険なURLはすべて防げそうです が、今回はhttp://も含めて書き込めないようにしたい為、真逆のブラックリスト方式で.と,と:と;を指定して該当するものをすべて書き込み禁止にすることで両方を防ぐコードが必要になりそうです。 ※参考サイト(ケース2. リンクにスクリプトを挿入する) https://qiita.com/tomochan154/items/a93c56536c78d1faff0f ※URLの入力について https://okwave.jp/qa/q10165331.html#answers_contents その際に dell_ok さんにアドバイス頂いたコードを sample.php に載せております。 sin_functions.php の20、21行目にコードを追加いたしました。 CheckUrl($namae, '・お名前にURLは記入できません。'); // 追加 CheckUrl($message, '・お問い合わせ内容にURLは記入できません。'); // 追加 sin_functions.php の69行目にコードを追加いたしました。 /* 以下追加 */ function CheckUrl($checkurl, $mes) { global $errors; if (preg_match("/[\.,:;]/u", $checkurl)) { $errors[] = $mes; } } Q.参考サイトに書かれているのは「<script>...</script> 要素の内容を動的に生成しない」です。 スクリプトではなく、単純なHTMLを動的に生成するのは問題ないと思います。 A.アドバイスありがとうございます。他のサイトを調べてみたところスクリプトを動的に生成する場合に問題があるようですね。 Q.関数の外の変数を関数の中で使いたい場合にグローバル変数として定義します。 グローバル変数にしなくても、引数として渡すことで、関数の外の変数の値を関数の中で使うことができます。 はっきりとした理由を説明することはできませんが、私としては引数で渡すことをすすめます。 A.説明ありがとうございます、理解することが出来ました。それぞれ参考サイトを見ながらコードを書いてみたのですが、このような感じになるのでしょうか? ※globalを宣言 https://blog.katty.in/91 ※引数を使って関数に値を渡す https://www.javadrive.jp/php/function/index3.html ※グローバル変数を定義する方法 $str = ‘Hello World!’; hello(); //↓関数の外の変数を関数の中で使う function hello() { global $str; echo $str; } ※引数で渡す方法 function hello($str) { echo $str; } //↑関数を定義して引数を使う hello('Hello World!');

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.14

・セッションID を予測困難なものにする必要はないと思われますでしょうか? 必要はないと思います。 と言うか、そもそもセッションIDを使っていません。 参考サイトに書かれているセッションID(*1)は、PHPで自動生成するセッションID(*2)とは違うもののような気がします。 ログインのないものにはセッションID(*1)はないので対策の必要もないと思います。 ・非同期通信で作成する際に質問ごとに URL が生成されるため そのような処理はないと思いますが、どこのことでしょうか。 ・Javascript の要素を動的に生成するのは危険だということでしょうか…? 参考サイトを見る限り危険なのでしょうね。 今のところ動的に生成していないと思いますので、大丈夫だと思います。 ・グローバル変数に頼らずに実装することは可能でしょうか? その前に、ここはfunctionの外に出してください。 ---- class MAX_LENGTH { public const NAME = 50; public const MESSAGE = 500; } ---- ここは不要です。 ---- $namae = Chk_InputMode($namae, '・お名前をご記入ください。'); $message = Chk_InputMode($message, '・お問い合わせ内容をご記入ください。'); ---- Chk_InputMode()は空かどうかの判定しかしていないので、以下のコードと重複します。 ---- if (empty($message)) { $error[] = 'コメントを入力してください'; } if (empty($namae)) { $error[] = '名前を入力してください'; } if (empty($stamp)) { $error[] = 'スタンプを選択してください'; } ---- でなければ、こちら側をなくしてChk_InputMode()を呼ぶようにするかです。 但し、その場合は引数に$errorを追加してください。後述。 そもそもグローバル変数にする必要はありません。 入力内容は$_POSTで受け取っています。 ---- $message = $_POST['message']; $namae = $_POST['namae']; $stamp = $_POST['stamp']; ---- この処理を書くとしたら、 ---- $namae = Chk_StrMode($namae); $message = Chk_StrMode($message); ---- この位置になります。 ---- $message = $_POST['message']; $namae = $_POST['namae']; $stamp = $_POST['stamp']; $namae = Chk_StrMode($namae); $message = Chk_StrMode($message); $error = []; if (empty($message)) { $error[] = 'コメントを入力してください'; } if (empty($namae)) { $error[] = '名前を入力してください'; } if (empty($stamp)) { $error[] = 'スタンプを選択してください'; } ---- 後述とした、Chk_InputMode()を呼ぶ方法ですが、こうなります。 左辺は書かないでください。 ---- Chk_InputMode($namae, '・お名前をご記入ください。', $error); Chk_InputMode($message, '・お問い合わせ内容をご記入ください。', $error); Chk_InputMode($message, '・スタンプを選択してください。', $error); ---- function Chk_InputMode($str, $mes, $error) { if ('' == $str) { $error[] = $mes; } } ----

php_learn
質問者

補足

Q.ログインのないものにはセッションID(*1)はないので対策の必要もないと思います。 A.アドバイスありがとうございます、そのまま使うように致します。 Q.非同期通信で作成する際に質問ごとに URL が生成されるため そのような処理はないと思いますが、どこのことでしょうか。 A.回答ありがとうございます。 質問一覧画面を以前作成したと思うのですが、非同期通信を行う場合変更が必要になってくるのでしょうか? 以前作成していたものでは質問ページとは別に質問一覧画面を表示する設計にしており、質問ごとに個別で URL を設定していた為同じように質問ごとに URL が発行されるものだと考えておりました。 ※画面還移ありの掲示板コード(single-que_list.php) https://wandbox.org/permlink/4lKVqjaUL2s2E02Z Q.Javascript の要素を動的に生成するのは危険だということでしょうか…? 今のところ動的に生成していないと思いますので、大丈夫だと思います。 A.回答ありがとうございます、要素を動的に生成するというのは HTML を非同期通信で書き換えるものとは別の意味になるのでしょうか? セキュリティ上問題ないのか心配しておりました… Q.グローバル変数に頼らずに実装することは可能でしょうか? 但し、その場合は引数に$errorを追加してください。 そもそもグローバル変数にする必要はありません。 入力内容は$_POSTで受け取っています。 A.修正ありがとうございます、グローバル変数について理解が出来ていないのですが、変数を使いまわしする場合に必須ということではないのでしょうか? $error を後文に追加する形になるのですね勉強になりました。 ---- $message = $_POST['message']; $namae = $_POST['namae']; $namae = Chk_StrMode($namae); $message = Chk_StrMode($message); ---- ※修正後のコード https://wandbox.org/permlink/4UWTxwDUzcrdTKPT

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.13

・bbs_quest_confirm() に何もせず終わる処理を加えたいのですが こんな感じになると思います。 ---- function bbs_quest_confirm() { session_start(); if (empty($_SESSION['message']) || empty($_SESSION['namae']) || empty($_SESSION['stamp'])) { exit; } global $wpdb; ---- コメントと名前とスタンプは必須なので、そのどれかひとつでもなかったら、と言う判定です。 アップロードファイルはあるかないかわからないので判定しません。

php_learn
質問者

補足

修正ありがとうございます。アップロードファイルがない時のことは考えておりませんでした。覚えておきます。 安全なウェブサイトの作り方 - 1.4 セッション管理の不備についてセッションID の悪用について dell_ok さんにお聞きしたいのですが、ログイン制サイトではなく個人情報の流出もない場合セッションID を予測困難なものにする必要はないと思われますでしょうか? ※参考サイト https://www.ipa.go.jp/security/vuln/websecurity/session-management.html 安全なウェブサイトの作り方 - 1.5 クロスサイト・スクリプティングについて対策を考えております。 複数分からない点があるのでアドバイスお願い致します。 画面還移ありの掲示板ではエスケープ処理のみしていたのですが、非同期通信で作成する際に質問ごとに URL が生成されるためそのコードにもエスケープ処理が必要になりそうです。 根本的解決の 5-(ii) URLを出力するときは、「http://」や 「https://」で始まるURLのみを許可する。という項目が気になったので調べてみたところ、参考サイト(なぜ出力時のHTMLエスケープを省略してはならないのか)に書いてあるように URLエンコード済みの値であってもHTMLエスケープは省略しないように書いてありました。 Javascript で発行された URL を PHP でエスケープする場合どのように書けばよいと思われますでしょうか? 安全なウェブサイトの作り方の5-(iii) <script>...</script> 要素の内容を動的に生成しない。という項目の意味が理解できないのですが、Javascript の要素を動的に生成するのは危険だということでしょうか…? ※安全なウェブサイトの作り方 - 1.5 クロスサイト・スクリプティング https://www.ipa.go.jp/security/vuln/websecurity/cross-site-scripting.html ※【根本的解決】<script>...</script> 要素の内容を動的に生成しない https://qiita.com/yuta-katayama-23/items/2c904de2bddbada97a5a ※なぜ出力時のHTMLエスケープを省略してはならないのか https://qiita.com/tadsan/items/50070788f4ef0dd8e8b5 エスケープ処理を現在のコードに追加するように考えてみたのですが、グローバル変数に頼らずに実装することは可能でしょうか? 以前アドバイスを頂いた際に極力使わずに実装したほうが良いとご指摘いただき気になっております。 ※追加コード ※sin_functions.phpの5行目に追加 global $errors; global $namae; global $message; session_start(); class MAX_LENGTH { public const NAME = 50; public const MESSAGE = 500; } $namae = Chk_StrMode($namae); $message = Chk_StrMode($message); $namae = Chk_InputMode($namae, '・お名前をご記入ください。'); $message = Chk_InputMode($message, '・お問い合わせ内容をご記入ください。'); ※sin_functions.phpの57行目に追加 function Chk_StrMode($str) { // タグを除去 $str = strip_tags($str); // 空白を除去 $str = mb_ereg_replace('^( ){0,}', '', $str); $str = mb_ereg_replace('( ){0,}$', '', $str); $str = trim($str); // 特殊文字を HTML エンティティに変換する $str = htmlspecialchars($str); return $str; } /* 未入力チェックファンクション */ function Chk_InputMode($str, $mes) { global $errors; if ('' == $str) { $errors[] = $mes; } } ※single-index.phpの13行目を変更 <div>名前<input data-maxlength="<?php echo MAX_LENGTH::NAME; ?>" type="text" name="namae" id="namae"></div> <div>コメント<textarea data-maxlength="<?php echo MAX_LENGTH::MESSAGE; ?>" name="message" id="message"></textarea></div> ※最新コード https://wandbox.org/permlink/KP8NhW8adujYiitp ※画面還移ありの掲示板コード https://wandbox.org/permlink/4lKVqjaUL2s2E02Z

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.12

・if なしで書く場合どうすれば良いでしょうか? こんなにいりません。 ---- //セッション変数の削除 unset($_SESSION['namae']); unset($_SESSION['message']); unset($_SESSION['stamp']); unset($_SESSION['attach']); //ファイルが存在するか確認 = ファイル保存が完了した時点 if (!(is_file($attach_path))) { //session_start(); $_SESSION = array(); session_destroy(); } ---- これだけです。 ---- $_SESSION = array(); session_destroy(); ----

php_learn
質問者

補足

回答ありがとうございます、セッション変数をすべて削除する場合2行だけで問題ないのですね…

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.11

・single-index.php の202行目に結果画面へ行く」信号が届いたか確認するコードを追加いたしました。 不要です。 「結果画面へ行く」処理は、215行目からやっています。 ---- const formData = new FormData(); formData.append("action", "bbs_quest_confirm"); const opt = { method: "post", body: formData } ---- "action":やりたいことを意味するもの "bbs_quest_confirm":やりたいことの内容

php_learn
質問者

補足

回答ありがとうございます、Javascript で結果画面へ行く信号を確認するコードは追加されていたんですね… bbs_quest_confirm() に何もせず終わる処理を加えたいのですが、Javascript で確認したコードからセッション変数が空なのか確認して何もせず終わる処理を書くというのはどのように書けばよいのでしょうか…? Javascript と PHP の融合という形が難しくアドバイスお願い致します。

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.10

・bbs_quest_input() はセッションに保存するということは sin_functions.php に追加する形で良いでしょうか? すでに追加されているのでそれでいいと思います。 ・データベース保存とファイル保存が完了した時点 言い方がよくなかったですね。 それぞれについてではなく、両方が完了した時点、と言う意味です。 なので一か所で大丈夫です。 無条件に(ifなしで)、 $_SESSION = array(); session_destroy(); でいいと思います。

php_learn
質問者

補足

アドバイスありがとうございます。 データベース保存はセッション変数であるため下記コードで削除できると思うのですが、ファイル保存が完了した時点で削除というのが分からず引っかかっております… $attach_path はセッション変数ではないため unset ではなく if (!(is_file($attach_path))) {} という形で書きました。 if なしで書く場合どうすれば良いでしょうか? //セッション変数の削除 unset($_SESSION['namae']); unset($_SESSION['message']); unset($_SESSION['stamp']); unset($_SESSION['attach']); //ファイルが存在するか確認 = ファイル保存が完了した時点 if (!(is_file($attach_path))) { //session_start(); $_SESSION = array(); session_destroy(); }

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.9

・sin_functions.php の41、92行目に追加いたしました。 41行目の方、bbs_quest_input()にはセッションの破棄は不要です。 と言うか、bbs_quest_input()はセッションに保存する役割を担っています。 ファイルが存在するかのチェックは不要だと思います。 無条件でセッションを破棄していいと思います。 ファイルがひとつもアップロードされない場合があるのではないでしょうか。 登録できなかった場合は、続行することに意味がないので、セッションを保持する必要がありません。 入力画面に戻ってもらって、再入力してもらうことになりますので、その入力によって、新たにセッションに設定されてきます。 ・トークンは不必要ということになるのでしょうか? 私にはわからないのではっきりしたことが言えません。 フィッシングページから直接確認画面に送信はできないので不必要な気がします。 仮に直接確認画面に送信できたとしても、確認画面からは「結果画面へ行く」と言う信号しか送信しないので、何も起こらないような気がします。 テストできるようなフィッシングページの作り方がわからないのでなんとも言えません。 「結果画面へ行く」信号が届いた時に、セッション変数が空っぽのはずなので、その場合は何もせず終わるような処理をbbs_quest_confirm()に入れておけばいいような気がします。

php_learn
質問者

補足

Q.41行目の方、bbs_quest_input()にはセッションの破棄は不要です。 と言うか、bbs_quest_input()はセッションに保存する役割を担っています。 A.アドバイスありがとうございます。 bbs_quest_input() はセッションに保存するということは sin_functions.php に追加する形で良いでしょうか? Q.ファイルが存在するかのチェックは不要だと思います。 無条件でセッションを破棄していいと思います。 ファイルがひとつもアップロードされない場合があるのではないでしょうか。 A.アドバイスありがとうございます。 dell_ok さんの回答からデータベース保存とファイル保存が完了した時点で破棄の2つ別々に必要ではないかと読み取ったのですが、 $attach_path はセッション変数ではないのでどう削除すべきか悩んでおります… アップロードされない場合が考えから抜けておりました申し訳ありません、is_file はファイルがなかったり、ディレクトリだった場合は false を返すとのことでアップロードされない場合は処理が行われない状態で進行するので問題ないのではないかと感じました。 Q.「結果画面へ行く」信号が届いた時に、セッション変数が空っぽのはずなので、その場合は何もせず終わるような処理をbbs_quest_confirm()に入れておけばいいような気がします。 A.回答ありがとうございます、コードを書いてみたのですが if 条件に違和感があり何か違うような気がしています…  アドバイスお願い致します。 結果画面へ行くボタンに押されたら処理を実行するようにして、セッション変数が空の場合終了するというコードを書きました。 sin_functions.php の86行目に namae,message,stamp,attach のセッション破棄コード、92行目にファイル保存が完了した時点で破棄するコード、99行目に何もせずに処理を終わらせるコード single-index.php の202行目に結果画面へ行く」信号が届いたか確認するコードを追加いたしました。 ※最新コード https://wandbox.org/permlink/HB9776OKttOlIDVO ※name属性の追加・変更 https://web-engineer-wiki.com/javascript/name-2/ ※クリックされたボタンに応じて別の処理を実行 https://magazine.techacademy.jp/magazine/31078

関連するQ&A