[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сообщение от анонимных пользователей
grey4eg
Здравствуйте. Есть скрипт формы для внесения данных с проверкой на заполняемость. Подскажите пожалуйста, как сделать так, чтобы посетитель мог оставить только одно сообщение хотя бы в сутки и не мог заспамить мне базу.
Прошу не рассматривать варианты антиспама такие как капча, к примеру.
Нужна защита именно от различного рода придурков которым не лень по сто мессаг отправлять в научных или каких-либо других целях.
Смутно догадываюсь что нужно использовать cookies, но абсолютно не знаю как, ибо только начал изучать
Вот код:
PHP
<?php
require "config.php";
if (isset(
$_POST['type'])&& isset($_POST['nazv'])&& isset($_POST['adr'])&& isset($_POST['tel'])&& isset($_POST['site'])) 
{
  
// Методом пост были присланы все поля формы
 
$type $_POST['type'];
 
$nazv $_POST['nazv'];
 
$adr $_POST['adr'];
 
$tel $_POST['tel'];
 
$site $_POST['site'];
  
// Массив ошибок
  
$errors = array();
  
// Проверки переменных
  
if(empty($_POST['nazv'])) { $errors['nazv'] = "Не заполнено название"; }
  if(empty(
$_POST['adr'])) { $errors['adr'] = "Не заполнен адрес"; }
  if(empty(
$_POST['tel'])) { $errors['tel'] = "Не заполнен телефон"; }
  
  if(
count($errors)) {
    
// Если массив ошибок не пуст, заново выводим форму, отсылая в нее сообщения об ошибках
    
showform($errors);
  } else 
     {
  
    
$exist mysql_query("SELECT * FROM schools WHERE sh_title='$nazv' and adres='$adr' and tel='$tel'" ,$db);
          if(
mysql_num_rows($exist)>0)
              {
                echo 
"Школа с такими данными уже есть в списке!";
                
showform($errors);
                
              }
          else
              {  
        
// Если массив ошибок пуст - значит все переменные подходят под условия, и можно производить соот-щие действия с ними
      
$result_ins_otm mysql_query("INSERT INTO schools (sh_type,sh_title,adres,tel,site) VALUES ('$type','$nazv','$adr','$tel','$site')");
      if  (
$result_ins_otm == false)
                      {
                        echo 
"Данные не записаны";
                         
                      }
                   else
                      {
      
/*****
     * После выполнения всех необходимых действий с данными - переадресация
     * на результирующую страницу (моментально, через http-заголовок, или-же
     * отображением промежуточной страницы "данные добавлены" с мета-тегом
     * переадресации), чтобы при обновлении страницы данные не были отправлены
     * повторно.
     *****/
    
header('Location: redirect.php?act=add');
    }
  }

}
else {
  
showform();
}
// Содержит отображение формы
function showform(array $errors = array()) {
require 
"config.php";
$result mysql_query("SELECT * FROM sh_type",$db);
  
// Генерация значений по умолчанию, если значение установлено с предыдущего запроса - присваивается оно, иначе NULL
  
$nazv = isset($_POST['nazv'])?$_POST['nazv']:NULL;
  
$adr = isset($_POST['adr'])?$_POST['adr']:NULL;
  
$tel = isset($_POST['tel'])?$_POST['tel']:NULL;
  
// Генерация сообщений об ошибках
  
$err1 = isset($errors['nazv'])?$errors['nazv']:NULL;
  
$err2 = isset($errors['adr'])?$errors['adr']:NULL;
  
$err3 = isset($errors['tel'])?$errors['tel']:NULL;
   
// Вывод формы
  
echo '<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'
.'<title>Добавить новую школу</title>'
.'<link href="styles.css" rel="stylesheet" type="text/css" />'
.'</head>';
  echo 
'<form action="'.$_SERVER['REQUEST_URI'].'" method="post">';
  echo 
'<select name="type" size = 1>';
  while (
$myrow mysql_fetch_assoc($result))
{
   echo 
'<option value="'.$myrow['id'].'">'.$myrow['t_title'].'</option>';
   }
 echo
'</select><br>';
     echo 
'<input name="nazv" type="text" value="'.$nazv.'" />'.$err1.'<br />'
      
.'<input name="adr" type="text" value="'.$adr.'" />'.$err2.'<br />'
      
.'<input name="tel" type="text" value="'.$tel.'" />'.$err3.'<br />'
      
.'<input name="site" type="text" value="'.$site.'" /><br />'
      
.'<input type="submit" />'
      
.'</form>';
}


Заранее спасибо



Спустя 36 минут, 58 секунд (26.01.2009 - 10:18) twin написал(а):
Куки вряд лм Вам помогут, они легко отключаются. Ровно как и сессия. Привязывать к IP не есть грамотное решение - Вы тем самым рискуете "забанить" ни в чем не повинных юзеров. Единственный выход, известный на сегодня - премодерация записи, то есть публиковать её только после всемилостивейшего одобрения модератора. Если Вам удасться придумать что то действующее кроме этого - поделитесь, Вас будут носить на руках.

Спустя 38 минут, 4 секунды (26.01.2009 - 10:56) sergeiss написал(а):
Вопрос: а надо ли именно анонимных пользователей ограничивать? Или можно сделать так, чтобы пользователь сначала регистрировался, а только потом отправлял сообщения?
Вторая задаче имеет решение.

Спустя 12 минут, 59 секунд (26.01.2009 - 11:09) grey4eg написал(а):
да в том то и дело что нет. Суть такова: (не смотрите на "школы" и тд.)
Юзер приходит на страницу, ему все нравится, оставляет коммент. Что-то вроде флешмоба. Не хотелось бы парить людей регистрацией. кроме того с регистрацией получится две формы - для регистрации и для мессаги. Так что проблема-то останется - можно ведь будет и регистрироваться много раз. А регистрация с активацией - тоже далеко не всем понравится.

Про премодерацию мне, конечно понравился вариант, попробую его реализовать.
Но всеже хотелось бы услышать еще варианты, если таковые существуют

Спустя 1 минута, 53 секунды (26.01.2009 - 11:11) grey4eg написал(а):
Простите, забыл. Скажите, возможно ли палить внутренние ip посетителей? вместо адреса прокси?

Спустя 17 минут, 26 секунд (26.01.2009 - 11:28) Adamant написал(а):

Спустя 2 часа, 2 минуты, 6 секунд (26.01.2009 - 13:30) grey4eg написал(а):
Ксати, не могли бы Вы, если уж теоретически 100% способа нетЮ, выполнить мою просьбу и описать как можно использовать в моем коде куки или сессию или и то и другое? rolleyes.gif

Спустя 27 минут, 12 секунд (26.01.2009 - 13:57) twin написал(а):
При записи ставите куку сроком на сутки или сессию так же можно. Потом проверяете - если кука или сессия есть - фигу.
PHP
<?
setcookie('flood','я сёдне был', time()+3600*24,"/");
if(isset(
$_COOCIE['flood']))
{
Фиг.
}
else
{
Велкам.
Лучше наверное кукис, чтоб сессиями сервер не загаживать.

Спустя 40 минут, 5 секунд (26.01.2009 - 14:38) FatCat написал(а):
Цитата (twin @ 26.01.2009 - 10:18)
Если Вам удасться придумать что то действующее кроме этого - поделитесь, Вас будут носить на руках.

Обратили внимание, что на этом форуме спокойно можно писать гостем без всякой каптчи, и при этом нет ботовых сообщений?
Не буду рассказывать алгоритм, важен сам принцип, что ботов можно отрубить.

Дальше по айпишнику + куке + $_SERVER['HTTP_USER_AGENT'] можно вполне прилично идентифицировать 99,99% посетителей.

Спустя 36 минут, 39 секунд (26.01.2009 - 15:14) twin написал(а):
Вопрос не в спаме а в флуде. От флудеров Ваш алгоритм не спасет. Вспомним Ёжика (или утенек он теперь) biggrin.gif

Спустя 1 минута, 11 секунд (26.01.2009 - 15:15) FatCat написал(а):
Цитата (twin @ 26.01.2009 - 15:14)
От флудеров Ваш алгоритм не спасет.

От людей-флудеров спасет
Цитата (FatCat @ 26.01.2009 - 14:38)
по айпишнику + куке + $_SERVER['HTTP_USER_AGENT']


Спустя 8 минут, 29 секунд (26.01.2009 - 15:24) twin написал(а):
Ну а если кукис отключить или стереть просто? Одного параметра не будет, значит либо сутки прошли, либо новый юзер. Флудеры, они народ изобретательный, особенно школьники. А сайт для них как я понял.

Спустя 48 минут, 9 секунд (26.01.2009 - 16:12) FatCat написал(а):
Цитата (twin @ 26.01.2009 - 15:24)
Ну а если кукис отключить или стереть просто?

Останутся айпишник и юзерагент, записываемые в БД вместе с датой последнего обращения. По ним и вычислять.

Так, собственно, и делается защита от накрутки большинства голосовалок. Так же сделан бан в чатах на "народе".

Спустя 17 минут, 53 секунды (26.01.2009 - 16:30) twin написал(а):
А какая польза от айпишника, если я на прокси? Меня банили уже несколько раз за чужие проделки, это правильный подход разве? И какая польза от юзерагента? Вот же написано:
Цитата
Нужна защита именно от различного рода придурков которым не лень по сто мессаг отправлять в научных или каких-либо других целях.

Тут даже особо и эмулировать ничего не надо, что бы отправить как минимум пять сообщений. (у меня 5 браузеров, у кого то может больше).
Старая добрая (злая) премодерация - единственная панацея мне кажется... Хотя конечно не красивая штука, но иногда незаменимая просто.

Спустя 1 час, 14 минут, 1 секунда (26.01.2009 - 17:44) FatCat написал(а):
Цитата (twin @ 26.01.2009 - 16:30)
премодерация - единственная панацея мне кажется...

Я поигрался с премодерацией от ботов.
Когда за неделю пришлось просмотреть 2700 сообщений в премодерации, коврик под мышью протерся до дыр. laugh.gif

Спустя 4 минуты, 32 секунды (26.01.2009 - 17:48) twin написал(а):
Ну я же говорю - иногда.
Для школьного ресурса вполне достаточно, не думаю, что боты его сильно мучать будут. Кроме того, от ботов есть и другие меры защиты. Тут речь именно о флуде и экспериментах вундеркиндов.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.