PHP

アンケートツール[ソースファイル] – スパム対策強化版

投稿日:

アンケートツールのソースファイルです。
詳しい内容、及び最新バージョンについては、以下を参照してください。
アンケートツール(ご意見箱)[詳細] 旧版ソース
V0.7

PHPソースファイル -V0.8-
<?php
//##システム内容###################################################################
//■システム名               :アンケートツール V0.8.0
//■システム概要             :サイトの評価をアンケート形式で収集を行い、
//                            CSV形式でデータの出力を行う
//■実装機能スパム対策       :リファラ(投稿ページ)チェック、NGワード、重複チェック、
//                            指定IPアドレス拒否機能
//■著作権                   :(C)さすけ
//■更新日                   :2010/07/29
//##################################################################################


//#環境設定################################
//最大コメント文字数
$coment_length = 200;

//コメント禁止ワード(カンマ区切りで複数指定可)
//例:"http://,abc"等
$ng_data = "";

//アクセス拒否IP(カンマ区切りで複数指定可)
//例:"127.0.0.1"等
$ng_ip = "";

//出力CSVファイル名
$file_name = "./data/anke_data.php";

//重複チェック用ファイル名
$file_ck = "./data/ck_data.php";

//サイトのURL記載、ここに記載のURL意外からの投稿を拒否する
$site_url = "sasuke.main.jp";

//重複拒否時間(秒数で指定)で指定
$out_time = 300;
//#########################################

//

//以降変更の必要はありません。-------------------------------

//##グローバル変数定義#####################
$data1 = "";
$data2 = "";
$data3 = "";
$link  = "";
$host  = "";
$agent = "";
//#########################################


mb_language("Japanese");
mb_internal_encoding ("SJIS");

//HTML内容出力
echo "<html>";
echo "<head>";
echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\">";
echo "<title>アンケート調査</title>";
echo "</head>";
echo "<body>";
echo "<CENTER><FONT size=\"+2\"><B>アンケート調査</B></FONT></CENTER><BR>";

$err = 0;
//入力チェック
$err = input_ck();

//入力内容格納
if($err != 1){
   $err =  data_input();
}

//投稿者環境情報取得
if($err != 1){
   $err =  data_input2();
}
//重複チェック
if($err != 1){
   $err =  t_ck($file_ck,$host);
}

//ファイル出力処理
if($err != 1){
   $err =  file_out();
}

//HTMLフッター出力
finish_out();


//##############################################
// ■ 入力チェック
//##############################################
function input_ck() {
   $errflg = 0;

    //
    if(stristr($_SERVER["HTTP_REFERER"],$GLOBALS["site_url"])){
    }else{
         echo "アンケート収集に失敗しました。";
         $errflg = 1;
         return $errflg;
    }

    if(isset($_POST['sen1'])){
    }else{
         echo "デザイン評価が未選択です。<BR>";
         $errflg = 1;
    }

    if(isset($_POST['sen2'])){
    }else{
         echo "内容評価が未選択です。<BR>";
         $errflg = 1;
    }

    if(strlen($_POST['coment1']) > $GLOBALS["coment_length"]) {
         echo "コメント上限文字数[200文字]をオーバーしています。<BR>";
         $errflg = 1;
    }
    if ($GLOBALS["ng_data"] != ""){
         $ng_c = spliti(",", $GLOBALS["ng_data"]);

         for ($i = 0; $i < count($ng_c); $i++) {
        
            if(stristr($_POST['coment1'],$ng_c[$i])){
               echo "アンケート収集に失敗しました。";
               $errflg = 1;
            }
         }

   }
    if ($GLOBALS["ng_ip"] != ""){
         $ng_p = spliti(",", $GLOBALS["ng_ip"]);

         for ($i = 0; $i < count($ng_p); $i++) {
        
            if(stristr($_SERVER["REMOTE_ADDR"],$ng_p[$i])){
               echo "アンケート収集に失敗しました。";
               $errflg = 1;
            }
         }

   }

   return $errflg;
}



//##############################################
// ■ 投稿内容格納
//##############################################
function data_input() {
   $errflg = 0;
   if($_SERVER["REQUEST_METHOD"]=="POST"){
      $GLOBALS["data1"] = $_POST['sen1'];
      $GLOBALS["data2"] = $_POST['sen2'];
      $GLOBALS["data3"] = $_POST['coment1'];
  }else{
      echo "アンケート受け付けに失敗しました。";
      $errflg = "1";
  }

  return $errflg;

}

//##############################################
// ■ 投稿者の環境状況取得
//##############################################
function data_input2() {
   $errflg = 0;
   //(1)リンク元(投票ページ取得)
   if( $_SERVER["HTTP_REFERER"] ){
      $GLOBALS["link"] = $_SERVER["HTTP_REFERER"];
   } else{ //リンク元が取得出来ない
      $GLOBALS["link"] = "";
   }

   //(2)投票IPアドレス
   $GLOBALS["host"] = $_SERVER["REMOTE_ADDR"];

   //(3)ブラウザ情報取得
   $GLOBALS["agent"] = $_SERVER["HTTP_USER_AGENT"];
   //****************************

   return $errflg;
}
//#############################################
//■重複投稿チェック
//#############################################
function t_ck($fileck_name,$ip) {
   $errflg = 0;
   $fp  = "";
   $fp2 = "";
   //ファイルを開く
   $fp = fopen($fileck_name,"r");
   if ($fp){
       //チェックファイルの読み込み
       while (! feof ($fp)) {
          $load_key = fgets ($fp, 4096) ;
       }
       $load_key_data = spliti( ",", $load_key );

       //[IP + 年月日]のMD5生成
       $key_ca = "";
       $key = "";
       $key_time = 0;
       $key_ca .= date('Y年m月d日') . $ip;
       $key = md5($key_ca);

       //経過秒数取得
       $key_time_h = date('H');
       $key_time_i = date('i');
       $key_time_s = date('s');
       $key_time = ((int)$key_time_h * 3600) + ((int)$key_time_i * 60) + $key_time_s;


       if($key != $load_key_data[0]){
          $errflg = 0;
       }
       if($key == $load_key_data[0]){
          $time_out_ca = 0;
          $time_out_ca = (int)$load_key_data[1]  + $GLOBALS["out_time"];
          if($time_out_ca < $key_time){
              $errflg = 0;
          }else{
              $errflg = 1;
          }
       }
       
       
       if($errflg == 0){
           //チェックOK処理(チェックファイル更新処理)
           fclose ($fp) ;
           $body = "";
           $body .=  "<?php echo \"参照不可\"; exit; ?>\n"; 
           $body .= $key . ","  .$key_time . "," .$time_out_ca;
           $fp2 = fopen($fileck_name,"w");
           if ($fp2){
               if (flock($fp2, LOCK_EX)){
                   if (fwrite($fp2,  $body) === FALSE){
                       $errflg = "1";
                       echo "アンケート収集に失敗しました。";
                       echo "<BR>時間を置いてから再度投稿をお願い致します。";
                   }else{
                 
                   }
                    flock($fp2, LOCK_UN);
                }else{
                    $errflg = "1";
                    echo("アンケート収集に失敗しました。");
                    echo("<BR>時間を置いてから再度投稿をお願い致します");
                }
           }
       }else{
            echo "アンケート収集に失敗しました。";
            echo "<BR>時間を置いてから再度投稿をお願い致します。";
           }
   
      }else{
      //ファイル読み込み失敗時処理
      //チェックファイルが存在しない場合の処理
      $errflg = "1";
      echo "アンケート収集に失敗しました。";
      echo "<BR>時間を置いてから再度投稿をお願い致します。";
      }
   return $errflg;
}

//#############################################
// ■アンケートファイル出力処理
//#############################################
function file_out() {
   $body = "";
   //*評価情報****************************
   $body .= date("Y/m/d") .",";       //日付
   $body .= date("H:i:s") .",";       //時刻
   $body .= "\"" . $GLOBALS["data1"] ."\"" .","; //デザイン評価
   $body .= "\"" . $GLOBALS["data2"] ."\"" .","; //内容評価
   
   //特殊文字無効処理
   $body2 = "";
   $body2 = ereg_replace("\r|\n","",$GLOBALS["data3"]);
   $body2 = str_replace(",","",$body2);

   $body .= "\"" . $body2 ."\"" .","; //コメント

   //*投稿者情報****************************
   $body .= "\"" . $GLOBALS["link"] ."\""  .","; //ページ情報
   $body .= "\"" . $GLOBALS["host"] ."\""  .",";  //ホスト名
   $body .= "\"" . $GLOBALS["agent"] ."\""  ."\n"; //ブラウザ情報

   //*ファイル出力****************************
   $fhn = fopen($GLOBALS["file_name"],"a");
   if ($fhn){
      if (flock($fhn, LOCK_EX)){
        if (fwrite($fhn,  $body) === FALSE){
            echo "アンケート収集に失敗しました。";
            echo "<BR>時間を置いてから再度投稿をお願い致します。";
        }else{
            echo "アンケート収集しました。";
            echo "<BR>ご意見、ありがとうございました。";
        }

        flock($fhn, LOCK_UN);
       }else{
           echo "アンケート収集に失敗しました。";
           echo "<BR>時間を置いてから再度投稿をお願い致します";
       }
   }
}
?>

<?php
function finish_out() {

   echo "</div>";
   echo "</body>";
   echo "</html>";
}
?>
HTMLソースファイル
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<META http-equiv="Content-Style-Type" content="text/css">
<TITLE>ご意見箱</TITLE>
</HEAD>
<BODY>

<script type="text/javascript"> 
function pop(obj) {
wobj = window.open("", "pop","scrollbars=yes,width=480,height=360");
obj.target = "pop";
wobj.focus();
return true;
}
</script>

<!-- ファイル位置に合わせて、actionを変更 -->
<form method="POST" action="anke.php" target="pop" onsubmit="return pop(this)">

      <TABLE>
          <TBODY>
              <TR>
                 <TD bgcolor="#6888f7" colspan="2" align="center">
                 <FONT color="#ffffff" size="+1"><B>ご意見箱</B></FONT></TD>
              </TR>
              <TR>
                 <TD bgcolor="#ffffff" align="left" colspan="2">
                  皆様のご意見を頂けると幸いです。<BR><BR><BR>
                 </TD>
             </TR>
             <TR>
                 <TD bgcolor="#9bb0f9"><FONT size="-1">
                    ■デザイン</FONT><FONT color="#ff0000" size="-1">(必須)</FONT>
                 </TD>
                 <TD bgcolor="#ffffff" width="204">
                     <input type="radio" name="sen1" value="良い">良い
                     <input type="radio" name="sen1" value="普通">普通
                     <input type="radio" name="sen1" value="悪い">悪い
 
                </TD>
            </TR>
            <TR>
                <TD bgcolor="#9bb0f9"><FONT size="-1">
                   ■</FONT><FONT color="#000000" size="-1">内容</FONT>
                    <FONT color="#ff0000" size="-1">(必須)</FONT>
                </TD>
                <TD bgcolor="#ffffff" width="204">
                     <input type="radio" name="sen2" value="良い">良い
                     <input type="radio" name="sen2" value="普通">普通
                     <input type="radio" name="sen2" value="悪い">悪い
               </TD>
            </TR>
            <TR>
               <TD bgcolor="#9bb0f9"><FONT size="-1">
                  ■</FONT><FONT color="#000000" size="-1">コメント(任意)<BR>
                  </FONT></TD>
               <TD bgcolor="#ffffff" width="204">
                  <textarea name="coment1" cols="60" rows="5"></textarea>
              </TD>
            </TR>
            <TR>
               <TD colspan="2" align="center"><input type="submit" value=" 投票 "> 
                 <input type="reset" value=" リセット "></TD>
           </TR>
        </TBODY>
      </TABLE>
      </FORM>
</BODY>
</HTML>

-PHP
-,

Copyright© さすけのプログラミング入門 , 2018 All Rights Reserved.