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

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

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

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

PHP

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

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

Q&A

解決済

2回答

700閲覧

XAMPPのローカルサーバーで、Windowsのエクスプローラーを開きたい

pom12345

総合スコア12

Apache

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

PHP

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

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

1グッド

0クリップ

投稿2022/09/16 09:59

編集2022/09/16 10:42

XAMPPのローカルサーバー前提ですが、

PHPを利用してWindowsのエクスプローラーを開きたいのですが、
Visual Studio Codeで実行できても、XAMPPで実行することができません。

これはweb-apiの普通でない使い方であり、
また、セキュリティ的にも良くないし、apacheで制限されてるかもとは思っていますが、
あくまでローカルPC限定で使用したいと思っています。

フレームワークを使わずシンプルなindex.phpでGETアクセスを受けれるように作ってもいいかもしれません。(検証中)

どなたかわかる方いらっしゃいましたらお願いします。

プロジェクト

・Laravelを使うまでのことではないですが、簡単にapiを実装したいため、Laravelを使用しています。XAMPPで動くなら、Laravelは使わずに、index.phpの単一のものでしようと思ってます。

・htdocs直下にopen-directory-web-apiプロジェクトを配置

php

1--- api.php --- 2use App\Http\Controllers\OpenDirectoryController; 3Route::get('OpenDirectory/open', [OpenDirectoryController::class, 'open']); 4 5--- OpenDirectoryController.php --- 6<?php 7namespace App\Http\Controllers; 8use Illuminate\Http\Request; 9 10class OpenDirectoryController extends Controller { 11 public function open(Request $request) { 12 $value = request("value"); 13 14 if ($value) { 15 // 実際には何か文字の処理をしたほうがよいかもしれません。 16 // escapeshelllcmdを使おうとしたらエラーした 17 // $value2 = escapeshelllcmd("abc"); 18 19 // エクスプローラーを開く、テストのためC:\を指定しています。 20 $command = "explorer.exe /e, /root, C:\\"; 21 exec($command); 22 23 // $filePointer = popen('start "" '.$command, 'r'); 24 // pclose($filePointer); 25 26 return response()->json([ 27 "message" => "200 OK: " . $value 28 ], 200); 29 } 30 31 return response()->json([ 32 "message" => "400 Bad Request:" . $value 33 ], 400); 34 } 35}

・XAMPPでapacheを再起動 (80port使用OK)

・php artisan serveを実行

実行したことと結果

http://localhost:8000/api/OpenDirectory/open?value=abc
200 OK: のjsonがかえってきて、エクスプローラーが開かれる

http://localhost/open-directory-web-api/public/api/OpenDirectory/open?value=abc
200 OK: のjsonがかえってきて、エクスプローラーが開かない

(追記)シンプルなindex.phpで検証しましたが、開きませんでした

GETアクセス
http://localhost/open-directory/index.php?value=abc

php

1<?php 2$value = $_GET["value"]; 3echo $value; // 文字は取得できています。 4 5if ($value) { 6 // 実際には何か文字の処理をしたほうがよいかもしれません。 7 // escapeshelllcmdを使おうとしたらエラーした 8 // $value2 = escapeshelllcmd("abc"); 9 10 // エクスプローラーを開く、テストのためC:\を指定しています。 11 $command = "explorer.exe /e, /root, C:\\"; 12 exec($command); 13 14 // $filePointer = popen('start "" '.$command, 'r'); 15 // pclose($filePointer); 16 17 echo "OK"; // ここは実行される 18 19} else { 20 echo "NG"; 21} 22?>
yukkuri_55👍を押しています

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

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

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

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

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

m.ts10806

2022/09/16 10:26

>エクスプローラーが開く とはどういう状態ですか?
pom12345

2022/09/16 10:35

ありがとうございます。 Windowsのエクスプローラーをexecで開くことです。 $command = "explorer.exe /e, /root, C:\\"; exec($command); VS Codeのデバッグだと開くのですが、ローカルのXAMPPのapacheで開いてくれません。セキュリティ的な問題はあるかもしれませんが。
m.ts10806

2022/09/16 10:50 編集

ブラウザから指示出してもそれはWebサーバー内でのOSコマンドによる指示になるのでブラウザを操作してるユーザには何も返ってこないのは当然です。 対象の機器内でphpコマンドなどで実行するものかと。
pom12345

2022/09/16 10:59 編集

なるほどです、phpコマンドかなにか中継するものがないか試してみます!
m.ts10806

2022/09/16 11:27

ひとまず「ブラウザからOSコマンドを指示」というのを諦めてください。 ※もちろん実際OS側に処理させた方が早い項目とか、コマンド実行(javaのjarとかpythonなど)にバックグラウンド処理を任せるというのはないわけではないですが、OSコマンドインジェクションの考慮も必要ですし、あまり積極採用するものではないかと。 今回のように「エクスプローラを開く」という指示は不適当だと思いました。
otn

2022/09/16 11:47

XAMPPはサービスとして起動していますか?デスクトップアプリとして起動していますか? サービスであれば、ログインしているデスクトップに表示するのは出来ないのかも。
pom12345

2022/09/16 13:43 編集

ご回答ありがとうございます。 XAMPPはサービスで起動してると思いますが、デスクトップアプリでの起動とはどういうことでしょうか? もちろんOSコマンドインジェクションの危険も理解しつつ、ローカルのみの使用、最低限クエリ文字の無害化はするつもりです。また、使用文字は[A-Z0-9-]{1,20}のみになりますが。 エクスプローラーを開くのは私も好きではありませんが、そういう要望があり、できないかを検証をしています。 別ファイルを中継するか、apacheのhttpd.confとかで設定できるのかも…
otn

2022/09/16 13:58 編集

> デスクトップアプリでの起動とはどういうことでしょうか? サービスで起動するように設定してなければ、ログインしてデスクトップかフォルダー内のXAMPPアイコンをクリックして起動していると思うので、そのことです。 サービスとして起動していると、そのサービスからExplorerのようなデスクトップアプリを起動しても、ログインしているデスクトップにその画面を表示できないのではないかと言うことです。 サービスとして起動するのを止めてみましょう。というのが先のコメントで書いたことです。
pom12345

2022/09/16 14:32 編集

ありがとうございます。 XAMPPをサービスとして起動していたのを停止し、デスクトップアプリとして起動すると、エクスプローラーを開くことができました。 あくまでローカルで使用するのみですが、あとはOSコマンドインジェクション対策などをすればよさそうです。 会社のメインシステムをイントラネットのWEBアプリで組んでおり、デスクトップアプリのようにエクスプローラーを開けないかの要望を頂いてまして、WEBアプリからaxiosでlocalhostに対して、GET(またはPOST)アクセスできないかを考えていました。(そこはつながるか未検証ですが、localhostに対してなので行けそうな気はします。) ありがとうございます。
pom12345

2022/09/16 14:32

ベストアンサーに記載していただけるといいですがいかがでしょうか?
m.ts10806

2022/09/16 19:10

すみません遅れました。 質問者自身も自分の質問に回答できるので、ご自身でまとめて書かれたほうが良いかと思いますが、解決されてますね。 ただ、社内システムであってもコマンド指示はWebサーバを置いてるOSで実行されるので、利用者の端末のエクスプローラが開くことはないということだけはお伝えしておきます。(それができてしまえばセキュリティ事故がブラウザでアクセスしただけで起こせるということになります)
pom12345

2022/09/16 23:17

あくまで社内システムのWebサーバーは関係なく、社内システムをブラウザで開いた時に、ブラウザのjavascriptでaxios→localhostにアクセスを考えてます。 クライアントだけの問題になりますが、まだ動くかわかってませんので、検証してみます。
guest

回答2

0

ベストアンサー

XAMPPはかなり昔に一度しか使ったこと無いのですが、
Apacheはサービスとして起動していますか?デスクトップアプリとして起動していますか?

サービスとして起動していると、Apacheはログイン以前から動いているわけで、そのサービスからExplorerのようなデスクトップアプリを起動しても、ログインしているデスクトップにその画面を表示できないのではないかと言うことです。
サービスとして起動しているのなら、それを止めて、XAMPPアイコンクリックでApacheを起動してみましょう。

投稿2022/09/16 14:44

otn

総合スコア84618

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

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

otn

2022/09/16 14:48

使い方に依りますが、ローカルのApacheにそのPCからしかアクセスしなくて良いなら、Apacheの設定でlocalhost(127.0.0.1)以外からのアクセスを拒否しておいた方が良いですね。
pom12345

2022/09/16 14:56

ありがとうございます。 サービスと起動しているとだめな理由をわかりやすく、ありがとうございます。 localhost(127.0.0.1)以外からのアクセスを拒否するようにも設定しておこうと思います。
pom12345

2022/09/19 04:21 編集

XAMPPをサービスとして起動せずに実行するとエクスプローラーが開くものです 完成版を投稿させていただきます。 httpd.cong等でのlocalhost(127.0.0.1)以外のアクセス拒否は設定がうまくいかないので調査します。 CORSの問題あり(現在、リクエストでのエラーはしているが実行できている状況) <?php $httpHost = $_SERVER["HTTP_HOST"]; if ($httpHost !== "localhost") { return "NG"; } $value = $_GET["value"]; if (!empty($value)) { // 適当な文字制限 if (strlen($value) <= 400) { // OSコマンドインジェクション対策 $temp = str_replace(["exec", "system", "start", "passthru", "shell_exec", "pcntl_exec"], "", $value); $temp = escapeshellarg($temp); // これは不要(英語を全て大文字で受けるが、小文字になるので元に戻したい時に使用) // $temp = strtoupper($temp); $command = "explorer.exe /e, /root, " . $temp; exec($command); $json = "{ message => " . $temp . "}"; return $json; } } ?>
otn

2022/09/20 15:54

> OSコマンドインジェクション対策 の部分が意味不明です。これをすることで何を防いでいるつもりなのでしょうか? ディレクトリのパスなのだから、「Windowsのディレクトリのパスとして正しい形式か」をチェックします。
guest

0

localhostで処理しているなら大丈夫なような気がしますが

PHP

1<?php 2$value = $_GET["value"]??null; 3var_dump($value); 4if(!is_null($value)){ 5 print "<hr>"; 6 $command = "explorer.exe /e, /root, C:\\"; 7 if($value=="open"){ 8 exec($command); 9 echo "OK"; 10 }else{ 11 echo "NG"; 12 } 13} 14?> 15<hr> 16<a href="?value=open">open</a> 17<a href="?value=dummy">dummy</a>

投稿2022/09/16 11:25

yambejp

総合スコア114863

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

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

pom12345

2022/09/16 13:47 編集

ご回答ありがとうございます。頂いたコードを実行しましたが動かなく、 locslhostだと動きそうだと思いますが、動かないです。 VS Codeだと動くのですけれど。 リスク対策はしつつ、別ファイルを中継するか、httpd.confを変更するような、何かありそうですが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問