Войти

Показать полную графическую версию : защита от спасма


Страниц : [1] 2

arrancar
01-07-2008, 01:47
Народ!создал форму обратной связи,но вот нужна защита от спама типа картинки с номерами.помогите реализовать....

Busla
01-07-2008, 09:45
imho в форме обратной связи оно и не нужно

arrancar
01-07-2008, 10:29
почему?там заполняется форма имя мэйл вопрос и отправляется на мэйл человека!так спама много будет

BASSON_XVI
01-07-2008, 14:18
эмм.. НУ rand вам в руки, пару шрифтов и GD либа для работы с изображениями... и будет вам форма защиты от спама... :)

arrancar
01-07-2008, 14:39
BASSON_XVI, Busla, было бы все так просто сделал бы.....поэтому и прошу помощи,отправку сообщений на мэйл еще осилил с горем пополам,а это наврядли.Может кто помочь?

BASSON_XVI
01-07-2008, 15:06
arrancar, А ты думаешь проще когда за тебя кто то напишет код? Прочитай что такое rand что такое массивы я думаю ты знаешь.... Прочитай про библиотеку GD и генерацию изображений.
Теперь говорю как бы я осуществил защиту от спама:
Делаю 2 массива. В один вбиваю цифры от 0 до 9, во второй вбиваю англ. алфавит.
Дальше в цикле я генерю последовательность символов с помощью цикла и функции rand.
Примерно так:

for($i=0;$i<3;$i++)
{
$t = rand(0,25);
$d = rand(0,9);
$str_spam = $arr_number{$d].$arr_letter[$t];
}

Ну а дальше с помощью GD нужно просто сделать картинку с буквами из $str_spam и создать поле ввода для кода и одно скрытое поле для передачи этого кода. Когда юзер все заполнить и отправит сделать проверку если сходиться то что вел юзер с тем тчо было в скрытом поле то отправляем почту если нет то пишет что нет.

arrancar
01-07-2008, 15:31
BASSON_XVI, дельно спасибо

BASSON_XVI
01-07-2008, 16:01
arrancar, }{ы ага если какие проблемы с Гд будут пиши...
Хы вместо спасибо мне гораздо приятней получить + "Полезное сообщение". Но и спасибке я тоже рад )

arrancar
01-07-2008, 19:23
Код:
<?PHP

$config_max_digits="4";


if ($QUERY_STRING=="")
{
// session id
$sid=session_id();
if(!$sid){
session_start();
$sid=session_id();
}

$gen_code = "";
for($i=0; $i<$config_max_digits;$i++) $gen_code = $gen_code.rand(0,9);


$HTTP_SESSION_VARS["noautomationcode"] = $gen_code;


echo ("
<img src='showcode.php?sid=$sid'>
<form action='?begin' method='post'>
<input type='hidden' name='sid' value='$sid'>

<input type='text' name='code'>
<input type='Submit' name='Submit'>
</form>");
}

if ($QUERY_STRING == "begin")
{
session_start();
$gen_code = $HTTP_SESSION_VARS["noautomationcode"];

if ($code == $gen_code)
{
echo "Защищеные данные";
}else{
echo "<b>Код не верный</b><br />Повторите попытку<br />";
echo ("<img src='showcode.php?sid=$sid'><form action='?begin' method='post'><input type='hidden' name='sid' value='$sid'><input type='text' name='code'><input type='Submit' name='Submit'></form>");
}

}

?>





showcode.php

Код:
<?PHP


$img_x="40";
$img_y="20";
$font_size=5;

$sid=trim($HTTP_GET_VARS["sid"]);

session_id($sid);
session_start();
$gen_code = $HTTP_SESSION_VARS["noautomationcode"];

$img = imagecreate ($img_x,$img_y);
$background_color = imagecolorallocate ($img, 255, 255, 255);

$f_x = imagefontwidth ( $font_size );
$f_y = imagefontheight ( $font_size );


$x = ($img_x - strlen($gen_code) * $f_x )/2;
$y = ($img_y - $f_y) / 2;

$color = imagecolorallocate($img,000,000,000);






$dc = ImageColorAllocate($img, rand(0,255), rand(0,255), rand(0,255));
ImageRectangle($img, rand(0, $img_x/2 ), rand(0, $img_y/2 ), rand($img_x / 2, $img_x) ,rand($img_y / 2, $img_y), $dc);

$dc = ImageColorAllocate($img, rand(0,255), rand(0,255), rand(0,255));
ImageRectangle($img, rand(0, $img_x/2 ), rand(0, $img_y/2 ), rand($img_x / 2, $img_x) ,rand($img_y / 2, $img_y), $dc);

imagestring ( $img, $font_size, $x, $y, $gen_code, $color);


for($i = $img_x * $img_y / 10; $i >= 0;$i--)
{
ImageSetPixel($img, rand(0,$img_x), rand(0,$img_y), ImageColorAllocate($img, rand(0,255), rand(0,255), rand(0,255)));
}


header("Content-Type:image/gif");
imagegif($img);

?>



выдает ошибку такую вот:
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/tu2.ru/d/de/despirado/htdocs/www/index.php:11) in /home/tu2.ru/d/de/despirado/htdocs/www/index.php on line 42

это в первом скрипте,а еще не отображает картинку

BASSON_XVI
01-07-2008, 19:43
ну дык а ты что хош вынеси на самый верх страницы session_start(); и все будет окей.

arrancar
01-07-2008, 19:49
<?PHP
session_start();
......


session_start();
?>


типа так?

икак это совместить с вот этой формой?
<form name="form1" method="post" action="order.php">

</noindex>
<table width="100%" border="0" cellpadding="7" cellspacing="0" bgcolor="#eeeeee" class="link_table">
<tr>
<td align="right" valign="middle"><strong>Выберите:</strong></td>
<td>
<select name='person'>
<option selected="selected">Любой</option>
<option value=0>имя</option>
<option value=1>имя</option>
<option value=2>имя</option>
<option value=3>имя</option>
<option value=4>имя</option>
<option value=5>имя</option>
<option value=6>имя</option>
<option value=7>имя</option>
<option value=8>имя</option>
<option value=9>имя</option>
<option value=10>имя</option>
<option value=11>имя</option>
<option value=12>имя</option>
</select></td>
</tr>
<tr>
<td align="right" valign="middle" ><strong>Ваше имя:</strong></td>
<td ><input name="name" type="text" id="name" size="40"></td>
</tr>
<tr>
<td align="right" valign="middle"><strong>Возраст:</strong></td>
<td><input name="age" type="text" id="age" size="3"></td>
</tr>
<tr>
<td align="right" valign="middle"><strong>E-mail <span class="style9">*</span>:</strong></td>
<td><input name="email" type="text" id="email" size="40" /></td>
</tr>
<tr>
<td align="right" valign="top"><strong>Задать вопрос<span class="style9"> *</span>:</strong></td>
<td><textarea name="comments" cols="35" rows="7" wrap="VIRTUAL" id="comments"></textarea>
<input name="confirm" type="hidden" id="confirm" value="yes"></td>
</tr>
<tr>
<td height="62"></td>


<td><input name="Submit" type="submit" class="text" value="Отправить"> </td>
</tr>
</table>
<p><strong class="style9">*</strong> - поля, обязательные для заполнения. </p>
</form>

чтобы кнопка одна была и одновременно проверка шла и отправка если все ок

BASSON_XVI
01-07-2008, 19:54
Что то ты мудришь... Зачем тебе сессии вообще.... в форме отправки письма делаешь два поля одно скрытое передаешь туда переменную с кодом и одно поле для ввода кода... выводишь картинку с генеренную из переменной .... После отправки получаешь данные с скрытого поля и данные которые ввел юзер и проверяешь если они совпадают значить отправка письма если нет.. ТО на нет и суда нет..

arrancar
01-07-2008, 20:01
это то я понял!без сессии все ок!но как совместить честно уже мозги не варят

BASSON_XVI
01-07-2008, 20:24
а что совместить то? Я тебя не понимаю... :)

<form>
<input type=hidden name=rand value="<?=$rand;?>">
Здесь же и выводиш изображнение с генерированное <input type=text name=user_code value="">
.... Дальше форма майла..
</form>

$rand это то последовательность символов из которой ты делал картинку...
После отправки делаем так:

$rnad = $_POST['rand'];
$user_code = $_POST['user_code'];
if($rand==$user_code)
{
.....
Здесь если все хорошо получаеш остальные данные с форми и отправляеш письмо..
....
}else
{
Ну типа как бы не совпали то символы ;)....
}

arrancar
01-07-2008, 20:31
BASSON_XVI, вот я написал два кода и одно форму!коды находяться в разных файлах и форма тоже!попытался вставить форму в файл php с первым кодом,но не хочет

BASSON_XVI
01-07-2008, 21:07
мдя вообще как бы это все в 1 файле пишется....и проверка и сама форма и как ты говоришь все "коды". :) Я бы тебе написал скрипт только времени нет. Возможно напишу но только часа через 3 и выложу здесь... :)

arrancar
01-07-2008, 21:19
плиз!прошу.....подожду

arrancar
01-07-2008, 21:40
мне нужно совместить только форму и первый скрипт!!!!!

BASSON_XVI
01-07-2008, 21:47
хы если только совместить то в конце скрипта своего после ?> вставляй форму. ;)

arrancar
01-07-2008, 21:51
пробывал ошибки выскакиваю!вот вопервых надо совместить форму и скрипт и чтобы у них кнопка одна была!тоесть проверка запукается и отправка

есть еще такой способ!

в php берем html код формы и применяем к www.php.net/base64_encode
в выводимую страницу подключаем в <head> файл javascript(http://www.webtoolkit.info/javascript-base64.html) для раскодировки base64 строки и вставляем в нужном месте страницы что то вида
<script>
document.write(base64_decode('тут_строка_полученная_с_помощью_php_функции_base64_encode'))
</script>




© OSzone.net 2001-2012