ベーシック認証でのエクスポート

質問全般・改善要望
返信する
shirodai
メンバー
メンバー
記事: 1
登録日時: 2020年1月06日(月) 11:48

ベーシック認証でのエクスポート

投稿記事 by shirodai »

-----
ご利用のサーバ: Apache
MODXのバージョン: 1.0.16J
PHPのバージョン: 7.2.7
MySQLのバージョン: 5.1.71
ブラウザ:
-----

数年前に納品したクライアントさんなのですが、普段はテスト環境でエクスポートして、本番環境に静的htmlをアップして運用しているとのことです。
そして、新たにテスト環境にベーシック認証をかけたいようで、そうするとエクスポートが出来ないと連絡をいただきました。
過去のスレッドで同じ状況が1件見受けられ、処理を組み込むことが可能なようですが、どのようにすればベーシック認証でエクスポートが出来るようになるかご教授いただけますでしょうか?

MODXのバージョンとPHPのバージョンが合わないのは、一昨年あたりに勝手にPHPのバージョンを5.6系から上げられてしまい、その時にdocument.parser.class.inc.phpの一部を書き換えて、PHP7.2系で動作するようにしているためです。
癖のあるサーバーのため、現在安定稼働していることからMODX本体はアップデートせず、上記のように一部のファイルを修正することで対応できればと思っています。

何卒、よろしくお願いいたします。
アバター
yama
管理人
記事: 3237
登録日時: 2009年7月29日(水) 02:50

ベーシック認証でのエクスポート

投稿記事 by yama »

https://www.labs816.com/note/16/
curlを使うとベーシック認証領域にアクセスできます。最新版のMODXは内部的にはcurlを
利用しているので、少し改造するだけで動作します。
1.0.16Jで動作させる場合は、file_get_contents()関数に相当するラッパーをcurlベースで
書くとよいのではと思います。(最新版のMODXもそうしています)
maki
メンバー
メンバー
記事: 30
登録日時: 2016年10月28日(金) 20:44

ベーシック認証でのエクスポート

投稿記事 by maki »

すみません、少し以前のスレッドのようなのですが、失礼します。私もこの書き込みと同じく、Basic認証つきのサーバでエクスポートする方法を模索中です。以前は、htaccessにallow from XXX.XXX.XXX.XXX(IPアドレス)を等を書くと、うまくエクスポートできたんですが、最近のバージョンではこの方法では何故かできなくなってしまいました。
1.0.16Jで動作させる場合は、file_get_contents()関数に相当するラッパーをcurlベースで
書くとよいのではと思います。(最新版のMODXもそうしています)
というのは、イメージはわかるんですが、いったいMODx内のどこにその処理を組み込めばよいのでしょうか?もう少し詳しく教えていただけると助かります。
tktools
メンバー
メンバー
記事: 18
登録日時: 2020年8月17日(月) 09:13

ベーシック認証でのエクスポート

投稿記事 by tktools »

木下です。

コマンドラインが使えるのなら

#/bin/sh
rm -Rf <保存するディレクトリ>/*
cd <保存するディレクトリ>
wget -4 --no-check-certificate --http-user=<ユーザ名> --http-passwd=<パスワード> -r -l 20 https://<CMSのドメイン>

というかたちでシェルスクリプトにしてエクスポートすることもできるんですけどね。

保存されたファイルを
find <保存するディレクトリ>/<CMSのドメイン>/rss.xml -type f | xargs sed -i "s/https:\/\/<CMSのドメイン>\//https:\/\/<最終的なドメイン>\//g"
find <保存するディレクトリ> ! -name "rss.xml" -type f | xargs sed -i "s/https:\/\/<cmsのドメイン名>\//\//g"
といったコマンドでファイル内部のドメイン名を書き換える必要があるかもしれません。

全ての変更が終わったら
rsync -av --delete <保存するディレクトリ>/<CMSのドメイン>/ <最終的なドメインのドキュメントルート>

で定期的に書き換える。

このようなシステムを構築すれば CMS が動作しているサーバーと公開サーバーを分離して
CMSへのアクセスにはIP制限をかける。
公開サーバーでは php を動かさない。
CMSからエクスポートするタイミングと公開領域に上書きするタイミングは無関係にできるので
公開領域に頻繁に上書きすることでCMSから出力されたファイル以外は削除されるので
不正なファイルをUPしてハッキング等がほぼ不可能

とかなり高セキュリティな仕組みを構築することができます。
アバター
yama
管理人
記事: 3237
登録日時: 2009年7月29日(水) 02:50

ベーシック認証でのエクスポート

投稿記事 by yama »

MODXのエクスポート機能は、実質的には木下さんの解説のイメージと近いです。
rss.xmlに記述がある全てのページを取得する、という感じの処理になっています。
maki
メンバー
メンバー
記事: 30
登録日時: 2016年10月28日(金) 20:44

ベーシック認証でのエクスポート

投稿記事 by maki »

木下さま、yamaさま
丁寧な解説をありがとうごさいます。最終的にテストドメインから本番ドメインへの送り込みまで自動で行うことまでは今回は想定していませんが、ここに記述していただいたので今後の参考にします!
シェルスクリプトを作って、シェルをたたきに行くボタンをエクスポートのページにおければいいんですが、エクスポートのページをカスタマイズすることがそもそも私の知識ではできません。そのあたりはよい方法がありますか?
tktools
メンバー
メンバー
記事: 18
登録日時: 2020年8月17日(月) 09:13

ベーシック認証でのエクスポート

投稿記事 by tktools »

木下です。

evolution-jp-release-1.0.16J\manager\includes\extenders/ex_export_site.php
の274行目からの

コード: 全て選択

    function get_contents($url, $timeout = 10 )
    {
    	if(!extension_loaded('curl')) return @file_get_contents($url);
    	
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true );
        curl_setopt($ch, CURLOPT_FAILONERROR, true );
        if(ini_get('open_basedir')=='' && ini_get('safe_mode')=='Off')
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_MAXREDIRS,3);
        if(defined('CURLOPT_AUTOREFERER'))
        	curl_setopt($ch, CURLOPT_AUTOREFERER, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
        if($_SERVER['HTTP_USER_AGENT'])
            curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
        $result = curl_exec($ch);
        if(!$result)
    	{
    		$i = 0;
    		while($i<3)
        	{
        		sleep(1);
        		$result = curl_exec($ch);
        		$i++;
    		}
        }
        curl_close($ch);
        return $result;
    }
が、変更対象かな?

サーバーが cURLに対応しているのなら
https://www.steponboard.net/php/1324/
が参考になるかと。

そうでないなら
https://salumarine.com/basic-authentica ... ts-in-php/
https://www.kabanoki.net/855/
とかでしょうか。

違っていたらごめんなさい。
maki
メンバー
メンバー
記事: 30
登録日時: 2016年10月28日(金) 20:44

ベーシック認証でのエクスポート

投稿記事 by maki »

ありがとうございました。
$USERNAME = "xxx";
$PASSWORD = "xxx";
curl_setopt($ch, CURLOPT_USERPWD, "$USERNAME:$PASSWORD");
これを足したらうまく出力できるようになりました!
返信する