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

Форум PHP

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

 

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

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

тема: Случайное имя поля
 
 автор: Лена   (11.10.2010 в 16:28)   письмо автору
 
 


<?php
$_SESSION
['Keys[1]'] = rand(1000,9999);
$_SESSION['Keys[2]'] = rand(1000,9999);
$_SESSION['Keys[3]'] = md5(uniqid(rand(10,99),1));
$_SESSION['Keys[4]'] = rand(65,90);

//функция генерации случайного имени поля формы
function Crypt($Source){
$Source chr($_SESSION['Keys[4]']).md5(crypt($_SESSION['Keys[1]'].$Source.$_SESSION['Keys[2]'],$_SESSION['Keys[3]']));
return 
$Source;
}

$name_tt Crypt("adhfgjeuwimvq");       
        
             if (
$oForm->isSubmittedAndValid ())
                        print 
$name_tt;
             else{
                 
//вывод формы                                 
            
echo '<form action="" method="post"> 
            <textarea  class="form_input_textarea form_input_html" name="$name_tt"></textarea>
<input type="submit" name="submit" value="Отправить">
            </form>'
;
}

?>


Когда форма отправлена, у меня в $name_tt получается совершенно другое значение, чем было до ее отправки. Почему?

  Ответить  
 
 автор: root   (11.10.2010 в 16:35)   письмо автору
 
   для: Лена   (11.10.2010 в 16:28)
 

а на странице обработчике Вы откуда берете $name_tt?

или опять генерируете?


уже дописали..

  Ответить  
 
 автор: Root   (11.10.2010 в 16:37)   письмо автору
 
   для: Лена   (11.10.2010 в 16:28)
 

Выходит, что Вы каждый раз генерируете разное

$_SESSION['Keys[1]'] = rand(1000,9999);
$_SESSION['Keys[2]'] = rand(1000,9999);
$_SESSION['Keys[3]'] = md5(uniqid(rand(10,99),1));
$_SESSION['Keys[4]'] = rand(65,90);

  Ответить  
 
 автор: Лена   (11.10.2010 в 16:44)   письмо автору
 
   для: Root   (11.10.2010 в 16:37)
 

Нет, но почему когда я после получения данных формы делаю:
if ($oForm->isSubmittedAndValid ())
print_r($_POST);

у меня имя этого единственного поля, которое приходит на сервер, отличается от того, что я прописывала в форме через $name_tt? Как мне сделать, чтобы на сервер приходило то, что я вкладываю в имя поля?
У меня обработчик и форма - в одном файле.

  Ответить  
 
 автор: root   (11.10.2010 в 16:48)   письмо автору
 
   для: Лена   (11.10.2010 в 16:44)
 

Не генерируйте каждый раз, запишите результат в сессию и сравнивайте.
Вы должны на сервере сохранить значение сгенерированного $name_tt, т.к. после 'поста' Вы сгенерируете совсем другой ключ.

  Ответить  
 
 автор: Лена   (11.10.2010 в 17:22)   письмо автору
 
   для: root   (11.10.2010 в 16:48)
 

Сгенерировала имя поля в функции
function EncryptField($Source){
//СЛУЧАЙНЫЕ ИМЕНА ПОЛЕЙ
$key1 = rand(1000,9999);
$key2 = rand(1000,9999);
$key3 = md5(uniqid(rand(10,99),1));
$key4 = rand(65,90);

$Source = chr($key4).md5(crypt($key1.$Source.$key2,$key3));
return $Source;
}

пишу результат действия функции в переменную:

$name_tt = EncryptField("adhfgjeuwimvq");

запоминаю в сессии:
$_SESSION['name'] = $name_tt;

После поста в сессии - другая строка.

  Ответить  
 
 автор: root   (11.10.2010 в 17:29)   письмо автору
 
   для: Лена   (11.10.2010 в 17:22)
 

<?php 
if( empty( $_POST ) )
{
    
$_SESSION['Keys[1]'] = rand(1000,9999); 
    
$_SESSION['Keys[2]'] = rand(1000,9999); 
    
$_SESSION['Keys[3]'] = md5(uniqid(rand(10,99),1)); 
    
$_SESSION['Keys[4]'] = rand(65,90); 
    
$name_tt Crypt("adhfgjeuwimvq");        
    
$_SESSION['tt'] = $name_tt
}
else
    
$name_tt $_SESSION['tt'];

//функция генерации случайного имени поля формы 
function Crypt($Source){ 
$Source chr($_SESSION['Keys[4]']).md5(crypt($_SESSION['Keys[1]'].$Source.$_SESSION['Keys[2]'],$_SESSION['Keys[3]'])); 
return 
$Source

             if (
$oForm->isSubmittedAndValid ()) 
                 print 
$name_tt
             else{ 
                 
//вывод формы                                  
            
echo '<form action="" method="post">  
            <textarea  class="form_input_textarea form_input_html" name="$name_tt"></textarea> 
<input type="submit" name="submit" value="Отправить"> 
            </form>'



?>

  Ответить  
 
 автор: root   (11.10.2010 в 17:33)   письмо автору
 
   для: Лена   (11.10.2010 в 17:22)
 

А Вы не пробовали сам html посмотреть после вот такого
<?php echo '<form action="" method="post">  
            <textarea  class="form_input_textarea form_input_html" name="$name_tt"></textarea> 
<input type="submit" name="submit" value="Отправить"> 
            </form>'
;
?

  Ответить  
 
 автор: sim5   (11.10.2010 в 19:06)   письмо автору
 
   для: Лена   (11.10.2010 в 16:28)
 

Имена полей и их соответствия, а не какие-то ключи, должны формироваться и сохраняться в сессию только по требованию - при каждом выводе формы. А у вас "родоночальники" всего гарантированно формируются при каждом запросе скрипта.
А к чему такие сложности при формировании имени? Эта идея жиждется не на том, как бы зашифровать поужаснее, а на том, что имена полей у формы непостоянные, но одного этого мало.

  Ответить  
 
 автор: Рома   (12.10.2010 в 01:38)   письмо автору
 
   для: Лена   (11.10.2010 в 16:28)
 

да, sim5 прав, ваша генерация случайных полей доступна ботам. лучше думайте защиту на яваскрипт, яваскрипт выволняется мгновенно, а любой взлом через curl требует времени. Двойная - тройная яваскрипт защита, выполнится до секунды, а бот в течение одной секунды три запроса не сделает.

Вот вам и стопроцентный антибот. Каптча даже не нужна.

  Ответить  
Rambler's Top100
вверх

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