• ベストアンサー

WordPressの質問(q10207678)の続

空白改行の文字が連続してはいけないという条件で正規表現を調べたところ、空白には色々な表現があるようでそれらを 1 つ 1 つ調べ上げるのは面倒なので、Unicode 文字プロパティを使ったほうがよいと参考サイトに書かれておりました。 マルチバイト対応の文字列に対する正規表現マッチングで作成するのが良いみたいですが、コードを調べても意味が分からずどうすれば良いか迷っております… 正規表現を使っている場合 ReDoS という攻撃があるようで、セキュリティ上の対策も必要なようです。 アドバイスお願い致します。 ※参考サイト https://qiita.com/fallout/items/a13cebb07015d421fde3

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

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

・カメラ画像をファイルアップロード時に非表示にするコードを追加するコードを考えてみたのですが、間違っているところはありますでしょうか? 実装してみました。 カメラ画像は非表示になったのでいいと思います。

php_learn
質問者

お礼

こちらが最新の質問になります。 質問の期限が切れており続きの質問を立てさせていただきました。アドバイスよろしくお願い致します。 https://okwave.jp/qa/q10226736.html

php_learn
質問者

補足

回答ありがとうございます。 CSSを確認ページまで設定して確認後に表示ページのコードを作成する予定です。

その他の回答 (31)

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

最新コードを確認しました。 回答No.16で変更していただいた、以下の部分が前のものに戻っています。 ---- namae_value = json.namae; message_value = json.message; ----

php_learn
質問者

補足

アドバイスありがとうございます。申し訳ありません、修正いたしました。 ※最新コード https://wandbox.org/permlink/zR6EMWQvK4gIVj5K

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

・window.addEventListener("DOMContentLoaded", init);はscript 終了タグ</script>の直前に書くべきでしょうか…? そうですね。 一番最後に書くのがいいと思います。 ・&がつく理由を調べてみたのですが分からなかった為、教えて頂きたいです。 こちらの「引数のリファレンス渡し」を読んでみてください。 https://www.php.net/manual/ja/functions.arguments.php ・以前はsingle-index.phpに追加していたのですが、現在のコードではどのファイルに追加したほうが良いと思われますでしょうか? それが私にもよくわからないのです。 どこでヘッダー出力するのか、どこの参考サイトもはっきりかかれていないんですよね。 ただ、header()は何よりも先に出力しないといけないので、 https://www.php.net/manual/ja/function.header.php 「※旧コード (画面還移あり掲示板) 」と同じように、 single-index.php(bbs_quest_input.php)の get_header(); の前になると思います。

php_learn
質問者

補足

Q.そうですね。 一番最後に書くのがいいと思います。 A.回答ありがとうございます、window.addEventListener("load", init);を書くこととなった理由を過去の質問から探してみたところ、カメラ画像をファイルアップロード時に非表示にするコードは、イベント設定以前に要素を取得しているため、HTML解釈後に実行することが必要となっていてまとめる際に必要とのことでした。 カメラ画像をファイルアップロード時に非表示にするコードを現在の single-index.php から探してみたのですが見当たらず、書いていないのではないかと不安なのですが、該当するコードはありますでしょうか? dell_OKさんが公開されていたサイトから探してコメントアウトを入れておくべきでした申し訳ありません… ※過去の質問 https://teratail.com/questions/blkl7whqy5jz3s Q.こちらの「引数のリファレンス渡し」を読んでみてください。 https://www.php.net/manual/ja/functions.arguments.php A.回答ありがとうございます、$errorの引数を常にリファレンス渡したいという意図ということで覚えておきます。 Q.ただ、header()は何よりも先に出力しないといけないので、 single-index.php(bbs_quest_input.php)の get_header(); の前になると思います。 A.アドバイスありがとうございます。header()は先に出力されるので get_header(); の前に書くというのは一番適切な気がしますね。変更いたしました。 ※最新コード https://wandbox.org/permlink/lItJX4RPyB5Ytp9F

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

巻き上げ、についてどうすることになったか覚えていませんが、エラーになっています。 const 定義するのでしたら、呼び出す処理はそれより下にしてください。 ---- const init = function () { set_attach_event(); document.getElementById("input_button").addEventListener("click", input_button_click); } //DOM構築、スタイルシート、画像、サブフレームの読み込みが完了した後に発生する window.addEventListener("DOMContentLoaded", init); </script> ---- 私のミスがありました。 $errorの引数のところには & をつけてください。 ---- function Chk_ngword($str, $mes, &$error) function Chk_InputMode($str, $mes, &$error) ----

php_learn
質問者

補足

修正ありがとうございます、関数の巻き上げに該当するコードは対応しているのですが、カメラ画像をファイルアップロード時に非表示にするコードが画面表示前に呼ばれた場合エラーになる可能性があるとのアドバイスを過去に頂いており、 onload以降にすることも並行して考えております。 window.addEventListener("DOMContentLoaded", init);はscript 終了タグ</script>の直前に書くべきでしょうか…? functions.phpの52行目と81行目を修正いたしました。 single.index.phpの55行目を修正いたしました。 function Chk_ngword($str, $mes, &$error) function Chk_InputMode($str, $mes, &$error)についてお聞きしたいのですが、&がつく理由を調べてみたのですが分からなかった為、教えて頂きたいです。 ※最新コード https://wandbox.org/permlink/HL1IViYKA2iWfmOt ※2.3. 関数宣言でなく関数式を使用する (関数の巻き上げ) https://qiita.com/kerupani129/items/b2c3619856b048c13394

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

最新コードを確認しました。 私の書き方がよくなかったですかね。 追加してください、と言ったのですが、変更されたようです。 $_SESSIONの部分がなくなっていたので追加しておいてください。 ---- if (empty($error)) { $result['error'] = ''; $result['namae'] = $namae; $result['message'] = $message; $_SESSION['namae'] = $namae; $_SESSION['message'] = $message; ---- タグを除去するコードがなくなっています。 ---- function Chk_StrMode($str) { // タグを除去 $str = strip_tags($str); // 連続する空白をひとつにする $str = preg_replace('/[\x20\xC2\xA0]++/u', "\x20", $str); // 連続する改行をひとつにする $str = preg_replace("/(\x20*[\r\n]\x20*)++/", "\n", $str); // 前後の空白を除去 $str = mb_ereg_replace('^( ){0,}', '', $str); $str = mb_ereg_replace('( ){0,}$', '', $str); $str = trim($str); // 特殊文字を HTML エンティティに変換する $str = htmlspecialchars($str); return $str; } ---- bbs_quest_confirm() の中に全角スペースがあります。 半角スペースにしておいてください。 ----   //セッション変数の削除 ----

php_learn
質問者

補足

A.修正ありがとうございます、申し訳ありません勘違いしておりました。 ※最新コード https://wandbox.org/permlink/KUWw7aoTQDpRcx8d

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

・安全なウェブサイトの作り方 - 1.9 クリックジャッキングについてセキュリティ対策を考えているのですが、下記のどちらのコードにすべきか悩んでおります。どちらが良いと思われますでしょうか? どちらが良いかわからないですね。 参考サイトを見ましたが、これもログインうんぬんの話しのようなので、正直関係ないような気がします。 不安なので付けておきたいのであれば、DENYですべてを禁止すればいいような気はします。 このヘッダの機能や動作を理解できていませんが、iframeが使えなくなるようでしたら、PDF表示に使っているので、SAMEORIGINになるかと思います。

php_learn
質問者

補足

Q.参考サイトを見ましたが、これもログインうんぬんの話しのようなので、正直関係ないような気がします。 不安なので付けておきたいのであれば、DENYですべてを禁止すればいいような気はします。 このヘッダの機能や動作を理解できていませんが、iframeが使えなくなるようでしたら、PDF表示に使っているので、SAMEORIGINになるかと思います。 A.アドバイスありがとうございます。ログイン制ではないので外しても良い気はするのですがボタン要素などに透明なページがかぶせられてしまい、ユーザーが詐欺サイトにアクセスしてしまう危険があるのではないかと心配しております… 設置した場合 iframe が使えなくなるようなので、SAMEORIGINにいたします。 以前はsingle-index.phpに追加していたのですが、現在のコードではどのファイルに追加したほうが良いと思われますでしょうか? ※参考サイト https://www.hitachi-solutions-create.co.jp/column/security/click-jacking.html ※回答No.19の質問回答後に回答させていただいている為、現在のコードは最新のものになっております。 ※現在のコード https://wandbox.org/permlink/HL1IViYKA2iWfmOt ※旧コード (画面還移あり掲示板) https://wandbox.org/permlink/wgw57ZA0Iln9sjdI

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

入力文字のチェックについては終わったと思っていいでしょうか。 終わってから話そうと思っていたことがあったので話しておきます。 私のサンプルでは、入力画面の文字列をそのまま確認画面に表示していました。 質問者さまが調べられた createTextNode() を使うことでHTMLタグを入力されても問題ないようになっていたからです。 一方、入力文字のチェックは、以前作成された Chk_StrMode() を使うようにされましたね。 そこでは、タグを除去するコードが含まれています。 データベースに保存されるのはこちらの文字列になります。 確認画面にはタグが表示されているのに、データベースにはタグがないものが保存されることになります。 結果、質問一覧などで表示されるものはタグがないものになります。 これでは確認画面の情報がウソになってしまいます。 そこで、確認画面に表示するものも、タグを除去したものにした方がいいと思います。 要は、データベースに保存されるものと同じもの、と言うことです。 非同期通信でなるべくデータを送り返さない方針でエラーのみを返していましたが、名前とメッセージについては、入力チェックが済んだものを返してそれを表示するようにしたいと思います。 functions.php の bbs_quest_input() に下記の下2行を追加してください。 ---- if (empty($error)) { $result['error'] = ''; $result['namae'] = $namae; $result['message'] = $message; ---- bbs_quest_input.php の input_button_click() の下記の2行を、 ---- namae_value = document.getElementById("namae").value; message_value = document.getElementById("message").value; ---- 以下のように変更してください。 ---- namae_value = json.namae; message_value = json.message; ----

php_learn
質問者

補足

Q.入力文字のチェックについては終わったと思っていいでしょうか。 終わってから話そうと思っていたことがあったので話しておきます。 A.回答ありがとうございます、承認制にする方法も実装したいと考えているのですが、雑談掲示板まで作成してから余裕があればでいいのではないかと思いました。 現在の NGワードを設定する方法が一番適しているとのアドバイスを複数の方から教えて頂きました。 Q.そこで、確認画面に表示するものも、タグを除去したものにした方がいいと思います。 要は、データベースに保存されるものと同じもの、と言うことです。 非同期通信でなるべくデータを送り返さない方針でエラーのみを返していましたが、名前とメッセージについては、入力チェックが済んだものを返してそれを表示するようにしたいと思います。 A.修正ありがとうございます、こちらでも確認をしておくべきでした申し訳ありません。 ※修正コード https://wandbox.org/permlink/OlaWjktBawXPRPWR _________________________ 安全なウェブサイトの作り方 - 1.9 クリックジャッキングについてセキュリティ対策を考えているのですが、下記のどちらのコードにすべきか悩んでおります。どちらが良いと思われますでしょうか? アプリではなくサイトで使う場合は DENY でよいのではないかと考えております。 header("X-FRAME-OPTIONS: DENY"); header('X-FRAME-OPTIONS: SAMEORIGIN'); ※クリックジャッキングについて https://www.ipa.go.jp/security/vuln/websecurity/clickjacking.html ※X-Frame-Optionsレスポンスヘッダーについて https://nulab.com/ja/blog/typetalk/measure-clickjacking/

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

・レコード名を関連づけることで識別して、承認するテーブルを選択する?形になるのではないかと想像しております。 関連づける、と言うのがわかりませんが、テーブルAのものはレコードAですし、テーブルBのものはレコードBなので、テーブルとレコードを関連づける?必要はありません。 テーブルを選択または切り替えるのは、その画面が記事コメントの画面なのか、質問掲示板の画面なのか、雑談掲示板の画面なのか、で決まってくると思います。 それぞれ、投稿画面も承認管理画面も別々のPHPファイルになると思います。 少なくとも外枠的な画面はそうなります。 もしかしたら、そこから共通処理になるようなコードがあれば、それを呼ぶ際にABCなどの文字でも渡して、どの画面から呼んだかを識別できるようにして、テーブルを選択することになると思います。

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

・承認の有無を切り替える これはどう言うことでしょうか。 承認機能の有効無効でしょうか。 それとも、承認するか否かでしょうか。 ・A-1 , A-2 , A_3で1テーブル Aの1から3はなんでしょうか。 それぞれがひとつのコメントになるレコードでしょうか。

php_learn
質問者

補足

回答ありがとうございます、承認するか否かになります。 Aの1から3はレコード名として例に上げさせて頂きました。レコード名を関連づけることで識別して、承認するテーブルを選択する?形になるのではないかと想像しております。

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

・標準のものを使わずに別途作成するしかないのでしょうか…? 標準テーブルを使わないので、別途作成するしかないです。

php_learn
質問者

補足

回答ありがとうございます、テーブルの識別で分からないところがあるのですが、テーブルを3つ別の名前で用意して、それぞれテーブルごとにレコードを関連ずけることで承認の有無を切り替えるという形になるのでしょうか? 例としてA , B , Cの3つのテーブルを作った場合 A-1 , A-2 , A_3で1テーブル B-1 , B-2 , B-3で1テーブル C-1 , C-2 , C-3で1テーブル それぞれ掲示板についてのコードを書いて、承認の有無についてのみテーブルを識別させてまとめて書くという事であってますでしょうか? 承認の有無についてのコードをまとめるのは難しいのではないかと考えております… ※参考サイト https://mio-code.com/2020/01/25/hurakome4/ https://note.com/monbuu/n/nbc0b69421f83

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

どのような方法にしてもコードが複雑または肥大化するのは否めませんが、テーブルを切り替えれば同じコードが使える部分もあるでしょうから、そこに期待してすすめてみましょう。

php_learn
質問者

補足

回答ありがとうございます。 複数の掲示板をWordpressの管理画面で管理する方法が分からないのですが、標準のものを使わずに別途作成するしかないのでしょうか…?

関連するQ&A