Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » накрутка голосов на сайте

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуй, у меня есть проблема с сайтом.
на нем начали накручивать голоса....
т.е.: есть бд, где хранится IP пользователя.
но их по всей видимости меняют, и таким образом накручивают.
 
как защититься от накрутки?

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 20:54 23-11-2014
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar
Защита форм от роботов (скрипт)

Всего записей: 15595 | Зарегистр. 20-09-2014 | Отправлено: 21:30 23-11-2014
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
нет, не то.
накрутка не роботом, а пользователем.
капчи там стоят....
там накрутка изза того, что пользователь меняет ип(

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 21:32 23-11-2014
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar

Цитата:
там накрутка изза того, что пользователь меняет ип

только регистрация.

Всего записей: 15595 | Зарегистр. 20-09-2014 | Отправлено: 21:33 23-11-2014
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
я не могу понять, как тут смогли накрутить.
 

Код:
if(isset($_POST["vote"]))
{
    $connect = mysql_query("SELECT * FROM `server` WHERE `id` = '$_POST[vote]'");
    $serv = mysql_fetch_object($connect);
    
    if($serv)
    {
        $connect = mysql_query("SELECT `id` FROM `vote` WHERE `ip` = '". $userip ."'");
        $vote = mysql_fetch_object($connect);
        $addvote = true;
        
        if($vote)
        {
            if(stristr($vote->id, "|$_POST[vote]|") != false)
                $addvote = false;
            else
                mysql_query("UPDATE `vote` SET `id` = '". $vote->id ."|". $_POST["vote"] ."|' WHERE `ip` = '". $userip ."'");
        }
        else
            mysql_query("INSERT INTO `vote`(ip, id) VALUES('". $userip ."', '|". $_POST["vote"] ."|')");
        
        if($addvote == true)
        {
            mysql_query("UPDATE `server` SET `vote` = '". ($serv->vote+1) ."' WHERE `id` = '". $_POST["vote"] ."'");
        }
        
        echo $serv->vote."<span class=\"vote votes\"></span>";
    }
    
    exit;
}

 
 
 

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 21:41 23-11-2014
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar
1) забываем об mysql_ - его не будет в будущих версиях php
2)
Цитата:
WHERE `id` = '$_POST[vote]'"

слышали об SQL Injection?
3) глупо привязывать к IP - а если это шлюз целой сети?
4) очевидно, что проблема здесь

Цитата:
        $vote = mysql_fetch_object($connect);  
        $addvote = true;  
         
        if($vote)

раз идут одни INSERT, а не апдейты.  
нехорошая проверка, как минимум is_object, хотя бы.
5) ну и проблема возникает тут  

Цитата:
            if(stristr($vote->id, "|$_POST[vote]|") != false)  
                $addvote = false;  

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

Всего записей: 15595 | Зарегистр. 20-09-2014 | Отправлено: 21:48 23-11-2014 | Исправлено: Mavrikii, 22:00 23-11-2014
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
тут получается что по

Код:
mysql_query("SELECT `id` FROM `vote` WHERE `ip` = '". $userip ."'");  

ничего не найдено, и проверка if($vote) переходит на else
а там:

Код:
mysql_query("INSERT INTO `vote`(ip, id) VALUES('". $userip ."', '|". $_POST["vote"] ."|')");  

 

Цитата:
глупо привязывать к IP - а если это шлюз целой сети?

а как тогда сделать, чтоб голосовать на сайте могли раз в сутки.
я сделал такую бд, и там по ip могут голосовать...

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 21:54 23-11-2014
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar

Цитата:
а как тогда сделать, чтоб голосовать на сайте могли раз в сутки.  

только регистрация.
можно еще попробовать использовать localstorage в html5, но это все обходится при желании.
 

Цитата:
ничего не найдено, и проверка if($vote) переходит на else  

ну так так и получается же, больше INSERT я не вижу
 
более того, лучше вносить и временную метку, чтобы можно было определить когда прошли сутки.  
а вот смысла группировать так id - я не вижу.

Всего записей: 15595 | Зарегистр. 20-09-2014 | Отправлено: 21:57 23-11-2014 | Исправлено: Mavrikii, 22:01 23-11-2014
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
и как проверять лучше всего?

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 22:06 23-11-2014
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar

Цитата:
и как проверять лучше всего?

что проверять?
вносить в базу ip, за что голос, временную метку
и проверять сразу одним запросом - был ли голос за что то в последние сутки. иногда чистить базу от устаревших записей.

Всего записей: 15595 | Зарегистр. 20-09-2014 | Отправлено: 22:07 23-11-2014
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
БД очищается каждый день раз в сутки....
и там не так много записей, чтоб были допущены ошибки.
у меня сейчас работает нормально и не допускает повторно проголосовать, т.к. даже кнопка, которой я голосую, пропадает.
а там не пропадала получается...
 

Цитата:
что проверять?  


Цитата:
 if($vote)

 
может сделать mysql_num_rows()?

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 22:12 23-11-2014 | Исправлено: Sutar, 22:18 23-11-2014
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar

Цитата:
и там не так много записей, чтоб были допущены ошибки

ну есть же повторные записи, значит есть ошибки.
 

Цитата:
 if($vote)

по крайней мере  
if ($vote !== false)
или
if (is_object($vote))
 
коряво все равно, я бы не стал так делать.
сделайте запись в файл значения $vote и посмотрите что там возвращается в этом случае.
ну и заодно все остальные значения, чтобы потом воспроизвести ситуацию - например весь массив $_POST

Всего записей: 15595 | Зарегистр. 20-09-2014 | Отправлено: 22:19 23-11-2014
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
а так будет лучше?
 

Код:
 
$connect = mysql_query("SELECT `id` FROM `vote` WHERE `ip` = '". $userip ."' LIMIT 1");
if(mysql_num_rows($connect ) > 0)
 

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 22:29 23-11-2014
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar
нет, вы же используете данные из запроса, зачем считать и количество, которое будет или 0 или 1, раз стоит LIMIT 1

Всего записей: 15595 | Зарегистр. 20-09-2014 | Отправлено: 22:31 23-11-2014
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
а какой будет самый лучший вариант для скрипта?
 

Код:
if(isset($_POST["vote"]))
{
    $connect = mysql_query("SELECT `id` FROM `server` WHERE `id` = '". intval($_POST["vote"]) ."' LIMIT 1");
    $serv = mysql_fetch_object($connect);
    
    if(is_object($serv))
    {
        $connect = mysql_query("SELECT `id` FROM `vote` WHERE `ip` = '". $userip ."' LIMIT 1");
        $vote = mysql_fetch_object($connect);
        $addvote = true;
        
        if(is_object($vote))
        {
            if(stristr($vote->id, "|". intval($_POST["vote"]) ."|") != false)
                $addvote = false;
            else
                mysql_query("UPDATE `vote` SET `id` = '". $vote->id ."|". intval($_POST["vote"]) ."|' WHERE `ip` = '". $userip ."'");
        }
        else
            mysql_query("INSERT INTO `vote`(ip, id) VALUES('". $userip ."', '|". intval($_POST["vote"]) ."|')");
        
        if($addvote == true)
            mysql_query("UPDATE `server` SET `vote` = '". intval($serv->vote+1) ."' WHERE `id` = '". intval($_POST["vote"]) ."'");
        
        echo $serv->vote."<span class=\"vote votes\"></span>";
    }
    
    exit;
}

 
так лучше?

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 22:34 23-11-2014 | Исправлено: Sutar, 22:37 23-11-2014
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar

Цитата:
так лучше?

пробуйте - узнаете.
я бы, все же, сохранял полученные данные в файл для отладки - поможет определить как обходят.

Всего записей: 15595 | Зарегистр. 20-09-2014 | Отправлено: 22:42 23-11-2014
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
а так можно сделать?

Код:
 
$connect = mysql_query("SELECT `id` FROM `vote` WHERE `ip` = '". $userip ."' LIMIT 1");
$vote = mysql_fetch_object($connect);
 
if(mysql_num_rows($connect ) > 0)

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 23:12 23-11-2014
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar
можно, но нет смысла.

Всего записей: 15595 | Зарегистр. 20-09-2014 | Отправлено: 23:13 23-11-2014
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
а можно как-то проверять пользователя, который поменял ip с помощью программ?

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 17:18 24-11-2014
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar

Цитата:
который поменял ip с помощью программ?

если он умный, чистит куки - нет.

Всего записей: 15595 | Зарегистр. 20-09-2014 | Отправлено: 20:30 24-11-2014
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Интернет » Web-программирование » накрутка голосов на сайте


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru