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

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

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

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

2回答

747閲覧

AjaxによるPOSTに対し、「ベーシック認証を突破済みである」を判定する方法はございますか?

origa3

総合スコア22

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2023/02/10 07:34

実現したいこと

・管理画面とユーザー画面で、取得内容を変えたいです。

前提

・コメント取得処理を実装中です。
・管理画面はベーシック認証で簡単なものを作りました。

発生している問題

・Ajaxの場合に管理画面からのPOSTか否かの判定ができません。

該当のソースコード

PHPで以下 IS_ADMIN のような判定をしたいのです。

PHP

1<?php 2// get_comments.php 3function get_comments(){ 4 5 // ベーシック認証を突破済みの 6 // 管理画面からのAjaxでなければ 7 // is_official = 1 のみ取得 8 // ということをやりたい 9 $WHERE = 'WHERE user_id = :user_id'; 10 if ( !IS_ADMIN ) { 11 $WHERE .= 'AND is_official = 1'; 12 } 13 14 $db = new PDO('DSN', 'USER', 'PASSWORD'); 15 $user_id = filter_input(INPUT_POST, 'user_id', FILTER_VALIDATE_INT); 16 $sql = "SELECT * FROM comments {$WHERE} LIMIT 0, 20;"; 17 $stmt = $db->prepare($sql); 18 $stmt->bindValue(':user_id', $user_id, PDO::PARAM_STR); 19 $stmt->execute(); 20 echo json_encode( $stmt->fetchAll() ); 21}

JavaScript側は普通に以下の感じです。

JavaScript

1$.ajax({ 2 "url" : "https://example.com/get_comments.php", 3 "type" : "post", 4 "dataType": "json", 5 "data" : {"user_id": 1} 6}).done(function(response){ 7 console.log(response); 8});

試したこと

まず、datais_admin_ajaxを持たせました。
しかし、これでは管理画面に関わらずPOSTできてしまうらしく、断念致しました…。

JavaScript

1$.ajax({ 2 "url" : "https://example.com/get_comments.php", 3 "type" : "post", 4 "dataType": "json", 5 // is_admin_ajaxを持たせた 6 "data" : {"user_id": 1, "is_admin_ajax": "true"} 7}).done(function(response){ 8 console.log(response); 9});

次に、上記is_admin_ajaxに加えて「ベーシック認証を突破済みである」を混ぜたらどうかと思い、PHP側で以下実装しました。
しかし、$_SERVER['PHP_AUTH_USER']がAjaxの際に取得できないため(つまり以下IS_ADMINは常にfalseとなるため)、こちらも断念することとなりました…。

PHP

1// 管理画面を判定 2define('IS_ADMIN', (function(){ 3 return ( 4 // 管理画面への訪問時である場合 5 str_starts_with($_SERVER["PHP_SELF"], '/admin') 6 // 管理画面からのAjaxである場合 7 || ( 8 // ベーシック認証を突破済みである 9 isset($_SERVER['PHP_AUTH_USER']) 10 // is_admin_ajax である 11 && filter_input(INPUT_POST, 'is_admin_ajax') === 'true' 12 ) 13 ); 14})());

補足情報(FW/ツールのバージョンなど)

セッションと使うとできるのか?と思いましたが、具体的な流れがつかめずこれも苦慮しています。
PHP のバージョンは 8.1 になります。
宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

自己解決

特にhoshi-takanori様ありがとうございます。
以下の通りで実現できました。

Basic認証外ファイル: user-ajax.php, get_comments.php
Basic認証ディレクトリ: admin
Basic認証内ファイル: admin-ajax.php

一般ユーザーからのAjaxではuser-ajax.phpにアクセスし、そこでget_comments.phpをrequireすることでIS_ADMINでないことを判定
管理画面からのAjaxではadmin-ajax.phpにアクセスし、そこでget_comments.phpをrequireすることでIS_ADMINであることを判定

みなさま、ご回答、コメントありがとうございます。

投稿2023/02/12 04:57

origa3

総合スコア22

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

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

0

おっしゃる意味がよくわからないのですが、ベーシック認証のページにアクセスできる時点で管理者なのでは?
もしくはベーシック認証はやめてセッションでの処理に切り替えるのが妥当かと

■ 整理

→前提
Basic認証外ファイル:xxx.php
Basic認証ディレクトリ:yyy
Basic認証内ファイル:zzz.php

・yyyへはBasic認証した管理者のみアクセスできる=zzz.phpには一般ユーザーはアクセスできない

■なにをしたいのか?
(1)xxx.phpが自分がBasic認証済みか調べたい
zzz.phpにfetchで接続してエラーなら未認証、そうでないなら認証済み
※yyy内の全てのファイルがBasic認証対象なのでなにか一つでもエラーなしで接続できれば認証済み

(2)zzz.php内で自分が認証済みか調べたい
そもぞもzzz.phpに接続できている時点で認証済みなのでチェック不要

ほかにどういうパターンを想定しているのでしょうか?

投稿2023/02/10 07:42

編集2023/02/10 10:15
yambejp

総合スコア114767

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

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

origa3

2023/02/10 07:47

>ベーシック認証のページにアクセスできる時点で管理者なのでは? そうです。しかし管理者ではない人も「ベーシック認証のページで実行するJavaScript(質問にあるAjax)」は実行できるのです。 >もしくはベーシック認証はやめてセッションでの処理に切り替えるのが妥当かと 前提に記載の通りで、ベーシック認証での方法を模索しているのが現状です。
yambejp

2023/02/10 07:49

> ベーシック認証のページで実行するJavaScript をベーシック認証のフォルダに入れてしまえばよいのでは?
origa3

2023/02/10 07:50

それでは一般ユーザーが実行できません。
yambejp

2023/02/10 07:55 編集

ではベーシック認証フォルダのファイル(ダミーでOK)を一つfetchでアクセスしてエラーを検知すればよいのでは?
maisumakun

2023/02/10 08:54

> しかし管理者ではない人も「ベーシック認証のページで実行するJavaScript(質問にあるAjax)」は実行できるのです。 POSTを送信することはできたとして、正しくサーバサイドを実装していれば無関係なアクセスは「401 Unauthorizedになる」だけで特に問題ない、のではないでしょうか?
origa3

2023/02/10 09:55

いえ、管理者ではない一般ユーザーも401にはしません。彼らもget_comments.phpは実行できます。質問はget_comments.php内で判定し分岐したいという話です。
yambejp

2023/02/10 10:17 編集

追記しましたが、何がどう問題なのか整理して説明してください。 現状すでに回答した内容で解決していると思いますが? 一般ユーザー(未認証)がエラーにならないBasic認証なんてないはずですが?
origa3

2023/02/10 10:24

>■なにをしたいのか? >(1)xxx.phpが自分がBasic認証済みか調べたい これがしたいです。しかし「fetchで接続」とは一体どういうことでしょうか?
origa3

2023/02/10 13:25

有体に申し上げれば「fetchで接続」しても実現できませんよね?という含意です。 たぶん「質問の$.ajax()の前にyyyに接続すれば、ベーシック認証を通っているか否かが判定できるので、その判定値を$.ajax()のdataに渡せばいい」と仰っているのだと思いますが、$.ajax()はその判定値を書き換えて実行できます。
yuma.inaura

2023/02/10 15:19

Basic認証フォルダ内のphpファイルとフォルダ外のphpファイルで二個置いておくとか 前者が管理者用
origa3

2023/02/10 15:38

それは避けたいく思っています。get_comments() はかなり長いコードなので、分岐の点だけを変えた別ファイルを作りたくはないのです。なので「AjaxによるPOSTに対し、「ベーシック認証を突破済みである」を判定する方法」という質問になっています。get_comments() 内で判定し分岐したいのです。
hoshi-takanori

2023/02/11 20:34

横から失礼します。 > get_comments() はかなり長いコードなので、分岐の点だけを変えた別ファイルを作りたくはないのです。 get_comments() を別のファイルにして、xxx.php や zzz.php から読み込んで使えば良いのでは…。
origa3

2023/02/12 04:49

>get_comments() を別のファイルにして、xxx.php や zzz.php から読み込んで使えば良いのでは…。 その通りでした。どうもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問