読者です 読者をやめる 読者になる 読者になる

sidewalkcafe blog

日々是好日

BBQの代わりにプロキシチェック(PHP)

2chのBBQはゴタゴタがあった余波で外部参照ができなくなった。
便利だったのになあ・・・


使えなくなったのは仕方ないけど荒らしは待ってくれない
他のブラックリストを使って対処するしかない。
なのでそれに対応したコードを考えてみた。
(まあ、今までBBQだったアドレスを他のDNSBLのアドレスに変えれば良いだけなんだけどw)

<html>
<head>
  <title>DNSBLチェック</title>
</head>
<body>
  <form action="" method="get">
    テスト用IP<input type="text" value="" name="ip" /><br />
    <input type="text" value="" name="comment" />
    <input type="submit" value="コメント送信" />
  </form>
<?php
  $ip = '';

// IP取得
  if(isset($_GET['ip']) && $_GET['ip']!=null && filter_var($_GET['ip'],FILTER_VALIDATE_IP)){
    $ip=$_GET['ip'];
  }else{
    $ip = $_SERVER['REMOTE_ADDR'];
  }

// メインルーチン
  if(isset($_GET['comment']) && $_GET['comment']!=null){
    if(dnsbllookup($ip)){
      echo('ERROR! プロキシ経由のコメントは出来ません。<br>');
      echo('IP='.$ip);
      exit();
    }else{
      echo(htmlspecialchars($_GET['comment']).'<br>');
      echo('IP='.$ip);
      exit();
    }
  }

// DNSBLチェック
function dnsbllookup($ip){
  $dnsbl_lookup=array("all.rbl.jp",
    "bl.spamcop.net",
    "zen.spamhaus.org");
  if($ip){
    $reverse_ip=implode(".",array_reverse(explode(".",$ip)));
    foreach($dnsbl_lookup as $host){
      if(checkdnsrr($reverse_ip.".".$host.".","A")){
        return true;
      }
    }
  }
    return false;
  }
?>

$dnsbl_lookupに配列でDNSBLのアドレスを渡す。
有効なDNSBLDNSBL Lookupとかで探すと良い。
適当に使ってみたけど、抜けてるIPが多いので複数設定する必要がある様子。
とりあえず設定してある3つは2chで拾ってきたもの。