2011-01-10 5 views
2

投票でPHPベースの引用データベースを提供するqdbs 1.10を使用するサイトを実行しています。投票はGETによって実行され、ボットには偶然にも引用符で投票されます。これを避けるために、GET要求をPOSTに変換したいと思います。ボットの台無しの投票を防ぐためにGETをPOSTに変換する

私はPHPの完全な初心者であり、一般的なWeb開発です。最小の知識でこのチャンスを実行することは可能ですか?何かパターンがありますか、それを行う方法についていくつかのヒントがありますか?

は(私は一時的な解決策としてのrobots.txtを変更していますが、これは根本的な問題を解決していません。)

編集:これは、コードの該当部分であるように思われます。私はもちろんこれを書きませんでした。何が起こっているのかを推測するだけで済むのです。私はPHPという言葉を一度も学んだことはありませんでした。

のindex.php

if ($_GET['do'] || $_POST['do']) { 
    switch ($_GET['do']) { 
     case 'rate': 
      $sql = "SELECT ip FROM ".$_qdbs[tpfx]."votes WHERE id='".mysql_real_escape_string($_GET['q'])."' AND ip='$ip'"; 
      $a = $db->_sql($sql); 
      $row = $db->fetch_row($a); 
      if ($row['ip'] != $ip) { 
       if ($_GET['r'] == 'good') { 
        $sql = "UPDATE ".$_qdbs[tpfx]."quotes SET rating=rating+1 WHERE id='".mysql_real_escape_string($_GET['q'])."'"; 
        $a = $db->_sql($sql); 
        $sql = "INSERT INTO ".$_qdbs[tpfx]."votes (id,ip) VALUES ('".mysql_real_escape_string($_GET['q'])."', '".mysql_real_escape_string($ip)."')"; 
        $a = $db->_sql($sql); 
       } 
       elseif ($_GET['r'] == 'bad') { 
        $sql = "UPDATE ".$_qdbs[tpfx]."quotes SET rating=rating-1 WHERE id='".mysql_real_escape_string($_GET['q'])."'"; 
        $a = $db->_sql($sql); 
        $sql = "INSERT INTO ".$_qdbs[tpfx]."votes (id,ip) VALUES ('".mysql_real_escape_string($_GET['q'])."', '".mysql_real_escape_string($ip)."')"; 
        $a = $db->_sql($sql); 
       } 
      } 
      header("Location: ".$ref); 
      break; 
    } 
... 

quote_rate.tpl

[<a href="?do=rate&q=<?php echo $q_id;?>&r=good" title="Rate as good"><b>+</b></a>|<a href="?do=rate&q=<?php echo $q_id;?>&r=bad" title="Rate as bad"><b>-</b></a>] 

編集:POSTとGET交換するアイデアはthis related questionを来ました。

投票にAJAXを使用すると、とにかくやってみたいことです。もちろん、AJAXベースのソリューションも素晴らしいでしょう。

+2

現行のPHPコードを提供できますか?それはGETからPOSTに変更するのに十分なはずです –

+0

PHPの質問ではありません。 GETからPOSTへの変換はHTMLコードで行われます。 Go figure –

+0

$ _GETフィールドではなく$ _POSTフィールドを読むためにPHPコードを編集する必要があるので、PHPの質問です。 –

答えて

1

私はあなたのための最善の解決策は、(うまくいけば他の人が同じように感じる)各+にリンクHTMLコードを変更することだと思います - 例えば、投票を行いますAJAX機能によって記号:

代わりにこのコードを持つの:

[<a href="javascript:rateQuote('good',<?php echo $q_id;?>)" title="Rate as good"><b>+</b></a>|<a href="javascript:rateQuote('bad',<?php echo $q_id;?>)" title="Rate as bad"><b>-</b></a>] 

のTh:

[<a href="?do=rate&q=<?php echo $q_id;?>&r=good" title="Rate as good"><b>+</b></a>|<a href="?do=rate&q=<?php echo $q_id;?>&r=bad" title="Rate as bad"><b>-</b></a>] 

あなたはこのようなものを持っていますe JS関数は次のようになります。

function rateQuote(vote,id) { 
if (window.XMLHttpRequest) 
    {// code for IE7+, Firefox, Chrome, Opera, Safari 
    xmlhttp=new XMLHttpRequest(); 
    } 
else 
    {// code for IE6, IE5 
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
xmlhttp.onreadystatechange=function() 
    { 
    if (xmlhttp.readyState==4 && xmlhttp.status==200) 
    { 
       //if you want to include a 'success' message, this is the place 
    } 
    } 
xmlhttp.open("GET","index.php?do=rate&q="+id+"r="+vote,true); 
xmlhttp.send(); 
} 

私が知る限り、一般に、クローラはjavascript関数を実行しません。しかし、私は100%確信していません。

+0

これは、JSがない人は考慮しません。 – DampeS8N

+0

それはどういう意味ですか? –

+0

私はまた、jsベースのリンクはボットがそれらに続くのを防ぐのを信じています。私はjsを学んだことはありませんでしたが、私はあなたのコードサンプルに従うことができると私は思う、私はサイトに追加しようとします。 – mafu

2

私は、あなたがクローラについて話しており、スパムボットではないと仮定しています。 POSTに切り替えることでボタンを「クリック」することからスパムボットを止めることはありません。しかし、あなたのリンクのように聞こえる、GETクエリ文字列を使用して、 'クリックされている'。

GET/POSTは問題ではありません。リンクはリンクです。クローラのクリックを停止することはできません。フォームはフォームなので、投票リガーやスパムボットがフォームを叩くのを止めることはできません。

リンクの問題を解決するには、リンクをフォームに置き換える必要があります。フォームは、通常、ほとんどのクローラによって送信されるのではなく、robots.txt内のページをクロールしないように指示した場合は、責任あるものではありません。 GETを引き続き使用することもできます。フォームを使用するだけです。

<form action="?do=rate&q=<?php echo $q_id;?>&r=good"> 
    <input type="submit" name="up" value="up" /> 
</form> 
<form action="?do=rate&q=<?php echo $q_id;?>&r=bad"> 
    <input type="submit" name="down" value="down" /> 
</form> 
+0

多くのものがあなたのフォームに当てはまります。一日の間、ページにフォームを書いてください。そして、私はそれが何十回も "充満"すると思っています。ボタンを送信したばかりであっても、電子メールリレーをテストしているボットからは常にヒットします。 – Brad

+0

@ブラッド:私はすでに私の答えでそれに対処しました。しかし、彼の場合、Googleのクローラは彼のリンクをクリックしています。 – DampeS8N

+0

フォームの外観を使用するコードの例を追加できますか? – mafu

関連する問題