[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Пожалуйста проверьте скрипт на уязвимость
ANG3
Всем привет.

Безопасность
1. Скрипт должен быть защищен от SQL-инъекций
2. Должна быть защита от F5
3. Страница должна быть защищена от XSS атак.

Кроме того важны оптимальность, читабельность и стиль написания. (С) Twin

Постарался защитить свой скрипт по всем этим параметрам.

Есть только одна проблема. Если пытаются сделать рефреш, то скрипт прерывается, но что-бы ещё раз отправить форму, переход по сылке на страницу с формой не помогает. Нужно обязательно сделать рефреш страницы с формой.


Вот форма. Там ещё есть <form></form> с отправко
PHP
<?php
session_start
();
$_SESSION['protect']="protect";






Спустя 2 минуты, 11 секунд (3.08.2009 - 19:46) ANG3 написал(а):
Сори, случайно нажал Enter.
Вот код страницы, где обрабатываются данные из формы.

PHP
<?php  
session_start
();

    
$name mysql_real_escape_string(trim(strip_tags($_POST['name'])));
    
$inn mysql_real_escape_string(trim(strip_tags($_POST['inn'])));
    
$address mysql_real_escape_string(trim(strip_tags($_POST['address'])));
    
$tel mysql_real_escape_string(trim(strip_tags($_POST['tel'])));
    
$email mysql_real_escape_string(trim(strip_tags($_POST['email'])));
    
$order mysql_real_escape_string(trim(strip_tags($_POST['order'])));
    
$date=date ('d.m.Y',mktime ());

if( 
strlen($name)<|| strlen($inn)<|| strlen($address)<|| strlen($tel)<|| strlen($email)<|| strlen($order) <
{
    exit(
"<p style='color: #FFFFFF; font-family: Verdana; font-size: 10pt'>Заполнены не все поля, или их содержимое слишком мало!</p>"); 
}

if (isset(
$_SESSION['protect']))  

{

    
session_destroy();

    
$query="INSERT INTO `order` ( `order` , `name` , `email` , `tel` , `address` , `inn` , `date` ) 
    VALUES (
    '$order', '$name', '$email', '$tel', '$address', '$inn', '$date'
    );
    "
;

    
mysql_query ("SET NAMES `cp1251`");
    
mysql_query ($query) or die(mysql_error());

    
mysql_free_result(); 

    
mysql_close();

    echo
"<p align='justify' style='color: #FFFFFF; font-family: Verdana; font-size: 10pt'>Спасибо!                         Ваша заявка принята.</p>"
}
else 
{
exit (
"<p align='justify' style='color: #FFFFFF; font-family: Verdana; font-size: 10pt'>Если вы хотите отправить ещё один заказ, то создайте его заново.</p>");
}


?> 

Защищал от F5 сессиями. Выше описана&nb

Спустя 4 минуты, 1 секунда (3.08.2009 - 19:50) Gabriel написал(а):
PHP
if (isset($_SESSION['protect']))  

{

    
session_destroy();

непонятный кусок:) заводиш сесию и сразу убиваеш?

Спустя 14 минут, 12 секунд (3.08.2009 - 20:04) stepan написал(а):
Индуский код, многое можно поменять, да и по читабильности как требует twin не достаточно, на пример комментарии отсутствуют.

Спустя 5 минут, 22 секунды (3.08.2009 - 20:10) Oyeme написал(а):
1.Используй стили.
2. $name = mysql_real_escape_string(trim(strip_tags($_POST['name'])));
достаточно mysql_real_escape_string,остальное выкинь.
3.Учи форматировать код.

Спустя 54 минуты, 58 секунд (3.08.2009 - 21:05) twin написал(а):
Цитата
непонятный кусок:) заводиш сесию и сразу убиваеш?

Кусок весьма логичен, но работать будет некорректно. Нужно сначала унсетить переменную.
По коду даже страшно комментировать.
Первые строки... оторопь берет. Переменные не объявлены, так мало того, целых три функции в строке будут гонять вхолостую, обрастая нотисами как махровой плесенью, если вдруг какое то поле окажется незаполненным.
Дальше. Что за эксит? Эта конструкция предназначена для оладки и иногда для защиты скриптов. В смысле замка. Еще можно остановить скрипт, если дальнейшая работа не принесет результата, допустим после редиректа. Очень, очень некрасиво совать юзеру в нос всякие служебные надписи на пустом экране.
Еще дальше. Сессия. Я написал уже.
Следующая строка. Объясните мне кто нибудь тайный смысл этой перезаписи. Зачем запрос сначала писать в переменную, а потом её подставлять в функцию? Я понимаю, когда могут быть варианты, тут то их нет.
Ниже.
Ну когда же наконец то дойдет, что не нужно пользоваться этими местечковыми кодировками. Есть UTF-8 универсальная кодировка, стандарт. Нахапаешь проблем с этими вин и кои.

Ну и защиты от F5 я тут вообще не наблюдаю...

По стилю вообще сказать нечего. Его просто нет.

Спустя 25 минут, 45 секунд (3.08.2009 - 21:30) ANG3 написал(а):
Давайте по порядку.

1.
Что значит переменные не объявлены?
2.
Чем можно заменить экзит?
3.
Ну когда же наконец то дойдет, что не нужно пользоваться этими местечковыми кодировками. Есть UTF-8 универсальная кодировка, стандарт. Нахапаешь проблем с этими вин и кои.

Объясните плиз.
4. Защита от F5 есть и работает, есть одна проблемк которую описал в 1 сообщении. Выглядит так: создаётся переменная в сессии. Если она есть то в странице, где обрабатываются данные из формы, переменная убивается и выполняется основной код. Жмёшь F5. Переменной из сессии не
обнаруживается. Выход.
5.
mysql_real_escape_string вырезает только '\n', '\r', '\', ''', '"'. Почему нельзя вырезать ещё пробелы и хтмл теги?.

Пожалуйста пишите подробнее. php только неделю изучаю.

Спустя 36 минут, 27 секунд (3.08.2009 - 22:07) ANG3 написал(а):
Вот код. Стиль постарался улучшить.
PHP
<?php  
session_start
();   
              
/* Переменные полученные из формы*/
  
$name mysql_real_escape_string($_POST['name']);
  
$inn mysql_real_escape_string($_POST['inn']);
  
$address mysql_real_escape_string($_POST['address']);
  
$tel mysql_real_escape_string($_POST['tel']);
  
$email mysql_real_escape_string($_POST['email']);
  
$order mysql_real_escape_string($_POST['order']);
  
$date=date ('d.m.Y',mktime ());
               
/* Проверяем. Если длина полученной переменной меньше 4, то она не подходит */
if( strlen($name)<|| strlen($inn)<|| strlen($address)<|| strlen($tel)<|| strlen($email)<|| strlen($order) <)                
  {
  exit(
"<p style='color: #FFFFFF; font-family: Verdana; font-size: 10pt'>Заполнены не все поля, или их содержимое слишком мало!</p>"); 
  }
           
/* Проверяем переменную полученную из сессии. Если она есть, то убиваем её и продолжаем                                             выполнение скрипта*/
if (isset($_SESSION['protect']))  
 {
 unset (
$_SESSION['protect']);
 
session_destroy();
                                        
/* пишем данные в базу */
 
$query="INSERT INTO `order` ( `order` , `name` , `email` , `tel` , `address` , `inn` , `date` ) 
 VALUES ('$order', '$name', '$email', '$tel', '$address', '$inn', '$date');"
;

 
mysql_query ("SET NAMES `cp1251`");            // выбираем кодировку
 
mysql_query ($query) or die(mysql_error ());
 
mysql_free_result();       //Освобождение памяти, занятой результатом запро                          
 
mysql_close();  //Закрытие соединения 

 
echo"<p align='justify' style='color: #FFFFFF; font-family: Verdana; font-size: 10pt'>Спасибо!                          Ваша заявка принята.</p>"
 }
else 
 {
 exit (
"<p align='justify' style='color: #FFFFFF; font-family: Verdana; font-size: 10pt'>Если вы   хотите отправить ещё один заказ, то создайте его заново.</p>");
 }



Спустя 13 минут, 42 секунды (3.08.2009 - 22:21) Gabriel написал(а):
Цитата
Кусок весьма логичен, но работать будет некорректно.

можеш обьяснить его логичность?

Спустя 46 секунд (3.08.2009 - 22:21) twin написал(а):
Снизу вверх.
Цитата
mysql_real_escape_string вырезает только '\n', '\r', '\', ''', '"'. Почему нельзя вырезать ещё пробелы и хтмл теги?.

Вопервых эта функция ничего не вырезает, а только экранирует. Во вторых, я ни слова не написал, что нельзя. Это зависит от потребностей, которых тут невидно. Может и требует логика приложения их вырезать, только к безопасности это отношения не имеет.
Дальше. Я почему и написал, что не вижу защиты от F5, а вижу геморрой, который ни тебе ни юзеру не даст ничего хорошего. Делается это простым редиректом. А если нужен флуд-контроль, то это гораздо сложнее, чем проверить и убить сессию.
Про кодировки. Если это маленький сайтец для побаловаться, то вопросов нет, можно и так. Это дело привычки. Просто потом не станет работать аякс к примеру или с почтой вечно неурядицы. И так далее. Если уж заниматься серьёзно, то нужно сразу привыкать к нормальной кодировке.
Экзит можно заменить логикой. иф... ельзе. И выводить отформатированную, с дизайном, красивую страницу. А на ней вывести предупреждение о ошибке.
А переменные должны быть объявлены. Вот у тебя идет прямое обращение к массиву POST. А если в нем нет такого элемента, то есть поле не заполнено? Это не просто пустое поле, это отсутствие переменной. То есть интерпретатор обращается вникуда. Если есть переменная, но она пустая - это одно. А когда её нет - это другое. И это очень плохо. Нужно сначала проверить, есть ли такой элемент. А потом, если по логике нужно обращение к переменной, объявить её. То есть записать начальное значение. Пусть даже пустоту. Вот так:
PHP
if(!empty($_POST['name']))
$name $_POST['name'];
else
$name NULL;

Либо тернарным оператором.
PHP
$name = !empty($_POST['name'])?$_POST['name']:NULL;

А уже после засовывать её в кучу функций, которые на мой взгляд тут совсем ни к месту. По крайней мере strip_tags().
Но это дело уже хозяйское.


Спустя 1 минута, 51 секунда (3.08.2009 - 22:23) twin написал(а):
Цитата
можеш обьяснить его логичность?

Логика, хотя и не совсем к месту, тут простая. Это триггер. То есть дает возможность зайти только один раз. Как зашел, сессию убили и все, нужно новую. Вот на чем он и споткнулся. Хотя этот прием очень часто применяется.

Спустя 32 секунды (3.08.2009 - 22:24) Raito-kun написал(а):
Цитата
можеш обьяснить его логичность?

Цитата
Защита от F5 есть и работает, есть одна проблемк которую описал в 1 сообщении. Выглядит так: создаётся переменная в сессии. Если она есть то в странице, где обрабатываются данные из формы, переменная убивается и выполняется основной код. Жмёшь F5. Переменной из сессии не
обнаруживается. Выход.

Спустя 5 минут, 23 секунды (3.08.2009 - 22:29) ANG3 написал(а):
Спасибо! Постараюсь побыстрее всё исправить и выложить результат.

Спустя 4 минуты, 57 секунд (3.08.2009 - 22:34) ANG3 написал(а):
Можете объяснить для чего стоит "!" перед empty ?.

Защитить от пустых переменных я хотел такой вот конструкцией.

PHP
if( strlen($name)<|| strlen($inn)<|| strlen($address)<|| strlen($tel)<|| strlen($email)<|| strlen($order) <)                
  {
  exit(
"<p style='color: #FFFFFF; font-family: Verdana; font-size: 10pt'>Заполнены не все поля, или их содержимое слишком мало!</p>"); 
  }

Спустя 34 минуты, 54 секунды (3.08.2009 - 23:09) Gabriel написал(а):
знак вокслицания ето отрицание тоесть !empty = не пустое

Спустя 20 минут, 39 секунд (3.08.2009 - 23:30) Dezigo написал(а):
не это
PHP
mysql_free_result();

а это
PHP
mysql_free_result($query);

Спустя 48 минут, 26 секунд (4.08.2009 - 00:18) ANG3 написал(а):
Блин. Сильно по голове не бейте...

С " ! " попробовал и так и так. Отлично всё, правда код получился очень громоздким.
Если использовать Header, то придётся плодить множество страниц типо error.php и т.д.

НО главаная проблема вот в чём. Header просто не работает.
Возможно из-за include. Как бы я include не делал, что так <?php include... ?>
Что просто в основном коде, редирект не работае. Убираю все инклуды - добавляет в базу нормально, но скрипт игнорирует проверку на заполнение форм, которая идёт в начале. Вставляю методом include в страницу хтмл код дизайна снизу и сверху. + файл c подключением к MySQL.


Незнаю что делать. Какие ещё могут быть причины?


Вот полный код:

PHP
<?php
include('inc/head.inc')
?>
<?php
include('inc/body.inc')
?>
<?php
include('inc/top_menu.inc')
?>
<?php
include('inc/second_menu.inc')
?>

<div align='center'>
  <center>
  <table border='0' cellpadding='0' cellspacing='0' width='920'>
    <tr>
      <td style='font-size: 10pt; color: #FFFFFF; font-family: Tahoma'>
        <div align='center'>
          <table border='0' cellpadding='0' cellspacing='0' width='920'>
            <tr>
              <td width='136' style='font-family: Tahoma; font-size: 11pt; font-weight: bold; padding-left: 5; padding-top: 10; padding-bottom: 10' valign='top'>
            
<?php
include('mysql.php')
?>


<?php  
   
/* name */
if(!empty($_POST['name']))
{
   
$name=mysql_real_escape_string(trim(strip_tags($_POST['name'])));
}
else
{
   
$name NULL;
}
   
/* inn */        
if(!empty($_POST['inn']))
{
   
$inn=mysql_real_escape_string(trim(strip_tags($_POST['inn'])));
}
else
{
   
$inn NULL;
}
   
/* address */
if(empty($_POST['address']))
{
  
$address NULL;
}
else
{
  
$address=mysql_real_escape_string(trim(strip_tags($_POST['address'])));
}
   
/* tel */
if(empty($_POST['tel']))
{
  
$tel NULL;
}
else
{
   
$tel=mysql_real_escape_string(trim(strip_tags($_POST['tel'])));
}
   
/* email */
if(empty($_POST['email']))
{
  
$emailNULL;
}
else
{
  
$email=mysql_real_escape_string(trim(strip_tags($_POST['email'])));
}
   
/* order */
if(empty($_POST['order']))
{
  
$order NULL;
}
else
{
  
$order=mysql_real_escape_string(trim(strip_tags($_POST['order'])));
}

  
$date=date ('d.m.Y',mktime ());
               
               
/* Проверяем. Если длина полученной переменной меньше 4, то она не подходит */
if( strlen($name)<|| strlen($inn)<|| strlen($address)<|| strlen($tel)<|| strlen($email)<|| strlen($order) <)                
  {
 
header ("Location: error.php");
  }
                                        
/* пишем данные в базу */
 
$query="INSERT INTO `order` ( `order` , `name` , `email` , `tel` , `address` , `inn` , `date` ) 
 VALUES ('$order', '$name', '$email', '$tel', '$address', '$inn', '$date');"
;

 
mysql_query ("SET NAMES `cp1251`");            // выбираем кодировку
 
mysql_query ($query) or die(mysql_error ());
 
mysql_free_result($query);       //Освобождение памяти, занятой результатом запроса                          
 
mysql_close();  //Закрытие соединения 
 
header ("Location: confirm.php");

?> 

              
        
              
<p>&nbsp;</p>
      <p></td>
  </tr>
                  </table>
                </div>
              </center>
              </td>
            </tr>
            <tr>
              <td width='920' style='padding-bottom: 10' valign='top' colspan='2'></td>
            </tr>
          </table>
        </div>
      
    </tr>
  </table>
</div>



<?php
include('inc/bottom.inc')
?>
<?php
include('inc/end.inc')

Из-за этого я и хотел использовать сессии.

Спустя 19 минут, 35 секунд (4.08.2009 - 00:38) ANG3 написал(а):
Нащёл вот это! ohmy.gif

Помните, что header() обязана вызываться до отправки любого вывода: нормальными ли тэгами HTML, пустыми строками в файле или из PHP. Очень частой ошибкой является чтение кода функциями include() или require(), или другой функцией доступа к файлу, и наличие пробелов или пустых строк, которые выводятся до вызова header(). Та же проблема возникает при использовании едингого PHP/HTML-файла

Что делать? blink.gif

Спустя 31 минута, 53 секунды (4.08.2009 - 01:09) PandoraBox2007 написал(а):
header ставится в самом начале до вывода (заголовок приходит раньше после вывода данных из сервера)

session_start(); до реквестов и нклюдов

Спустя 36 минут, 49 секунд (4.08.2009 - 01:46) PandoraBox2007 написал(а):
PHP
<?php

include('inc/head.inc');
include(
'inc/body.inc');
include(
'inc/top_menu.inc');
include(
'inc/second_menu.inc');

?>
<div align='center'>
  <center>
  <table border='0' cellpadding='0' cellspacing='0' width='920'>
    <tr>
      <td style='font-size: 10pt; color: #FFFFFF; font-family: Tahoma'>
        <div align='center'>
          <table border='0' cellpadding='0' cellspacing='0' width='920'>
            <tr>
              <td width='136' style='font-family: Tahoma; font-size: 11pt; font-weight: bold; padding-left: 5; padding-top: 10; padding-bottom: 10' valign='top'>
            <?php
require('mysql.php');

 $name      = (!empty($_POST['name']))    ?  mysql_escape_string($_POST['name'])    : NULL;
 $inn       = (!empty($_POST['inn']))     ?  mysql_escape_string($_POST['inn'])     : NULL;
 $address   = (!empty($_POST['address'])) ?  mysql_escape_string($_POST['address']) : NULL;
 $tel       = (!empty($_POST['tel']))     ?  mysql_escape_string($_POST['tel'])     : NULL;
 $email     = (!empty($_POST['email']))   ?  mysql_escape_string($_POST['email'])   : NULL;
 $order     = (!empty($_POST['order']))   ?  mysql_escape_string($_POST['order'])   : NULL;

 $date = date('d.m.Y', mktime());
              
// Проверяем длину
if (strlen($name) < 4 || strlen($inn) < 4 || strlen($address) < 4 || strlen($tel) < 4 || strlen($email) < 4 || strlen($order) < 4)
{
    // Veri small length smile.gif 
    header ("Location: error.php?code=10");
}
if (strlen($name) > 35 || strlen($inn) > 120 || strlen($address) > 97 || strlen($tel) > 130 || strlen($email) > 60 || strlen($order) > 60)
{
    // Veri big length >:-[
    header ("Location: error.php?code=11");
}
 
 
// пишем данные в базу
 $sql = "INSERT INTO `order` (`order`, `name`, `email`, `tel`, `address`, `inn`, `date`) ";
 $sql = "VALUES ('$order', '$name', '$email', '$tel', '$address', '$inn', '$date')";

 $result = mysql_query ("SET NAMES `cp1251`");            // выбираем кодировку
 if ($result = mysql_query ($sql) or die(mysql_error()))
 {
  mysql_free_result($result);       //Освобождение памяти, занятой результатом запроса   
  mysql_close();  //Закрытие соединения                        
  header ("Location: confirm.php");    
 
}

?> 

<p>&nbsp;</p>
      <p></td>
  </tr>
                  </table>
                </div>
              </center>
              </td>
            </tr>
            <tr>
              <td width='920' style='padding-bottom: 10' valign='top' colspan='2'></td>
            </tr>
          </table>
        </div>
      
    </tr>
  </table>
</div>



<?php

include('inc/bottom.inc');
include(
'inc/end.inc');

Спустя 53 минуты, 58 секунд (4.08.2009 - 02:40) twin написал(а):
Хидер на ту же страницу надо. И форму вернуть заполненную.
Вот тут почитай, и вот тут. Надоело писать одно и то же... Там много чего есть еще.

Спустя 21 час, 46 секунд (4.08.2009 - 23:41) ANG3 написал(а):
СПАСИБО! Очень полезная статья! biggrin.gif

Вот код )
Свернутый текст
PHP
<?php 
/* Параметры */
$hostname "localhost";
$username "root";
$password "123";

/* Соединение, выбор БД */
mysql_connect($hostname,$username,$password) or die("Нет соединения"); 
mysql_select_db('kreptor_catalog');


/* $tel=mysql_real_escape_string(trim(strip_tags($_POST['tel']))); */
$name    = isset($_POST['name'])    ?     mysql_real_escape_string(trim($_POST['name']))       :null
$inn     = isset($_POST['inn'])     ?      mysql_real_escape_string(trim($_POST['inn']))       :null
$address = isset($_POST['address']) ?  mysql_real_escape_string(trim($_POST['address']))       :null;
$tel     = isset($_POST['tel'])     ?      mysql_real_escape_string(trim($_POST['tel']))       :null;
$email   = isset($_POST['email'])   ?    mysql_real_escape_string(trim($_POST['email']))       :null;
$order   = isset($_POST['order'])   ?    mysql_real_escape_string(trim($_POST['order']))       :null;
$date=date ('d.m.Y',mktime ());
    
if(isset(
$_POST['B1'])) 
{

          
/* Проверяем. Если длина полученной переменной меньше 4, то она не подходит */
if (strlen($name) < || strlen($inn) < || strlen($address) < || strlen($tel) < || 
strlen($email) < || strlen($order) < 4)
  {  
  
header ("Location: notice.php?code=10");
  }    
elseif (
strlen($name) > 250 || strlen($inn) > 250 || strlen($address) > 250 || strlen($tel) > 250 || strlen($email) > 250)
  {  
  
header ("Location: notice.php?code=11");
  }                              
  
  elseif(isset(
$_POST['B1'])) 
{
        
/* пишем данные в базу */
 
$query="INSERT INTO `order` ( `order` , `name` , `email` , `tel` , `address` , `inn` , `date` ) 
 VALUES ('$order', '$name', '$email', '$tel', '$address', '$inn', '$date');"
;

 
mysql_query ("SET NAMES `cp1251`");            // выбираем кодировку
 
mysql_query ($query) or die(mysql_error ());
 
mysql_free_result();       //Освобождение памяти, занятой результатом запро                          
 
mysql_close();  //Закрытие соединения 
  
  
unset ($name);     
 
header ("Location: notice.php?code=12"); 
  
}
}
?>


<?php
include('inc/head.inc')
?>
<?php
include('inc/body.inc')
?>
<?php
include('inc/top_menu.inc')
?>
<?php
include('inc/second_menu.inc')
?>
<div align='center'>
  <center>
  <table border='0' cellpadding='0' cellspacing='0' width='920'>
    <tr>
      <td style='font-size: 10pt; color: #FFFFFF; font-family: Tahoma'>
        <div align='center'>
          <table border='0' cellpadding='0' cellspacing='0' width='920'>
            <tr>
              <td width='136' style='font-family: Tahoma; font-size: 11pt; font-weight: bold; padding-left: 5; padding-top: 10; padding-bottom: 10' valign='top'>
              

<form method='POST' action='?'>
  <p align='left'><b>ЗАКАЗ on-line</b>
<p align='left'><font face='Tahoma'><input type='text' name='name' size='40' value="<?php echo htmlspecialchars($name); ?>">
  - Название организации (ваше имя)</font></p>
  <p align='left'><font face='Tahoma'><input type='text' name='inn' size='40' value="<?php echo htmlspecialchars($inn); ?>"> 
  - ИНН/КПП</font></p>
  <p align='left'><font face='Tahoma'><input type='text' name='address' size='40' value="<?php echo htmlspecialchars($address); ?>"> -
  Адрес</font></p>
<p align='left'><font face='Tahoma'><input type='text' name='tel' size='40' value="<?php echo htmlspecialchars($tel); ?>"> -
  Телефон для связи</font></p>
  <p align='left'><font face='Tahoma'><input name='email' type='text' size='40' value="<?php echo htmlspecialchars($email); ?>"> 
  - E-mail</font></p>
  <p align='left'><font face='Tahoma'><b>Ваш заказ</b> (укажите
  наименование (ГОСТ) и количество</font></p>
  <p align='left'><font face='Tahoma'>необходимых метизов). Наши
  менеджеры свяжутся с Вами.</font></p>
  <p align='left'><font face='Tahoma'>
  <textarea name="order" cols="40" rows="8"><?php echo htmlspecialchars($order); ?></textarea> 
  </font></p>
  <p align='left'><font face='Tahoma'><input type='submit' value='Отправить' name='B1'>
</form>



<p>&nbsp;</p>
      <p></td>
  </tr>
                  </table>
                </div>
              </center>
              </td>
            </tr>
            <tr>
              <td width='920' style='padding-bottom: 10' valign='top' colspan='2'></td>
            </tr>
          </table>
        </div>
      
    </tr>
  </table>
</div>
<?php
include('inc/bottom.inc')
?>
<?php
include('inc/end.inc')





Есть один вопрос. Юзер отправляет заявку. Редирект. Он нажимает назад и видит уже заполненную форму. Даже если я уберу содержание тегов Value в форме, то форма всё равно вернётся заполненной. Как исправить?



mysql_free_result($query); или mysql_free_result() - выдаёт ошибку в логах апача

[Wed Aug 05 00:34:53 2009] [error] [client 127.0.0.1] PHP Warning: Wrong parameter count for mysql_free_result() in C:\\www\\KREPTORG\\kreptorg.ru\\zak.php on line 43, referer: http://localhost/kreptorg/kreptorg.ru/zak.php


Эта ошибка мне тоже не понятна.
[Wed Aug 05 00:34:42 2009] [error] [client 127.0.0.1] PHP Notice: Undefined variable: name in C:\\www\\KREPTORG\\kreptorg.ru\\zak.php on line 79, referer: http://localhost/kreptorg/kreptorg.ru/zak.php




Спустя 2 часа, 20 минут, 40 секунд (5.08.2009 - 02:02) twin написал(а):
Цитата
Как исправить?

А никак. Можно попробовать кэш запретить, но тогда пострадают невинные юзеры. Такими топорными методами антифлуд несробить.
Цитата
mysql_free_result($query); или mysql_free_result() - выдаёт ошибку в логах апача
Убери совсем их. Соединение разрывается и память очищается автоматически, когда заканчивает работу скрипт. Если бы он работал дальше, а запросы были бы не нужны, то стоило бы экономить память.
А вот exit(); после редиректа поставь. Незачем скрипту молотить, если юзер уже ушел.
Цитата
Эта ошибка мне тоже не понятна.

А это понятно очень даже. Я же написал, надо !empty() использовать. Тогда будет все ровно. А так получается, что элемент вроде как есть в массиве, но пустой. и выходит что попало.

Спустя 5 часов, 24 минуты, 43 секунды (5.08.2009 - 07:26) Sylex написал(а):
Цитата (twin @ 5.08.2009 - 05:02)
А вот exit(); после редиректа поставь. Незачем скрипту молотить, если юзер уже ушел.


кстати да, если проигнорировать этот заголовок при приеме браузером - это будет нарушением безопасности, если программа не завершается - т.к. я дальше буду получать все ост. содержимое контента

думаю понятно объяснил smile.gif

Спустя 3 часа, 24 минуты, 38 секунд (5.08.2009 - 10:51) ANG3 написал(а):
Вот : )

Цитата
Такими топорными методами антифлуд несробить.


Как сделать так: пользователь попадает на страницу, где написано, что его заявка отправлена, жмёт назад и попадает на гл. стр. Мб опять применить сессии? biggrin.gif

Свернутый текст

PHP
<?php 
/* Параметры */
$hostname = "localhost";
$username = "root";
$password = "123";

/* Соединение, выбор БД */
mysql_connect($hostname,$username,$password) or die("Нет соединения"); 
mysql_select_db
('kreptor_catalog');


/* $tel=mysql_real_escape_string(trim(strip_tags($_POST['tel']))); */
$name    = !empty($_POST['name'])    ?     mysql_real_escape_string(trim($_POST['name']))       :null;
$inn     = !empty($_POST['inn'])     ?      mysql_real_escape_string(trim($_POST['inn']))       :null;
$address = !empty($_POST['address']) ?  mysql_real_escape_string(trim($_POST['address']))       :null;
$tel     = !empty($_POST['tel'])     ?      mysql_real_escape_string(trim($_POST['tel']))       :null;
$email   = !empty($_POST['email'])   ?    mysql_real_escape_string(trim($_POST['email']))       :null;
$order   = !empty($_POST['order'])   ?    mysql_real_escape_string(trim($_POST['order']))       :null;
$date=date ('d.m.Y',mktime ());
    
if(isset($_POST['B1'])) 
{

          /* Проверяем. Если длина полученной переменной меньше 4, то она не подходит */
if (strlen($name) < 4 || strlen($inn) < 4 || strlen($address) < 4 || strlen($tel) < 4 || 
strlen
($email) < 4 || strlen($order) < 4)
  {  
  header 
("Location: notice.php?code=10");
  }    
elseif 
(strlen($name) > 250 || strlen($inn) > 250 || strlen($address) > 250 || strlen($tel) > 250 || strlen($email) > 250)
  {  
  header 
("Location: notice.php?code=11");
  }                              
  
  elseif
(isset($_POST['B1'])) 
{
        /* пишем данные в базу */
 $query="INSERT INTO `order` ( `order` , `name` , `email` , `tel` , `address` , `inn` , `date` ) 
 VALUES ('$order', '$name', '$email', '$tel', '$address', '$inn', '$date');"
;

 mysql_query ("SET NAMES `cp1251`");            // выбираем кодировку
 mysql_query ($query) or die(mysql_error ());
  
 header 
("Location: notice.php?code=12"); 
 exit
();
}
}

Спустя 23 часа, 44 минуты, 45 секунд (6.08.2009 - 10:36) ANG3 написал(а):
Проверьте на уязвимость пожалуйста.

Спустя 1 час, 52 минуты, 59 секунд (6.08.2009 - 12:29) twin написал(а):
Цитата
А вот exit(); после редиректа поставь. Незачем скрипту молотить, если юзер уже ушел.



кстати да, если проигнорировать этот заголовок при приеме браузером - это будет нарушением безопасности, если программа не завершается - т.к. я дальше буду получать все ост. содержимое контента

думаю понятно объяснил

Ну вот же ясно написали, аж два раза...
А по вопросу таки да, сессия нужна. Но это не антифлуд вовсе получается, а уникальность заказа.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.