Преобразование GET в POST, чтобы боты не мешали голосам - PullRequest
2 голосов
/ 10 января 2011

Я управляю сайтом, который использует qdbs 1.10, чтобы предложить базу данных котировок на основе PHP с голосами. Голосование осуществляется через GET, в результате чего боты голосуют по кавычкам случайно. Чтобы избежать этого, я бы хотел преобразовать запросы 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>]

Редактировать: Идея заменить GET на POST пришла этот связанный вопрос .

В любом случае я бы хотел использовать AJAX для голосования, поэтому, конечно, было бы неплохо и решение на основе AJAX.

Ответы [ 2 ]

2 голосов
/ 10 января 2011

Я предполагаю, что вы говорите о сканерах, а не о спам-ботах. Вы не помешаете спам-боту «нажимать» на кнопки, переключаясь на 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>
1 голос
/ 10 января 2011

Я думаю, что лучшее решение для вас (надеюсь, что другие чувствуют то же самое) - это изменить 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>]  

Функция 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%.

...