защита от повтора записи

Печать RSS
405


Голубые штаны
0
farta007 (31 Октября 2011 / 00:37)
HELP!!!!
В бане. Это не аська.
В

Пришелец
0
Писал в личку напишу еще и здесь может кому пригодится.

Либо после запроса юзай:

header('Location: /ссылка');

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

<?
global $errors_list;

  $errors_list=array(
  'faster'=>'Ваш запрос был заблокирован в связи с ускоренной отправкой данных! Вернитесь назад и                              повторите попытку...'
  );

  function protect_fatal_error($type){
   global $errors_list;

   if($type==11){
   $type='faster';
   } 

   print $errors_list[$type];
   header('Location: /ссылка');
  }

  function protect_error($type){

	if($type){
	$temp=mysql_query("SELECT * FROM `warnings_ip` WHERE `ip`='".ип пользователя."' LIMIT 1");

		if(mysql_num_rows($temp)>0){
		$temp=mysql_fetch_array($temp,true);
		$id=$temp['id'];
		$warnings=$temp['warnings'];
		$last_warning=$temp['time'];

		$warnings++;
		$temp=TIME-$last_warning;
		$temp=(int)($temp/60);

		$warnings-=$temp;

			if($warnings<1){
			$warnings=1;
			}

		} else {
		@mysql_query("INSERT INTO `warnings_ip` (`ip`,`warnings`,`time`) VALUES('".ип пользователя."',1,".TIME.")");
		}
	}

protect_fatal_error($type);
}

 	$temp=mysql_query("SELECT * FROM `warnings_ip` WHERE `ip`='".ип пользователя."' LIMIT 1");

		if(mysql_num_rows($temp)>0){
		$temp=mysql_fetch_array($temp,true);
		$temp=$temp['last_post'];

			if(TIME<$temp+1){
			protect_error(11);
			} else {
			@mysql_query("UPDATE `warnings_ip` SET `last_post`=".TIME." WHERE `ip`='".ип пользователя."' LIMIT 1");
			}
		} else {
		@mysql_query("INSERT INTO `warnings_ip` (`ip`,`last_post`) VALUES('".IP."',".TIME.")");
		}

Ну таблицы я думаю сообразите как сделать, но не люблю я этот вариант с скл запросами на мемкеше гораздо быстрее и проще, ну да ладно им пользуются единицы smile
Изменил: Владимир (01.11.2011 / 20:38)

Голубые штаны
0
12. Sneg, индийский код. С такие кодом только на H2M хоститься, где и остальные с подобным кодом.

Всего-то 2 строки:
1 : проверка последней записи того, кто в данный момент пишет
2 : проверка, если записуемое сообщение не совпадает с последней записью.

Все. На файлах немного сложнее (10 строк). Но не полотенце же......
В

Пришелец
0
dima.london (1 Ноября 2011 / 21:02)
12. Sneg, индийский код. С такие кодом только на H2M хоститься, где и остальные с подобным кодом.

Всего-то 2 строки:
1 : проверка последней записи того, кто в данный момент пишет
2 : проверка, если записуемое сообщение не совпадает с последней записью.

Все. На файлах немного сложнее (10 строк). Но не полотенце же......

Помнится ты хвалил код @lex я взял за основу его идею и сократил малех. =)

Но этот код делает немного больше чем обычная проверка сообщения. Забиваешь в ядро и скоростные запросы блокируются на всем сайте в данном случае чаще 1 запроса в секунду делать нельзя. Если в секунду 2 любых запроса то выполняется условие ну я прописал простой редирект. Но можно и блокировать.
Изменил: Владимир (01.11.2011 / 21:22)
Д

Пришелец
0
/**
 * Функция проверки спама
 * by NEx
 *
 * @param
 * $text string - какое-нибудь сообщение
 * $time int - интервал времени, который надо проверять
 * $number int - количество записей в интервал времени за который можно считать сообщение спамом
 * $match int - сколько одинаковых сообщений можно ввести в интервал времени
 * 
 * @return boolean
 */
function is_spam($text, $time = 60, $number = 3, $match = 1) {
	$is_spam = false;
	$ip = $_SERVER['REMOTE_ADDR'];// можно ip2long перевести
	$hash = md5($text);
	$time = time()-$time;
	$SQL = "SELECT `hash` FROM `spam` WHERE `tc` > '".$time."' AND `ip` = '".$ip."' LIMIT ".$number;
	$res = mysql_query($SQL);
	if(mysql_num_rows($res)>=$number)
		$is_spam = true;
	else {
		while($row = mysql_fetch_assoc($res)) {
			$number--;
			if($row['hash'] == $hash)
				$match--;
			if(!$number || !$match)
				$is_spam = true;
		}
	}
	$SQL = "INSERT INTO `spam` SET `tc` = '".time()."', `ip` = '".$ip."', `hash` = '".$hash."'";
	mysql_query($SQL);
	return $is_spam;
}

Нужна табличка spam c полями tc, ip, hash
Для производительности тип мемори, и 3 индекса на 3 поля

Пользоваться можно так:
$msg = $_POST['msg'];
if(is_spam($msg, 30, 3, 1)){ //проверит не вводили ли в течении 30 секунд 3 сообщения или 1 такое же сообщение
//это спам
}
else {
//идем дальше
}
Изменил: Димон (01.11.2011 / 23:24)
Стикеры / Теги / Правила / Топ тем / Топ постов / Поиск