PerlからPHPに移植したアクセス制限

このQ&Aのポイント
  • CGIファイルをPHPに移植した際に発生したエラーの修正方法について教えてください
  • PerlからPHPに移植したスクリプトで発生したエラーの修正方法を教えてください
  • CGIファイルのスクリプトをPHPに変換した際に出るエラーの対処方法を教えてください
回答を見る
  • ベストアンサー

PerlからPHPに移植したアクセス制限

下記は、CGIファイルから持ってきたスクリプトをPHPに変換してみたものです。 エラーが出るの出ます-> Parse error: syntax error, unexpected '/', expecting ')' in /home/users/1/raindrop.jp-5247423/web/tsukushinbo/bbs/bbs_header.php on line 32 どう修正すれば教えていただきたいです。 <?php #----------------# # ホスト名取得 # #----------------# function get_host(){ $host = $_SERVER{'REMOTE_HOST'}; $addr = $_SERVER{'REMOTE_ADDR'}; if($gethostbyaddr){ if ($host === "" || $host === "$addr") { $host === gethostbyaddr(pack("C4", split(/\./, $addr)), 2); $host === gethostbyaddr(pack($addr)); } } if($host === "") { $host = $addr; } } ?>

  • PHP
  • 回答数2
  • ありがとう数7

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

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5078/13269)
回答No.2

> どこが間違ってるのか、ご指導いただけますか? 手元にテスト環境が無いので全て確認できていませんが、ありとあらゆる所にperlの構文が残っていて、PHPに変換できていないですね。 大きくは変数のスコープでしょうか。 functionの内外ではスコープが違うため外で定義した変数は中で参照できませんので、引数・戻り値として渡しましょう。

その他の回答 (1)

  • t_ohta
  • ベストアンサー率38% (5078/13269)
回答No.1

ファイルを端折っておられるのか、エラーメッセージにある32行目がどこに該当するのか分かりませんが、 $host === gethostbyaddr(pack("C4", split(/\./, $addr)), 2); のsplit部分のコーテーションが抜けているのが問題ではないでしょうか。 split("/\./", $addr)

beterugius
質問者

お礼

ご指摘、どうもありがとうございました。

beterugius
質問者

補足

ちなみに、アクセス制限のスクリプトを、全部書くと、下記のようなものになりますが、Perlの関数とPHPの関数で微妙に相違点があるので、うまく動作しないんだと思いますが、どこが間違ってるのか、ご指導いただけますか? ----------------------------------------------- <?php /////////////////////////////////// // アクセス制限(ホスト名を記述)// /////////////////////////////////// $deny = array( "", "", ); axs_check(); # ホスト名取得方式 # --> 0 : $ENV{'REMOTE_HOST'} # --> 1 : gethostbyaddr $gethostbyaddr = 1; // ホスト名が割り出されたかどうか→見つかったら1、見つからなかったら0 #----------------# # ホスト名取得 # #----------------# function get_host(){ $host = $_SERVER{'REMOTE_HOST'}; // REMOTE_ADDRで取得したIPアドレスをDNSで逆引きしたホスト名をあらわす。サーバによっては、REMOTE_HOSTを返さないものもあります。これはサーバの負荷を軽減するためです。 $addr = $_SERVER{'REMOTE_ADDR'}; // クライアントのIPアドレス if($gethostbyaddr){ // 指定したIPアドレスに対応するインターネットホスト名の取得に失敗したら($gethostbyaddrが0だった場合) if ($host === "" || $host === "$addr") { // $host === gethostbyaddr(pack("C4", split(/\./, $addr)), 2); $host = gethostbyaddr(pack("C4", preg_split("/\./", $addr)), 2); // pack→指定された引数を format に基づいて バイナリ文字列にパックします。 split→ドットをセパレータとして、配列に分解 // limit が指定された場合、返される配列には 最大 limit の要素が含まれます。この場合、 最後の要素には string の残りの部分が全て 入っています。. をセパレーターとして、IPアドレスを最大2つの要素の配列に分解し、それをバイナリ文字列にパック var_dump($host); } } if($host === "") { $host = $addr; } } //----------------// // アクセス制限 // //----------------// function axs_check(){ // ホスト名を取得 get_host(); $flag=0; for($i=0; $i<count($deny); $i++){ foreach($deny as $temp){ if(!$temp){ next($temp); } // $denyが空文字列""だったら、次に進む // $value =~ s/\*/\.\*/g; $pattern =~ 's/\*\.\*/g'; // *→直前の文字が0回以上複数回繰り返し出現するパターンとマッチ(正確には直前の文字および文字クラス)// s→文字列を単一行として扱う // g→マッチするものを全て見つける if(preg_match($pattern, $temp[$i])){ $flag=1; last; } // int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] ) pattern で指定した正規表現により subject を検索します。 見つかったら、フラグをオンにしループから抜ける } if($flag) echo("アクセスを許可されていません"); // フラグがオンなら、エラー出力 } } ?>

関連するQ&A

  • phpでのアクセス制限について

    $deny='.jp'; $host=gethostbyaddr($_SERVER["REMOTE_ADDR"]); if(strpos($host,$deny)===FALSE){ exit; とphpに記述して jp以外をアクセス制限しているのですが、これはスパム対策にも効果はあるのでしょうか? .htaccessが使えないので、phpに直接記述しています。

    • ベストアンサー
    • PHP
  • [perl・php]gethostbyaddrは重い?

    今まで、REMOTE_ADDRを取得してアクセスログに記録していたのですが、最近、下記の存在を知りました。 $host = gethostbyaddr(pack("C4", split(/\./, $ENV{'REMOTE_ADDR'})), 2); ただ、これで、多大な負荷がかかるようならやめようと思うのですが、どの程度の負荷になるのでしょうか? ご存知の方、回答、宜しくお願い致します。

    • ベストアンサー
    • Perl
  • PHP PCアクセス制限

    アクセス振り分けPHPですが、 以下のように直してみました。 ですが、 ↓こんなエラーが出てしまいました。 Parse error: syntax error, unexpected '}' in /index.php on line 89 <?php if (isDoCoMoIP()) { } if (isAuIP()) { } if (isSoftBankIP()) { } function isDoCoMoIP(){ require_once 'Net/IPv4.php';// PEAR Net_IPv4 { //DoCoMo のIP帯域をセット $ip_list = array( '210.153.84.0/24', '210.136.161.0/24', '210.153.86.0/24', '124.146.174.0/24', '124.146.175.0/24' ); foreach ($ip_list as $ip) { if (Net_IPv4::ipInNetwork($_SERVER['REMOTE_ADDR'], $ip)) { print "DoCoMo"; return true; } } } } function isAuIP(){ require_once 'Net/IPv4.php';// PEAR Net_IPv4 { // au のIP帯域をセット $ip_list = array( '210.230.128.224/28', '121.111.227.160/27', '61.117.1.0/28', '219.108.158.0/27', '219.125.146.0/28', '61.117.2.32/29', '61.117.2.40/29', '219.108.158.40/29', '219.125.148.0/25', '222.5.63.0/25', '222.5.63.128/25', '222.5.62.128/25', '59.135.38.128/25', '219.108.157.0/25', '219.125.145.0/25', '121.111.231.0/25', '121.111.227.0/25', '118.152.214.192/26', '118.159.131.0/25', '118.159.133.0/25' ); foreach ($ip_list as $ip) { if (Net_IPv4::ipInNetwork($_SERVER['REMOTE_ADDR'], $ip)) { print "au"; return true; } } } } function isSoftBankIP(){ require_once 'Net/IPv4.php';// PEAR Net_IPv4 { //SoftBank のIP帯域をセット $ip_list = array( '123.108.236.0/24', '123.108.237.0/27', '202.179.204.0/24', '202.253.96.224/27', '210.146.7.192/26', '210.146.60.192/26', '210.151.9.128/26', '210.169.130.112/28', '210.175.1.128/25', '210.228.189.0/24', '211.8.159.128/25' ); foreach ($ip_list as $ip) { if (Net_IPv4::ipInNetwork($_SERVER['REMOTE_ADDR'], $ip)) { print "SoftBank"; return true; } } } } return false; } print "PC"; ?>

    • 締切済み
    • PHP
  • ページのアドレスを取得する記述方法を教えてください。

    たとえば、IP、HOSTを取得するには、 $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; if(!$host && $addr){ $host = (gethostbyaddr(pack("C4",split(/\./,$addr)),2))[0]; } と記述して、 センドメール部分に、 $host , $addrをどこかに記述します。 これと同じように、ページのアドレスを取得する記述はどうすればいいのか教えてください。

    • 締切済み
    • CGI
  • [PHP]PCアクセス制限について

    以下のように設定しましたが、「89」番目がエラーになってしまいます。 何が原因なのでしょうか? Parse error: syntax error, unexpected $end in /index.php on line 89 <?php if (isDoCoMoIP()) { } if (isAuIP()) { } if (isSoftBankIP()) { } function isDoCoMoIP(){ { require_once 'Net/IPv4.php';// PEAR Net_IPv4 //DoCoMo のIP帯域をセット $ip_list = array( '210.153.84.0/24', '210.136.161.0/24', '210.153.86.0/24', '124.146.174.0/24', '124.146.175.0/24' ); foreach ($ip_list as $ip) { if (Net_IPv4::ipInNetwork($_SERVER['REMOTE_ADDR'], $ip)) { print "DoCoMo"; return true; } } } function isAuIP(){ { require_once 'Net/IPv4.php';// PEAR Net_IPv4 // au のIP帯域をセット $ip_list = array( '210.230.128.224/28', '121.111.227.160/27', '61.117.1.0/28', '219.108.158.0/27', '219.125.146.0/28', '61.117.2.32/29', '61.117.2.40/29', '219.108.158.40/29', '219.125.148.0/25', '222.5.63.0/25', '222.5.63.128/25', '222.5.62.128/25', '59.135.38.128/25', '219.108.157.0/25', '219.125.145.0/25', '121.111.231.0/25', '121.111.227.0/25', '118.152.214.192/26', '118.159.131.0/25', '118.159.133.0/25' ); foreach ($ip_list as $ip) { if (Net_IPv4::ipInNetwork($_SERVER['REMOTE_ADDR'], $ip)) { print "au"; return true; } } } function isSoftBankIP(){ { require_once 'Net/IPv4.php';// PEAR Net_IPv4 //SoftBank のIP帯域をセット $ip_list = array( '123.108.236.0/24', '123.108.237.0/27', '202.179.204.0/24', '202.253.96.224/27', '210.146.7.192/26', '210.146.60.192/26', '210.151.9.128/26', '210.169.130.112/28', '210.175.1.128/25', '210.228.189.0/24', '211.8.159.128/25' ); foreach ($ip_list as $ip) { if (Net_IPv4::ipInNetwork($_SERVER['REMOTE_ADDR'], $ip)) { print "SoftBank"; return true; } } } return false; } print "PC"; ?>

    • ベストアンサー
    • PHP
  • Perlを使ったアクセス制限方法

    CGIのページにアクセス制限を掛けたいと思い 検索エンジンを使い色々探しまして下記のアクセス制限方法を見つけました。 http://easycgi.xrea.jp/perltips/acclimit.htm を参照して CGIの最初(#!/usr/bin/perl の次の行)に下記スクリプトを埋め込みました。 sub check { @hosts = ('hoge.ne.jp','hoge.co.jp'); $host = gethostbyaddr(pack("C4", split(/\./, $ENV{'REMOTE_ADDR'})), 2) || $ENV{'REMOTE_ADDR'}; foreach $i (@hosts) { if ($host =~ /$i/) { print "アクセスが許可されていません。\n"; exit; } } } リモートホストでアクセス制限を行いたいのですが 上記の方法を試しても、hoge.ne.jpとhoge.co.jpからアクセス出来てしまいました。 htaccessを使わずにCGIページへアクセス制限を掛ける方法はないでしょうか? 何かアドバイス頂けると助かります。

  • PHPについて

    xamppをインストールしてPHPの学習をしております。 そこで、 PHPについて以下2つの質問があります。 質問1 関数の引数について <?php phpinfo(); ?> は、phpの情報を表示するスクリプトですが、関数の()の中に 引数を書くときは、引数を""で囲む場合と囲まない場合はあるのでしょうか? 質問2 エラーについて ファイル名:client.php <?php print "あなたのIP:"; print getenv("REMOT_ADDR"); print "<BR>" print "あなたのホスト名"; print gethostbyaddr(getenv("REMOTE_ADDR")); ?> 上記スクリプトを作成して、http://localhost/client.phpとブラウザ で実行したところ、 Parse error: syntax error, unexpected T_PRINT in C:\xampp\htdocs\client.php on line 5 というメッセージが表示され、5行目【print "あなたのホスト名";】を何回も見ていますが、 何も間違っていない気がします。何が間違っているのでしょうか? どなたかご教授下さい。

    • ベストアンサー
    • PHP
  • IP/ホスト連続投稿チェック機能が上手く行かない。

    なんでだろ?? ###+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ## SUB >>> ホスト取得処理 ###+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ sub get_HostAgent { $Host = $ENV{'REMOTE_HOST'}; $Addr = $ENV{'REMOTE_ADDR'}; if ($Host eq '') { $Host = $Addr; } if ($Host eq $Addr) { $Host = gethostbyaddr(pack('C4',split(/\./,$Host)),2) || $Addr; } $H_A = "$Host"; } ホスト取得ルーチンにある変数で、 いろんな掲示板の中のP/ホスト連続投稿チェック機能だけ抜き出して、 もう何十個も試したけれど、上手くいきません。 カスタマイズしてる会員掲示板に、 IP/ホスト連続投稿チェック機能を付けたいのですが上手くいきません。 二重投稿チェックはあるのですが、、 ↓↓↓ #--二重投稿チェック--# if ($r1 eq "$name" && $r4 eq "$street<>$title" && $r5 eq "$comment") { &lock2; &error("二重投稿は禁止です"); } より極めるために、以下を利用したいのです。。 ↓↓↓ #--IP/ホスト連続投稿チェック--# if ($Addr = $ENV{'REMOTE_ADDR'} && $^T - $time < 120) { &lock2; &error("連続投稿はできません。<BR>時間をおいてから書き込みして下さい");} 宜しくお願い致します。 どこがおかしいのかサッパリです。 なんとか機能を追加できるようにお願いしますろ

    • 締切済み
    • CGI
  • 【 REMOTE_HOSTの値の取得方法について 】

    既製のCGIを設置するのがイッパイイッパイの 初心者ですm(__)m REMOTE_HOSTの値を取得して表示させたいのですが 当方レンタル中のサーバーの初期設定では取得できず 下記の如くの手順で取得するように表示してありましたが どうにも理解できず困っております。 下記の「Perl内」とは何処の事を指しているのか アドバイスを頂きたくお願い申し上げます。 ****以下、該当サーバーの説明文引用***** 【 REMOTE_HOSTの値の取得方法について 】 レンタルサーバーの処理速度を優先して、初期状態ではIPアドレスからDNSの参照をしないように設定している為、REMOTE_HOSTの値を取得したい場合はPerl内で下記の記述をして下さい。 $addr = $ENV{'REMOTE_ADDR'}; $host = gethostbyaddr(pack('C4',split(/\./,$addr)),2) || $addr;

    • ベストアンサー
    • Perl
  • CGIにてソフトバンクがPCとして認識されます。

    掲示板のCGIなのですが、ソフトバンクではPC画面へ飛ばされてしまいます。下記の部分あたりではないかと思うのですが、書き直しで解決できるのでしょうか?このCGIを使いたいので、お願い致します。 #▼ホスト名・UA取得 $HOST = $ENV{'REMOTE_HOST'}; $ADDR = $ENV{'REMOTE_ADDR'}; $UA = $ENV{'HTTP_USER_AGENT'}; $SN = $ENV{'HTTP_X_UP_SUBNO'}; if ($UA =~ /^DoCoMo\/\d/) { $AGEN = "i-mode"; }elsif ($UA =~ /^Vodafone\/\d/) { $AGEN = "Vodafone"; }elsif (($UA =~ 'UP.B') && ($SN ne "")){ $AGEN = "AU"; }else { $AGEN="PC";} if ($UA =~ /Mozilla\/|MSIE|Netscape|Opera|Lynx|AOL|Gecko/) {$AGEN="PC";} if ($HOST eq '') { $HOST = $ADDR; } if ($HOST eq $ADDR) { $HOST = gethostbyaddr(pack('C4',split(/\./,$HOST)),2) || $ADDR; }

    • 締切済み
    • CGI

専門家に質問してみよう