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

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

新規登録して質問してみよう
ただいま回答率
85.35%
セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

PHP

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

CSRF

クロスサイトリクエストフォージェリ (Cross site request forgeries、CSRF)は、 外部Webページから、HTTPリクエストによって、 Webサイトの機能の一部が実行されてしまうWWWにおける攻撃手法です。

Q&A

解決済

2回答

1680閲覧

【PHP】作成したフォームに脆弱性がないか、アドバイスをして頂けませんか

kkkkk13n

総合スコア14

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

PHP

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

CSRF

クロスサイトリクエストフォージェリ (Cross site request forgeries、CSRF)は、 外部Webページから、HTTPリクエストによって、 Webサイトの機能の一部が実行されてしまうWWWにおける攻撃手法です。

0グッド

1クリップ

投稿2020/09/22 04:21

編集2020/09/22 05:21

二箇所の<input>内に数値を入力して、同一ページの下部にて与えられた数値を出力したいです。

フォームは最大で3文字しか入力できません。

行った対策
0. CSRF対策(秘密トークンの発行)

//トークン発行 $_SESSION['ticket'] = sha1(uniqid(mt_rand(), TRUE)); //post受け取り時にトークンの一致を確認 if (isset($_POST['under'], $_SESSION['ticket']) && hash_equals($_POST["ticket"], $_SESSION["ticket"])) { //trueの場合進める
  1. セッションハイジャック
  2. エスケープ処理
  3. クリックジャッキング
  4. 数値のみ入力可能なバリデーション
if (!preg_match('/^([0-9]{1,3})$/', $under)) { $error['under'] = '3桁以内の数字で入力してください'; }

※セキュリティの関係からコードは割愛してる場合あります。

・秘密トークンの発行により外部ページのpostは受け取らない

・フォームへの入力は3文字が最大であり、エスケープ処理もしている。

上記の点からphp初心者の私からすると脆弱性はないようにも思えるのですが、どうなんでしょうか?

これ以外にも考えられる脆弱性はありますか?

ECサイト内のプログラムなのでセキュリティには気を遣ってます。

よろしくお願いします

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

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

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

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

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

guest

回答2

0

ベストアンサー

ソースコードが提示されていませんが、脆弱性は細部に宿るものであり、概要だけでは脆弱性のありなしは示せません。例えば、よくある脆弱性としては、CSRF対策トークンにuniqidやmt_rand等を使ってしまうケースがあります。正しくは、暗号論的に安全な乱数生成器(random_bytesなど)を使う必要があります。

投稿2020/09/22 05:15

ockeghem

総合スコア11705

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

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

kkkkk13n

2020/09/22 05:23

ソースコード一部分提示しました。 そうなのですね、ガッツリuniqidやmt_rand等使っていました。。。
ockeghem

2020/09/23 02:11

preg_match('/^([0-9]{1,3})$/', $under)) の部分ですが、添削すると以下のような感じですね。 preg_match('/\A[0-9]{1,3}\z/', $under)) 元のままだと末尾の改行を許可してしまいます。また、丸括弧はこのケースでは必要ないので、必要ないものはつけないようにしましょう。 部分的にソースを開示いただきましたが、やはり問題ないという確認はできませんし、ソースコードまるごとの開示も難しいでしょうし、仮に開示いただいてもそれの確認は「お仕事」になってしまいますので、このあたりでとどめたいと思います。
kkkkk13n

2020/09/23 07:43

ありがとうございます。 ご指摘頂いた箇所、訂正致します。
guest

0

入力値がエスケープされているようなので、基本的な脆弱性対応はできているのではと思います。
あまり、言いたくないのですが、このようにQAサイトで脆弱性診断をしていること自体が
脆弱性のような気もします。
当然、業務コードそのままでは無いとは思うのですが。。。

投稿2020/09/22 04:31

Kaiser

総合スコア295

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

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

kkkkk13n

2020/09/22 04:36

なるほどです。 関係のないコードに関しては削除します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問