|
|
|
| Ответ 001 на задачу N 15.
С условиями задачи можно ознакомится по ссылке.
sendpostdata - скрипт отправки POST-данных через Сокеты
<?
// передаваемые данные
$name = "Login";
$pass = "Password";
$hostname = "chat.my";
$fp = fsockopen($hostname,80);
// формируем строку с отправляемымы данными
$data = "name=".urlencode($name)."&pass=".urlencode($pass)."\r\n\r\n";
$headers = "POST /w/handler.php HTTP/1.1\r\n"
."Host: $hostname\r\n"
."Content-type: application/x-www-form-urlencoded\r\n"
."Content-Length: ".strlen($data)."\r\n\r\n";
// отправляем
fwrite($fp,$headers.$data);
// на этом впринципе отправка закончена,
// для уверенности можно прочитать один
// байт или все содержимое:
while(!feof($fp))
echo fread($fp,1024);
fclose($fp);
?>
|
Защита от обращения к файлу-приемнику минуя HTML-форму:
index.php - форма отправки
<?
// набор символов
$alpha = "abcdefghijklmnopqrstuvwxyzABCDEFGHI JKLMNOPQRSTUVWXYZ1234567890";
$secret = "";
// формируем строку из 5 символов, которая будет отображаться на картинке
for($i=0;$i<5;$i++)
$secret.= $alpha[rand(0,strlen($alpha)-1)];
// генерируем новый SESSIONID для того, чтобы при
// перезагрузке страницы старая сессия затиралась
session_id(md5(microtime()*rand()));
session_start();
// сохраняем сгенерированную строку в переменной сессии
$_SESSION['secret'] = $secret;
?>
<form action="handler.php" method="post">
Имя : <input type="text" name="name">
Пароль : <input type="text" name="pass">
Число на картинке : <input type="text" name="secret">
<input type="submit" name="send" value="Отправить">
</form>
<img src="img.php?sid=<?=session_id();?>">
|
img.php - генератор картинки с "секретной строкой"
<?
// стартуем сессию с полученным SESSIONID
session_id($_GET['sid']);
session_start();
// создаем каритнку:
$im = imagecreate(88,31);
// бледно зеленый фон...
imageColorAllocate($im,153,204,153);
// ... с зелеными:
$green = imageColorAllocate($im,0,128,0);
// ... текстом
imagestring($im,3,20,10,$_SESSION['secret'],$green);
// ... и линиями, которые усложнят задачу "распознавания"
// картинки в автоматическом режиме
imageline($im,20,0,80,31,$green);
imageline($im,0,10,50,0,$green);
imageline($im,90,5,40,31,$green);
imageline($im,0,31,70,0,$green);
imageGif($im);
header("Content-Type: image/gif");
?>
|
handler.php - файл-приемник
<?php
session_start();
if($_POST['secret'] == $_SESSION['secret'])
{
echo "Имя - $_POST[name] ";
echo "Пароль - $_POST[pass] ";
}
else
{
echo "Вы неверно ввели число на картинке!";
}
?>
|
http://www.softtime.ru/info/task.php?id_article=87 | |
|
|
|
|
|
|
|
для: SoftTime
(03.04.2006 в 22:44)
| | Безупречное решение, и единственное ;) Отличная работа - правильная, компактная и эффективная. Работа с POST-данными это не простая задача, даже в RFC2616 она упоминается лишь в скользь. На ваш пример будем теперь ссылаться как на эталон решения проблемы :))) | |
|
|
|
|
|
|
|
для: cheops
(09.04.2006 в 23:47)
| | странно, чет у меня не показывает картинку :(
пишет вот что:
Fatal error: Call to undefined function: imagegif()
|
| |
|
|
|
|
|
|
|
для: FaStY
(10.04.2006 в 02:17)
| | Это означает, что у вас не подключено расширение GDLib в конфигурационном файле php.ini. | |
|
|
|
|
|
|
|
для: SoftTime
(03.04.2006 в 22:44)
| | А как реализовать этот метод на одной странице? Предположим если есть гостевая книга сделанная одной страницей. Ведь при отправке данных форме цифры меняются и сравниваются уже с новыми, что можно поделать в данной ситуации, бьюсь над этой проблемой уже не одни сутки. Без этой формы можно зафлудить гостевую книгу простым нажатием "Обновить"
Помогите! | |
|
|
|
|
|
|
|
для: Kapn
(20.04.2006 в 17:44)
| | Для этого сразу после добавления данных необходимо осуществлять перезагрузку страницу, например так
<?php
echo "<HTML><HEAD>
<META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.php'>
</HEAD></HTML>";
?>
|
Это позволит сбросить POST-данные.
PS Лучше под такие вопросы заводить новые темы. | |
|
|
|
|
|
|
|
для: cheops
(20.04.2006 в 22:26)
| | Что вы вцепились в эти сокеты - это же старье с огромным количеством багов, хотя это зависит от того какие руки.
Пользуйте libcURL - намного эффективнее быстрее, экономичнее и меньше кода писать. Кому нужна инфа про cURL мыльте, обязательно откликнусь! Спасибо за понимание. | |
|
|
|
|
|
|
|
для: mihdan
(16.06.2006 в 16:58)
| | >Что вы вцепились в эти сокеты - это же старье с огромным
>количеством багов, хотя это зависит от того какие руки.
>Пользуйте libcURL - намного эффективнее быстрее, экономичнее
>и меньше кода писать. Кому нужна инфа про cURL мыльте,
>обязательно откликнусь! Спасибо за понимание.
Это не совсем так, libcURL в принципе не может быть быстрее, эффективнее и экономичнее, так как в основе всех сетевых операций будь то операционная система или PHP лежат сокеты. CURL - это удобная надстройка над сокетами, но не их замена, если в операционной системе не будет поддержки сокетов - CURL тоже работать не будет. | |
|
|
|
|
|
|
|
для: cheops
(17.06.2006 в 00:29)
| | А вот чет я не пойму насчет затирки старой сессии.
сессия перетирается на странице index.php, но хакеры то будут handler.php атаковать: один раз код с картинки ввели и пошли постить с этой же сессией.
Мне кажется сессию надо удалить в handler.php. | |
|
|
|
|
|
|
|
для: СерегаВЕБ
(23.06.2006 в 19:37)
| | Это сделано не для хакеров а для юзеров. Чтобы при перезагрузке страницы генерировалась другая картинка. | |
|
|
|
|
|
|
|
для: Евгений Петров
(23.06.2006 в 20:47)
| | >Защита от обращения к файлу-приемнику минуя HTML-форму:
Зачем тогда пользователю понадобится обходить форму? | |
|
|
|
|
|
|
|
для: СерегаВЕБ
(23.06.2006 в 23:04)
| | Пользователю незачем а вот хакеру какому нибудь понадобится. Это как правило делают для защиты от автоматических регистраций или от автоматической отправки смс или ещё чего нибудь... | |
|
|
|
|
|
|
|
для: Евгений Петров
(30.06.2006 в 23:53)
| | простите, я всё сделал точно так же как тут н оу меян место картинки показывается просто типа рисунок! типа когда картинки выключены! Из за чего это может быть ?
если это из за того что не подключено расширение GDLib в конфигурационном файле php.ini.
то где это подключить :( | |
|
|
|
|
|
|
|
для: Panker
(11.07.2006 в 17:08)
| | Адрес скрипта с картинками загуружайте прямо - никаких ошибок не выводится?
PS Ещё одни генератор кодов можно посмотреть в разделе downloads по ссылке http://www.softtime.ru/info/randomimage.php. | |
|
|
|
|
|
|
|
для: cheops
(11.07.2006 в 22:14)
| | >PS Ещё одни генератор кодов можно посмотреть в разделе
>downloads по ссылке
>http://www.softtime.ru/info/randomimage.php.
Я посмотрел этот скрипт, но не смог разобраться, какое значение должно принимать $_SESSION['securityCode'] ?
И ещё вопрос: в приведённом решении в самом верху можно увеличить размер буковок? | |
|
|
|
|
|
|
|
для: cheops
(20.04.2006 в 22:26)
| | Чтобы сбросить пост запросы лучше так:
$_POST=Array(); | |
|
|
|