Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ответ 001 на задачу N 15
 
 автор: SoftTime   (03.04.2006 в 22:44)   письмо автору
 
 

Ответ 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

   
 
 автор: cheops   (09.04.2006 в 23:47)   письмо автору
 
   для: SoftTime   (03.04.2006 в 22:44)
 

Безупречное решение, и единственное ;) Отличная работа - правильная, компактная и эффективная. Работа с POST-данными это не простая задача, даже в RFC2616 она упоминается лишь в скользь. На ваш пример будем теперь ссылаться как на эталон решения проблемы :)))

   
 
 автор: FaStY   (10.04.2006 в 02:17)   письмо автору
 
   для: cheops   (09.04.2006 в 23:47)
 

странно, чет у меня не показывает картинку :(
пишет вот что:

Fatal error: Call to undefined function: imagegif() 

   
 
 автор: cheops   (10.04.2006 в 12:26)   письмо автору
 
   для: FaStY   (10.04.2006 в 02:17)
 

Это означает, что у вас не подключено расширение GDLib в конфигурационном файле php.ini.

   
 
 автор: Kapn   (20.04.2006 в 17:44)   письмо автору
 
   для: SoftTime   (03.04.2006 в 22:44)
 

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

Помогите!

   
 
 автор: cheops   (20.04.2006 в 22:26)   письмо автору
 
   для: Kapn   (20.04.2006 в 17:44)
 

Для этого сразу после добавления данных необходимо осуществлять перезагрузку страницу, например так
<?php
    
echo "<HTML><HEAD>
          <META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.php'>
          </HEAD></HTML>"
;
?>

Это позволит сбросить POST-данные.

PS Лучше под такие вопросы заводить новые темы.

   
 
 автор: mihdan   (16.06.2006 в 16:58)   письмо автору
 
   для: cheops   (20.04.2006 в 22:26)
 

Что вы вцепились в эти сокеты - это же старье с огромным количеством багов, хотя это зависит от того какие руки.
Пользуйте libcURL - намного эффективнее быстрее, экономичнее и меньше кода писать. Кому нужна инфа про cURL мыльте, обязательно откликнусь! Спасибо за понимание.

   
 
 автор: cheops   (17.06.2006 в 00:29)   письмо автору
 
   для: mihdan   (16.06.2006 в 16:58)
 

>Что вы вцепились в эти сокеты - это же старье с огромным
>количеством багов, хотя это зависит от того какие руки.
>Пользуйте libcURL - намного эффективнее быстрее, экономичнее
>и меньше кода писать. Кому нужна инфа про cURL мыльте,
>обязательно откликнусь! Спасибо за понимание.
Это не совсем так, libcURL в принципе не может быть быстрее, эффективнее и экономичнее, так как в основе всех сетевых операций будь то операционная система или PHP лежат сокеты. CURL - это удобная надстройка над сокетами, но не их замена, если в операционной системе не будет поддержки сокетов - CURL тоже работать не будет.

   
 
 автор: СерегаВЕБ   (23.06.2006 в 19:37)   письмо автору
 
   для: cheops   (17.06.2006 в 00:29)
 

А вот чет я не пойму насчет затирки старой сессии.
сессия перетирается на странице index.php, но хакеры то будут handler.php атаковать: один раз код с картинки ввели и пошли постить с этой же сессией.
Мне кажется сессию надо удалить в handler.php.

   
 
 автор: Евгений Петров   (23.06.2006 в 20:47)   письмо автору
 
   для: СерегаВЕБ   (23.06.2006 в 19:37)
 

Это сделано не для хакеров а для юзеров. Чтобы при перезагрузке страницы генерировалась другая картинка.

   
 
 автор: СерегаВЕБ   (23.06.2006 в 23:04)   письмо автору
 
   для: Евгений Петров   (23.06.2006 в 20:47)
 

>Защита от обращения к файлу-приемнику минуя HTML-форму:
Зачем тогда пользователю понадобится обходить форму?

   
 
 автор: Евгений Петров   (30.06.2006 в 23:53)   письмо автору
 
   для: СерегаВЕБ   (23.06.2006 в 23:04)
 

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

   
 
 автор: Panker   (11.07.2006 в 17:08)   письмо автору
 
   для: Евгений Петров   (30.06.2006 в 23:53)
 

простите, я всё сделал точно так же как тут н оу меян место картинки показывается просто типа рисунок! типа когда картинки выключены! Из за чего это может быть ?
если это из за того что не подключено расширение GDLib в конфигурационном файле php.ini.
то где это подключить :(

   
 
 автор: cheops   (11.07.2006 в 22:14)   письмо автору
 
   для: Panker   (11.07.2006 в 17:08)
 

Адрес скрипта с картинками загуружайте прямо - никаких ошибок не выводится?

PS Ещё одни генератор кодов можно посмотреть в разделе downloads по ссылке http://www.softtime.ru/info/randomimage.php.

   
 
 автор: sirop   (16.07.2006 в 02:33)   письмо автору
 
   для: cheops   (11.07.2006 в 22:14)
 

>PS Ещё одни генератор кодов можно посмотреть в разделе
>downloads по ссылке
>http://www.softtime.ru/info/randomimage.php.

Я посмотрел этот скрипт, но не смог разобраться, какое значение должно принимать $_SESSION['securityCode'] ?

И ещё вопрос: в приведённом решении в самом верху можно увеличить размер буковок?

   
 
 автор: valenok   (11.07.2006 в 19:38)   письмо автору
 
   для: cheops   (20.04.2006 в 22:26)
 

Чтобы сбросить пост запросы лучше так:
$_POST=Array();

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования