• ベストアンサー

読み込み先を制限するには…

いつもお世話になっています。 現在ショッピングサイトを運営しているのですが、基となるindex.phpにファイルを読み込み形式をとっています。 * クエリーの種類 * h:指定されたファイルを読み込む * d:指定されたディレクトリのbody.htmlを読み込む 実際呼び出す際のURL:http://www.****.jp/?d=camp 上記のように入力するとindex.phpにcampフォルダのbody.htmlが読み込まれ表示する仕組みです。 しかしながら最近、http://www.****.jp/?h=http://www.yahoo.co.jp/などURLを直接アドレスバーに入力しサイトとは無関係のファイルを呼び出すユーザーがいて困っています。 サイトのドメイン(今回はhttp://www.****.jp)や指定したファイル以外のサイトから呼び出した場合エラー画面(error.php)を表示させるようなアクセス制限は可能でしょうか? 現在のスクリプトは下記の通りです。 ------------------------------------------------------------- //メインメニューのクエリーを作る $mainQuery = array( "home"=>"?", //表示する //ルートのHTMLを直接指定していた場合は問答無用で塗り替え $showedBody = "home.php"; if($_REQUEST["h"]){ $showedBody = $_REQUEST["h"]; ------------------------------------------------------------- どうかお力をお貸し頂けたら嬉しいです。 その他不足のスクリプトなどあれば回答時にご指摘頂ければ補足させて頂きます。 よろしくお願いいたします。

  • PHP
  • 回答数4
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
noname#246547
noname#246547
回答No.4

>スクリプトを私自身で書き加えるのは難しいでしょうか? PHPはコンパイルが不必要なので、スクリプトを修正するだけで簡単に変更できますが、 プログラム経験がまったく無いと、何をどう修正すればいいか解らないと思います。 先の返答にはrequireを無条件で使用しているのではないかと返答しましたが、 実際には、どのように実装されているかは、このサイトの回答者にはわかりません。(もっと情報提供されれば解る可能性もありますが) つまり、あなたがスクリプトを解析して真の原因を突き止めるだけの、 デバッグ経験をお持ちであれば直せると思います。 PHPは簡単ですしね。 あと、失礼かもしれませんが、「requireにパラメータを無条件で使用」するようなプログラマは、プログラムスキルの程度が知れていますので、 スクリプトが、非常に見にくい可能性があります。 もしあなたが修正するならば、スクリプトを解読するスキルも必要になる可能性があります 私は昔、1関数が2万行のふざけたPHPスクリプトを触らされた事があります。(怒)こんなスクリプトになっていないことを願います。

news_0203
質問者

お礼

ご回答ありがとう御座いました。 システムについては専門業者3人掛かりで製作して頂き連絡したところ脆弱部分の修正をして頂けるとことになりました。 また共有サーバーから専用サーバーにしファイヤーウォールやSSLを駆使して外部からのアクセスを一切遮断する方向で話を進めていこうと思います。 ご回答ありがとう御座いました!

その他の回答 (3)

  • racci
  • ベストアンサー率64% (9/14)
回答No.3

そのレンタルサーバ内に、顧客の個人情報やクレジットカード情報など重要な情報は置いていなかったでしょうか。 脅かすようで申し訳ありませんが、もし置いていた場合、それが盗まれた可能性があります。また、requireやincludeを使用していた場合、サーバに不正なプログラムを設置された可能性もあります。 プログラムの開発業者との契約内容次第ですが、納品物のセキュリティ上の欠陥を直ちに修正すること(直ちに修正できない場合、一時的にサイトの全体もしくは一部を止めることも検討)、ログやサーバ内のファイルなどを確認して、どのような不正行為が外部から行なわれたのかの調査、を要求した方が良いと思います。

news_0203
質問者

お礼

ご回答ありがとう御座いました。 クレジットカード情報や個人情報は扱っていないため問題御座いませんでした。 現在サイト全体をメンテナンスとし止めています。 不正な内容は一つのファイルに原因があり、ディレクトリ外のファイルを読み出せるため海外にアクセスし高負荷が生じることのみのようです。

noname#246547
noname#246547
回答No.2

hが指定された場合、無条件でrequire_once等にパラメータ(ファイル名)を渡していませんか? dが指定された場合は、ディレクトリを指定するので、 サーバ内のディレクトリを検索して、 無ければerror.phpを出し、 hが指定された場合も、パラメータで渡されたファイルが サーバ内に存在するかチェック(ファイル検索)して、 なければerror.phpを出せばよいのではないのでしょうか?

news_0203
質問者

お礼

回答有難う御座いました! >>hが指定された場合も、パラメータで渡されたファイルが >>サーバ内に存在するかチェック(ファイル検索)して、 >>なければerror.phpを出せばよいのではないのでしょうか? とても有効なご意見有難う御座いました! スクリプトを私自身で書き加えるのは難しいでしょうか? 私自身PHPにあまり詳しくなくメインのシステムを外注しています。 自分でできれば!と思っていましたが…なかなか難点がありそうなので一度上記の内容をシステム開発業者と直接相談してみたいと思います。 迅速な回答有難う御座いました!

回答No.1

何故困っているのでしょう? セキュリティと挙動的に問題が無いのでしたら、それでもいいと思いますが。 事実、このサイトも、直接パラメータを指定したURLを打てばその通りに動作します。 不正な値が入っている場合にのみ弾くのではダメなのですか? 今回の場合、hパラメータはファイルなのですから、指定されたファイルの 存在チェックを行うだけで済むのではないのでしょうか? 必ずあるページから遷移しなければならないという仕組みの場合は 遷移元のページからセッション情報を保持する事で解消されるのではないでしょうか。

news_0203
質問者

補足

早速回答ありがとう御座いました。 困っている点では直接URLを入力し、海外のPHPを改造するサイトを開く不正なユーザーがおり、レンタルサーバーに大きな負荷をかけているとの報告がレンタルサーバー側よりこの脆弱性を改善するためにサイト内ファイルのみしか読み出せないようよう対応を考えていました。 >>不正な値が入っている場合にのみ弾くのではダメなのですか? 不正な値が入っている場合error.phpを表示させることは可能でしょうか? 私自身PHPに詳しくなくご迷惑お掛けしてしまい申し訳御座いません…。

関連するQ&A

  • サイト内iframeの読み込み先を指定するURL

    https://xxx.com/index.phpというサイト上に、iframeでhttps://yyy.com/●●●.phpのサイトを表示しています。 「https://xxx.com/index.php?‥‥‥‥」というxxx.comドメインのリンクで、 iframeの中身を、https://yyy.com/★★★.phpに指定して表示させる、 phpコード付きのリンクの書き方をご教示いただけますでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • mod_rewriteの書き方に困っています。

    http://www.○○○.com/1/2/3.htmlといった静的なリクエストを、 .htaccessを使って動的リクエストに読み替えています。 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]*)\.html$ index.php?a=$1&%{QUERY_STRING}[L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]*)/([^/]*)\.html$ index.php?a=$1&b=$2&%{QUERY_STRING}[L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]*)/([^/]*)/([^/]*)\.html$ index.php?a=$1&b=$2&c=$3&%{QUERY_STRING}[L] 違うのはディレクトリの階層(=引数の数)で、最大でa~eまで5つです。 ご覧のとおり、引数がいくつの場合でも、条件は同じなのです。 もっとスマートに書く方法があると思い、あれこれ試していますが、 自力ではうまくいかず、この形で運用しています。 技術向上のため、簡潔な書き方があれば知りたいです。 お気づきの書き方をご教示下さい。よろしくお願いします。 なお、php等を使ったスクリプトでの解析の提案ではなく、 .htaccessの記述方法としてのアドバイスをお願いします。

  • HTMLページにPHPで処理した結果を表示したい

    以下の【HTML】内にPHPの結果を表示したいと思い、試行錯誤していますが、うまくできません。 ※http://xxx.com/ISL/ISLPage.php?query1=apple をブラウザで実行すると正常に表示されます。 たぶん、header("Content-type: application/x-javascript"); を 【ISLPage.php】か【ISLModule.php】のどこかに書きこんで 【ISLModule.php】の$html []= あたりに、echo "document.write・・・ に直せば できそうな気がするのですが、具体的にどうすれば、表示されるかが分かりません。(>_<;) 既に数十回トライしましたが、どうしてもダメでしたので、どうかご教示いただければと思います。 申し訳ございませんが、どうかよろしくお願い致します。 【HTML】 <html> <body> </body> <script type="http://xxx.com/ISL/ISLPage.php?query1=apple"></script> </html> 【ISLPage.php】 <html> <body> <?php include_once("./ISLModule.php"); echo $_GET['query1']; new ISLModule(array( "query" => $_GET['query1'], "hits" => 3 )); ?> </body> </html> 【ISLModule.php】 <?php class ISLModule { function __construct($param = array()) { $results = array(); if ($param['query'] != "") { $query4url = rawurlencode($param['query']); try { $url = "http://xxxxx/ … buildQuery($param); $xml = simplexml_load_file($url); if ($xml["totalResultsReturned"] != 0) { $results = $xml->Result->Hit; } } catch(Exception $e) { } } $result['query'] = $param['query']; $result["results"] = $results; ISLModule::display($result); } function display($param = array()) { $html = array(); $html []= "<div class=\"YSAPISDK\">"; $html []= "<div class=\"ISLModule\">"; $html []= "<h1>「" . h($param['query']) . "」の検索結果</h1>"; foreach ($param["results"] as $result) { $html []= "<div class=\"Item\">"; $html []= "<p><a href=\"" . h($result->Url) . "\"><img src=\"" . h($result->Image->Small) . "\" /></a></p>"; $html []= "<h2><a href=\"". h($result->Url) . "\">" . h($result->Name) . "</a></h2>"; if (!is_null($result->PriceLabel->SalePrice)) { $html []= "<p class=\"Price\">". h($result->Price). "円</p>"; } $html []= "</div>"; } $html []= "</div>"; $html []= "</div>"; echo join("\n", $html); } } ?>

    • 締切済み
    • PHP
  • empty($_SERVER['REQUEST_U

    empty($_SERVER['REQUEST_URI'])とは、何のことでしょうか? 下記スクリプトの意味について教えてください。 // // Fix unavailable $_SERVER['REQUEST_URI'] on IIS // if ( empty($_SERVER['REQUEST_URI']) ) {  $_SERVER['REQUEST_URI'] = $_SERVER['PHP_SELF'];  $_SERVER['REQUEST_URI'] .= ( !empty($_SERVER['QUERY_STRING']) ) ? '?'.$_SERVER['QUERY_STRING'] : ''; } ▼if ( empty($_SERVER['REQUEST_URI']) ) { $_SERVER['REQUEST_URI']が空だったら、の意味が分かりません。 ページにアクセスするためのURIを指定しなかったら? それは、どんな状況なのでしょうか? ▼$_SERVER['REQUEST_URI'] = $_SERVER['PHP_SELF']; $_SERVER['REQUEST_URI']に、現在実行しているスクリプトのファイル名を利用。これは、何をしているのでしょうか? ▼$_SERVER['REQUEST_URI'] .= ( !empty($_SERVER['QUERY_STRING']) ) ? '?'.$_SERVER['QUERY_STRING'] : ''; クエリ情報(URLの"?"以降の文字列)が空でなければ、クエリ情報をくっつける。空だったら、くっつけない 結局、このスクリプトでは何をしようとしているのでしょうか? また、このスクリプトがないと、どういう不具合が起きる可能性があると、想定されるでしょうか? 検索してみたら、下記のようなページがあったのですが、 IIS(サーバ?)固有の不具合回避対策なのでしょうか? ▽Dokeos Forum • View topic - IIS $_SERVER['REQUEST_URI']   http://www.dokeos.com/forum/viewtopic.php?t=8335

    • ベストアンサー
    • PHP
  • Javascriptのクエリ(パラメータ)取得

    Javascriptでクエリが取得できません。 現在、行おうとしていることは <html> <body> ~ <script src="http://www.hoge.jp/example.js?id=1"></script> ~ </body> </html> のidの値をexample.jsでクエリ取得し、example.js内でidを用いた計算を 行おうと思っています。 調べたところ、http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=47607&forum=28&4 のような情報はありましたが、scriptタグの事前にファイルを読み込ませると言った方法でした。 直接jsファイル内でクエリが読み込める方法がありましたら教えてくれませんか?

  • shellとWebでperlからphp(pukiwiki)を実行時、UTF8とBINARYとに扱いが別れ文字化けする問題

    以下のスクリプトをshellから $perl test.cgi として実行時、保存するファイルとSTDOUTされる文字列は共に文字化けせず表示されます。 また、phpの実行結果の文字コードをnkfコマンドで調べますとUTF8です。 Webからアクセスした場合、保存されるファイルとSTDOUTされる文字列は共に文字化けします。 nkfではBINARYと表示されます。 pukiwikiで出力される内容は、aaaと言う名称に対して半角英数字と日本語が混じった形で表示されるようにしております。(<span>aあ</span>みたいな形) bashの環境は $ printenv LANG=ja_JP.UTF-8 です。 pukiwikiのスクリプトの文字コードと出力は共にUTF-8です。 --------------------------------------------- #!/usr/bin/perl use utf8; use open ":utf8"; use open ":std"; BEGIN{ $| = 1; print "Content-type: text/html\n\n"; open(STDERR, ">&STDOUT"); } print <<EOM; <HTML lang=ja > <HEAD> <META http-equiv="Content-Type" content="text/html; charset=UTF-8"> <HEAD><BODY> EOM my$query_get; chdir '/.../pukiwiki/'; $query_get="aaa"; undef$ENV{'CONTENT_LENGTH'}; undef$ENV{'QUERY_STRING'}; undef$ENV{'REQUEST_METHOD'}; $ENV{'QUERY_STRING'} = $query_get; $ENV{'REQUEST_METHOD'} = 'GET'; `php /.../pukiwiki/index.php|lv -Ou8 >$query_get.cgi`; $t= `php /.../pukiwiki/index.php|lv -Ou8`; $val= `php /.../pukiwiki/index.php|nkf -g`; print $t; print "<br>"; print $val; print <<EOM; <BODY> <HTML> EOM 1; --------------------------------------------- やりたい事は、Webからアクセスした際、文字化けしないように表示させたいのですが、どのようにすれば可能でございますでしょうか また、shellとWebからでは、どうして文字コードの扱いが異なるのでしょうか どなた様かご教授ねがえませんでしょうか。宜しくお願いします。

    • ベストアンサー
    • Perl
  • htaccess mod_rewriteのドット

    ワードプレスをインストールし.htaccessをのぞいてみると以下のようにあります。 RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] 一番下のRewriteRuleは%{REQUEST_FILENAME}がルートディレクトリ直下にあるファイルやディレクトリでなければ、RewriteRule . /index.php [L]を実行するという理解でいいでしょうか? それとRewriteRule . /index.php [L]のドットはどういう意味でしょうか? ドットは一文字ということだとおもいますが、では、mysite.co.jp/kはmysite.co.jp/indx.phpに修正される?ということでしょうか?現状では、mysite.co,jp以下に適当な文字列を入力してmysite.co.jp/dgfdhgfghfdhなどとしてもそのURLのままサイトが表示されてしまいます。記事の部分は404NotFoundなのですが。。 情報はあるのですが、調べても混乱してしまうのでご存知でしたらよろしくお願いいたします。 Apache wordpress

    • 締切済み
    • PHP
  • Ajaxを使った読み込みができない

    ●質問の主旨 Ajax(非同期通信)を使って、 ブラウザ上でテキストファイルの読み込みを させたいのですが、できません。 Ajaxにお詳しい方、ご指導願います。 ●質問の補足 HTML5とjqueryの技術を使って、 テキストファイルの中身(Hello,World)の 読み込みをさせたいと考えております。 参考サイトにもとづいてやってますが、 画像の表示ができません。 表示させるためにはどうしたら良いでしょうか? ●コード <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>jQueryの練習</title> <script src="http://code.jquery.com/jquery-1.7.2.min.js"></script> </head> <body> <h1>jQueryの練習</h1> <div id="main"></div> <input type="button" id="kick_ajax" value="Ajax!"> <script> $(function() { $('#kick_ajax').click(function() { $('#main').load('contents.txt', function() { alert('読み込み終了!'); }); }); }); </script> </body> </html> ●テキストファイルのファイル名 contents.txt ●参考サイト(ドットインストール) http://dotinstall.com/lessons/basic_jquery/519

    • ベストアンサー
    • AJAX
  • iframe内のリンク先を動的に変更

    お世話になります。Crassicと申します。 index.html   ├about(about.html)   ├blog(index.php)   └link(link.html) といった構成の個人サイトを立ち上げております。 ここ最近、yahoo等の検索サイトからブログへ直でアクセスされ、嬉しい事なんですが私としてはTOPページである index.htmlを通して閲覧して欲しいと思ってます。 javascriptでindex.html以外のサイトからindex.phpへアクセスがあった場合はindex.htmlへ強制的に飛ばす スクリプトを色々調べて組み込んでおりましたが、そうするとお目当てのブログ記事に辿りつくのが困難で 読んでもらえないという状況に陥りました。 (アクセス解析より判明) index.htmlからiframeで読み出す場合は固定のindex.phpであり、常に最新の記事になります。 が、検索で来られた場合はindex.php?id=300と言うように検索内容によって変わります。 ですので、index.htmlへ下記のスクリプトを組み込めばいいのだと考えましたが、私の調べ方が悪いのか 見つかりませんでした。 1.document.referrerにてURL元を調べる 2.<iframe src="http://******.com/blog/index.php" name="main"></iframe>内のsrc部分をreferrerのURLに置き換える? 3.検索で来られた訳ではなく、ブックマーク等の場合はindex.phpを表示させる 4.index.php自体にブックマークされている場合もindex.htmlへ強制的に飛ばす この様な事がjavascriptで可能でしょうか? もしくは上記の方法でなくても私が考えている事ができる組み方はありますでしょうか? プロフェッショナルな皆様のお知恵をお借りしたく、書き込みさせて頂きました。 何卒宜しくお願い致します。

  • 自社サイトの管理をしているプログラム初心者です。

    自社サイトの管理をしているプログラム初心者です。 現在index.php内の一部分に、HTMLファイル(1点)読み込んで表示しているのですが、これを2~3点のHTMLファイルをランダムに表示するよう修正を加えたいと思っております。 調べてみたところ、現在「include」で読み込んでいるHTMLファイルの指定(下記参照)を、phpのスクリプトを記載した外部ファイルのテキストファイルの指定をするのが良いかと思ったのですが、肝心のスクリプトのサンプルが探せませんでした。そもそもこの方法で良いのかも正直不安です。 できるだけ簡単な方法と、必要な外部ファイルがありましたらスクリプトを教えてください。 <?php include("a.htm"); // ?>

    • ベストアンサー
    • PHP