2011-01-10 24 views
2

我正在運行一個使用qdbs 1.10提供基於PHP的投票數據庫的網站。投票是通過GET實現的,導致機器人偶然對報價進行投票。爲了避免這種情況,我想將GET請求轉換爲POST。將GET轉換爲POST以避免殭屍投票

我是一個完整的PHP新手,一般網頁開發。是否有可能用最少的知識來完成這個機會?是否有任何模式要遵循,或者你有如何做到這一點的提示?

(我改變的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 – 2011-01-10 14:40:03

+0

這不是PHP的問題。在HTML代碼中進行GET到POST轉換。去圖 – 2011-01-10 14:46:14

+0

這是一個PHP問題,因爲他必須編輯PHP代碼以讀取$ _POST字段而不是$ _GET字段。 – 2011-01-10 14:51:41

回答

1

我認爲你最好的解決辦法(希望別人有同樣的感覺)是更改HTML代碼鏈接到每個+ - 通過AJAX功能的標誌,將做投票,例如:

而無需驗證碼:

[<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>] 

你有這樣的事情:

[<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>] 

釷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%肯定的。

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>