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

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

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

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

Q&A

解決済

3回答

1523閲覧

PHP captcha セッションを使わないやり方は安全でしょうか

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

1クリップ

投稿2021/04/03 14:34

自作で画像認証するcaptchaを作りましたが、
本来ならセッションに生成した文字列を格納すると思うのですが、
会員登録せず一見しただけのユーザーがいた場合に
セッションファイルというゴミを作りたくないため、
生成した文字列はクッキーに保存しようと思っています
本来なら$_SESSION["captcha"]="生成した文字列を入れる";
これを
header("Set-Cookie: captcha=ここに生成した文字列を入れる; httpOnly; path=/");
このようにしました

これで外部プログラムを使い読みだされる事はない、と思っていいでしょうか?
(ブラウザ開発ツールからのdocument.cookieなどで読み取れないことを確認しました)

もちろんブラウザのクッキーを見れば文字列はわかりますが、
プログラムによる操作さえできなければ問題ないと考えました

答え合わせはif($_POST["code"]==$_COOKIE['captcha'])のようにしようと考えています
ご指摘下さい

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

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

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

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

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

guest

回答3

0

ベストアンサー

これで外部プログラムを使い読みだされる事はない、と思っていいでしょうか?

ダメです。
cookieに格納されている情報は外部プログラムから読み出せるので、
画像認証の意味がなくなります。

セッションファイルというゴミを作りたくないため、

通常の使い方ならデフォルトで自動的に削除してくれるので気にする必要はありませんが、
どうしても気になるのであれば、必要なタイミングでsession_destory()で以下の例のような形でセッションファイルを明示的に破棄することができます。

注意: 通常のコードでは、session_destroy() を呼ぶ必要はありません。 セッションデータを破棄するよりも、 $_SESSION 配列をクリーンアップしてください。

PHP

1<?php 2// セッションの初期化 3// session_name("something")を使用している場合は特にこれを忘れないように! 4session_start(); 5 6// セッション変数を全て解除する 7$_SESSION = array(); 8 9// セッションを切断するにはセッションクッキーも削除する。 10// Note: セッション情報だけでなくセッションを破壊する。 11if (ini_get("session.use_cookies")) { 12 $params = session_get_cookie_params(); 13 setcookie(session_name(), '', time() - 42000, 14 $params["path"], $params["domain"], 15 $params["secure"], $params["httponly"] 16 ); 17} 18 19// 最終的に、セッションを破壊する 20session_destroy();

投稿2021/04/03 16:23

tanat

総合スコア18727

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

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

退会済みユーザー

退会済みユーザー

2021/04/03 16:51

回答ありがとうございます >cookieに格納されている情報は外部プログラムから読み出せるので、 どのようにして読み出せるんでしょうか 自動POSTを防ぐ目的で実装してるので読み出せたらまずいです 上記の提示されたセッションの初期化のコードですが、 どのタイミングで実行するんですか? ユーザーが何もせず$_SESSION["captcha"]だけを残して去っていったかの判別方法はありますか?
tanat

2021/04/03 17:15 編集

> どのようにして読み出せるんでしょうか HTTPレスポンスヘッダを読むことで内容を読めますし、ブラウザを操作できるツールならcookieに格納されている情報には自由にアクセスできます。 具体的な方法はツールによって変わりますが、Cookieの内容はページに表示されているHTMLと同様に読める性質の情報だということを認識する必要があります。 https://developer.mozilla.org/ja/docs/Web/HTTP や `HTTP 仕様`などで調べてHTTPの基本を学習されることをお勧めします。 > 上記の提示されたセッションの初期化のコードですが、どのタイミングで実行するんですか? アプリケーションの作りによって異なるので現状の質問からだとどうにも言えません。 判断できないのであれば削除するべきではありません。 > ユーザーが何もせず$_SESSION["captcha"]だけを残して去っていったかの判別方法はありますか? 例えば、正しく$_SESSION["captcha"]が使われたらセッション情報を削除するような仕組みにすれば、一定時間以上残っているものは全てそうだと判断できますね。 ただ、その辺を判断できない状態であれば標準的な方法から逸脱した実装をするべきではありません。 (脆弱性を作りこむことになります) 回答の繰り返しになりますが、普通に使っていればセッションファイルは自動で削除されるので明示的に削除する必要はありません。
退会済みユーザー

退会済みユーザー

2021/04/03 23:26

ini_set('session.gc_maxlifetime',31536000 ); ini_set('session.cookie_lifetime',31536000 ); できる限りセッションの有効期限を長くしていたため、普通ではない考え方をしていました 素直に一般的なやり方に従って1週間ほどで定期的にクリアさせるような手順に変更したいと思います クッキーに保存というのも認識の甘さを思い知らされました 素直にセッションにします ありがとうございました
guest

0

te2jiさんの回答の派生ですが、以下のコードだと、

if($_POST["code"]==$_COOKIE['captcha'])

$_POST["code"] および $_COOKIE['captcha'] を送らなくても、NULL==NULLで通ってしまいます。警告はでますが、攻撃者の目的は達成すると思います。

投稿2021/04/04 00:47

ockeghem

総合スコア11705

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

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

0

$_POST["code"]==$_COOKIE['captcha']で検証するのであれば、適当な cookie をクライアント側でセットしてその値を POST すれば突破できますが、考慮されてます?
captcha を自前実装しようとするにはもろもろの定石を知らなすぎると思います。
識者にジョインしてもらうのが良いかと。

投稿2021/04/03 21:21

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2021/04/03 23:28

ありがとうございます JSは防げても、HTTPヘッダを取得して、ヘッダに直書きやら、色んな抜け道があることを考えるべきでした
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問