Есть у меня на сайте простая форма для ввода емейла тем, кто хочет получать новости. посетителей мало, пока никто не гадил, но решил всетаки немного обезопасть ее. Вот код:
if (isset($_POST['text_mail']))
{
$ad = $_POST['text_mail'];
$ad = mysql_real_escape_string ($ad);
$sobaka = stripos($ad, "@");
$tochka = stripos($ad, ".");
if ($sobaka !== false && $tochka !== false)
{
if(($aipi = @$_SERVER['HTTP_X_FORWARDED_FOR']) === null)
{$aipi = $_SERVER['REMOTE_ADDR'];}
$num_rows_ad = 1;
if ($aipi !== null)
{$sql = "SELECT * FROM podpiska WHERE other='$aipi'";
$result = mysql_query($sql) or die(mysql_error() .'<br/>'. $sql);
$num_rows_ad = mysql_num_rows($result);}
if ($num_rows_ad < 5)
{
sleep(3);
$dt = date("l dS F Y h:i:s A");
$sql = "INSERT INTO podpiska (adres,data_over,other) VALUES ";
$sql .= "('$ad','$dt','$aipi')";
mysql_query("$sql");}
}
}
Все скромно - экранирую спецсимволы, проверяю наличие в тексте точки и собаки, определяю IP, если определился смотрю сколько в базе записей с таким IP, если меньше 5, то "сплю" 3 секунды на всяк случай и вношу запись в базу.
Понятно, что если IP не определится или придет робот-спамер, генерирующий IP, то защита не прокатит, но капчи ставить не хочу, а других мыслей пока нет.
Вопросы:
1. что еще можно придумать, чтоб не обнаружить очередным утром полтора миллиарда адресов в базе?
2. строчки, определяющие IP я стянул с уроков IRBISa, но не могу найти что значит символ @ в обращении к суперглобальной переменной @$_SERVER?
3. как правильно обнулить/очистить значение гл.массива POST после выполнения скрипта, поскольку, если по каким то причинам обновить страницу, то в базу внесется еще одна запись? можно ли это вообще сделать?
Спустя 52 минуты, 7 секунд (9.09.2010 - 08:18) twin написал(а):
Собачка - это подавление ошибки. Просто короткая запись инициализации.
И еще, не нужно мне приписывать авторство этого:
У меня там так:
Кто такой $aipi?
По коду, не совсем понял, чем так напугали собачки и точки...
на счет блокировки по IP - не самый лучший вариант. Лишние проблемы для юзеров, а боту на это чихать. Да и усыплять скрипт - не идея. Сейчас и многопоточность запросто эмулируется ботами.
Если придумаешь что то действительно стоящее лучше капчи, я первый в очереди.))
И еще, не нужно мне приписывать авторство этого:
if(($aipi = @$_SERVER['HTTP_X_FORWARDED_FOR']) === null)
{$aipi = $_SERVER['REMOTE_ADDR'];}
У меня там так:
if(($ip = @$_SERVER['HTTP_X_FORWARDED_FOR']) === null)
$ip = $_SERVER['REMOTE_ADDR'];
Кто такой $aipi?
По коду, не совсем понял, чем так напугали собачки и точки...
на счет блокировки по IP - не самый лучший вариант. Лишние проблемы для юзеров, а боту на это чихать. Да и усыплять скрипт - не идея. Сейчас и многопоточность запросто эмулируется ботами.
Если придумаешь что то действительно стоящее лучше капчи, я первый в очереди.))
Спустя 18 минут, 7 секунд (9.09.2010 - 08:36) Хиросим написал(а):
Цитата |
Кто такой $aipi? |
twinда какая разница как я переменные обзову???
вотуж не знаешь где нарвешься.. авторство то не в названии переменных а в логике... я так думаю...
Цитата |
По коду, не совсем понял, чем так напугали собачки и точки... |
Ну это типа тупенькой регулярки, поле же для электронного адреса, если атрибуты адреса в наличии - проходи дальше.
Цитата |
Если придумаешь что то действительно стоящее лучше капчи |
куда мне зеленому....
А по третьему вопросу просветите??
Спустя 4 минуты, 43 секунды (9.09.2010 - 08:41) twin написал(а):
Даже подумать не мог, что так проверяется мыло))))
По третьему вопросу... Ну если ты у меня на сайте рылся, то тут есть.
По третьему вопросу... Ну если ты у меня на сайте рылся, то тут есть.
Спустя 4 минуты, 14 секунд (9.09.2010 - 08:45) Хиросим написал(а):
ага, спасиб...
Спустя 10 дней, 6 часов, 45 минут, 41 секунда (19.09.2010 - 15:31) vitaly777 написал(а):
как новичек спрошу..
а почему
$sobaka = stripos($ad, "@");
$tochka = stripos($ad, ".");
а не regexp ?
а почему
$sobaka = stripos($ad, "@");
$tochka = stripos($ad, ".");
а не regexp ?