2011-01-10 7 views
2

Ich betreibe eine Website, die qdbs 1.10 verwendet, um eine PHP-basierte Angebotsdatenbank mit Votes anzubieten. Die Abstimmung wird über GET durchgeführt, was dazu führt, dass Bots aus Versehen über Zitate abstimmen. Um dies zu vermeiden, möchte ich die GET-Anfragen in POSTs konvertieren.Konvertieren von GET zu POST, um zu vermeiden, dass Bots Stimmen vermasseln

Ich bin ein Neuling bei PHP und Web-Entwicklung im Allgemeinen. Ist es möglich, diese Chance mit minimalem Wissen zu erfüllen? Gibt es irgendwelche Muster zu folgen, oder haben Sie einige Hinweise, wie es geht?

(Ich ändere robots.txt als vorübergehende Lösung, aber dies das zugrunde liegende Problem nicht lösen.)

Edit: Dies ist der relevante Abschnitt des Codes zu sein scheint. Ich habe das natürlich nicht selbst geschrieben, und ich kann es nur nachvollziehen, indem ich rate, was passieren könnte - ich habe nie ein Wort von PHP gelernt.

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

Edit: Die Idee mit POST this related question kam zu ersetzen GET.

Mit AJAX zu stimmen ist etwas, das ich sowieso gerne machen würde, also wäre natürlich auch eine AJAX-basierte Lösung großartig.

+2

Können Sie uns den aktuellen PHP-Code zur Verfügung stellen?Es sollte einfach genug sein, es von GET zu POST –

+0

zu ändern, es ist keine PHP-Frage. GET to POST-Konvertierung wird im HTML-Code vorgenommen. Gehe zu Abbildung –

+0

Es ist eine PHP-Frage, da er den PHP-Code auch bearbeiten muss, um das $ _POST-Feld und nicht das $ _GET-Feld zu lesen. –

Antwort

1

Ich denke, die beste Lösung für Sie (hoffentlich andere fühlen das gleiche) ist es, den HTML-Code zu ändern, die jeder + Links - durch eine AJAX-Funktion Zeichen dafür, dass die Abstimmung, zum Beispiel tun:

stattdessen diesen Code aufweist:

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

Sie etwas davon haben:

[<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 e JS Funktion etwas ähnlich wie diese aussehen soll:

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(); 
} 

Soweit ich weiß, in der Regel, Crawler nicht laufen JavaScript-Funktionen. Aber ich bin mir nicht 100% sicher.

+0

Dies gilt nicht für diejenigen ohne JS. – DampeS8N

+0

Was meinst du damit? –

+0

Ich glaube auch, dass js-basierte Links verhindern, dass Bots ihnen normalerweise folgen. Ich habe js nie gelernt, aber ich denke, ich kann Ihrem Codebeispiel folgen, und ich werde versuchen, es zur Seite hinzuzufügen. – mafu

2

Ich nehme an, Sie sprechen über Crawler und nicht Spam-Bots. Sie werden einen Spam-Bot nicht daran hindern, auf Ihre Buttons zu klicken, indem Sie zu POST wechseln. Es klingt jedoch so, als ob auf Ihre Links, die GET-Abfragezeichenfolgen verwenden, geklickt wird.

GET/POST ist nicht das Problem. Ein Link ist ein Link. Sie können einen Crawler nicht daran hindern, auf sie zu klicken. Und Formulare sind Formen, Sie können Wahlprüfer oder Spam-Bots nicht davon abhalten, Ihre Formulare zu hämmern.

Um das Linkproblem zu lösen, müssen Sie Ihre Links durch Formulare ersetzen. Formulare werden von den meisten Crawlern normalerweise nicht gesendet, und sicherlich nicht von verantwortlichen, wenn Sie ihnen sagen, dass sie diese Seiten nicht in robots.txt crawlen sollen. Sie können sogar weiterhin GET verwenden. Sie müssen nur ein Formular verwenden.

<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

Viele Sachen werden Ihre Form treffen. Legen Sie ein Formular für einen Tag auf eine Seite, und ich würde erwarten, dass es ein Dutzend Mal "ausgefüllt" wird. Selbst wenn Sie nur Submit-Buttons haben, wird es die ganze Zeit über von Bots getestet, die für ein E-Mail-Relay testen. – Brad

+0

@Brad: Das habe ich auch schon in meiner Antwort angesprochen. In diesem Fall klicken Google-Crawler jedoch auf seine Links. – DampeS8N

+0

Könnten Sie ein Beispiel hinzufügen, wie Code, der Formulare verwendet, aussieht? – mafu