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

Форум PHP

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

 

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

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

тема: Проверки GET и POST ???
 
 автор: ANGO   (18.05.2007 в 14:09)   письмо автору
 
 

Привет всем!

меня немного волнует такой вопрос:
если данные из формы передаются в запрос базы данных методом POST , к примеру ID=33 и я осуществляю проверку вначале файла:

if(isset($_POST['ID']))
$sID=intval(SqlSafeStr($_POST['ID']));

где
function SqlSafeStr($str)
{
return htmlspecialchars(str_replace(" ' ", " ` ", trim($str)));
}


ну и далее $strID уже идет запросом на добавление в базу...
ВОПРОС:
Есть ли опасность, если кто то угадает и передаст переменную $sID методом GET , которая минует проверку ? или же нужно дополнительно прописывать if(isset($_GET['ID'])) ???
И какова принципиальная часть здесь активации или нет REGISTER_GLOBALS ?

   
 
 автор: Trianon   (18.05.2007 в 14:30)   письмо автору
 
   для: ANGO   (18.05.2007 в 14:09)
 

>ВОПРОС:
>Есть ли опасность, если кто то угадает и передаст переменную $sID методом GET , которая минует проверку ?

Есть.

>или же нужно дополнительно прописывать if(isset($_GET['ID'])) ???

нет, не в этом дело

>И какова принципиальная часть здесь активации или нет REGISTER_GLOBALS ?

да, это принципиально.

[поправлено автором]

   
 
 автор: ANGO   (18.05.2007 в 15:01)   письмо автору
 
   для: Trianon   (18.05.2007 в 14:30)
 

а если я REGISTER_GLOBALS отключил полностью, и устроил проверку всех переменных вначале файла?
с какой стороны могут пролезть необработанные провереой переменные?

   
 
 автор: ANGO   (18.05.2007 в 15:02)   письмо автору
 
   для: Trianon   (18.05.2007 в 14:30)
 

>Есть ли опасность, если кто то угадает и передаст переменную $sID методом GET , которая минует проверку ?

Есть.

>или же нужно дополнительно прописывать if(isset($_GET['ID'])) ???

нет, не в этом дело

------ А В ЧЕМ ТУТ ДЕЛО ???

   
 
 автор: Саша   (18.05.2007 в 15:55)   письмо автору
 
   для: ANGO   (18.05.2007 в 15:02)
 

$_REQUEST можно использовать этот масив

   
 
 автор: Trianon   (18.05.2007 в 15:56)   письмо автору
 
   для: Саша   (18.05.2007 в 15:55)
 

не поможет.

   
 
 автор: Trianon   (18.05.2007 в 15:57)   письмо автору
 
   для: ANGO   (18.05.2007 в 15:02)
 

>------ А В ЧЕМ ТУТ ДЕЛО ???
в неинициализированных переменных.
и не надо так орать. Энергию лучше направить на то, чтобы подумать над скриптом.

   
 
 автор: ANGO   (18.05.2007 в 16:22)   письмо автору
 
   для: Trianon   (18.05.2007 в 15:57)
 

то есть не определять новую переменную $sID, а сделать так:

if(isset($_POST['ID']))
$ID=intval(SqlSafeStr($_POST['ID']));

   
 
 автор: Trianon   (18.05.2007 в 16:27)   письмо автору
 
   для: ANGO   (18.05.2007 в 16:22)
 

сколько переменных инициализировано в вашем скрипте если в массиве POST нет ключа ID?
зависит ли это обстоятельство от того, как именно Вы назвали переменную?

   
 
 автор: ANGO   (18.05.2007 в 16:44)   письмо автору
 
   для: Trianon   (18.05.2007 в 16:27)
 

нет не зависит ...

может я что то не корректно спросил, в общем у меня такой расклад:
register_globals отключен, то есть =off

запрос к странице передается в строке
index.php?id1=1&id2=7

В начеле файла стоит проверка
if(isset($_GET['id1'])) $id1=intval(SqlSafeStr($_GET['id1']));
if(isset($_GET['id2'])) $id2=intval(SqlSafeStr($_GET['id2']));

потом стоит SQL запрос
mysql_query("SELECT * FROM table WHERE cat_1='$id1' AND cat_2='$id2' ")

то есть из каталога идет выборка по категории и подкатегории

вот я думаю, где тут мне могут подсунуть что то нехорошее?

   
 
 автор: Trianon   (18.05.2007 в 16:49)   письмо автору
 
   для: ANGO   (18.05.2007 в 16:44)
 

Как будет выполняться Ваш скрипт, если переменных id1 и id2 передано не будет?

   
 
 автор: Valick   (18.05.2007 в 16:45)   письмо автору
 
   для: ANGO   (18.05.2007 в 16:22)
 

-

   
 
 автор: ANGO   (18.05.2007 в 16:56)   письмо автору
 
   для: Valick   (18.05.2007 в 16:45)
 

страница обрабатывает 2 условия, в которых находится SQL запрос и весь рабочий РНР код:

if(isset($id1) AND !isset($id2))
{
...
тут открывается только 1 категория
...
}

if(isset($id1) AND isset($id2))
{
...
тут открывается, например 1 подкатегория 1 категории
...
}

   
 
 автор: Trianon   (18.05.2007 в 17:00)   письмо автору
 
   для: ANGO   (18.05.2007 в 16:56)
 

Написаное Вами только что противоречит написанному ранее.

   
 
 автор: ANGO   (18.05.2007 в 17:03)   письмо автору
 
   для: Trianon   (18.05.2007 в 17:00)
 

что именно противоречит?

   
 
 автор: ANGO   (18.05.2007 в 17:04)   письмо автору
 
   для: ANGO   (18.05.2007 в 17:03)
 

я вот думаю. в такой конструкции, есть ли какие дырки?

   
 
 автор: Trianon   (18.05.2007 в 17:07)   письмо автору
 
   для: ANGO   (18.05.2007 в 17:03)
 

> ANGO (18.05.2007 в 14:09)
>.... и я осуществляю проверку вначале файла: if(isset($_POST['ID']))

и

> ANGO (18.05.2007 в 16:56)
> страница обрабатывает 2 условия, в которых находится SQL запрос и весь рабочий РНР код: if(isset($id1) AND !isset($id2))


условия отличаются.

   
 
 автор: ANGO   (18.05.2007 в 17:24)   письмо автору
 
   для: Trianon   (18.05.2007 в 17:07)
 

ой, я вас совсем запутал, пишу подробно как есть, в общем конструкция такая:

<?
if(isset($_GET['id1'])) $id1=intval(SqlSafeStr($_GET['id1']));
if(isset(
$_GET['id2'])) $id2=intval(SqlSafeStr($_GET['id2']));

if(isset(
$id1) AND !isset($id2))
{
mysql_query("SELECT * FROM table WHERE cat_1='$id1' ")
}

else if(isset(
$id1) AND isset($id2))
{
mysql_query("SELECT * FROM table WHERE cat_1='$id1' AND cat_2='$id2' ")
}

else
{
echo 
"<HTML><HEAD><META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.php'></HEAD></HTML>";
exit();
}
?>

   
 
 автор: Trianon   (18.05.2007 в 17:43)   письмо автору
 
   для: ANGO   (18.05.2007 в 17:24)
 

Еще раз повторяю. Переменные не инициализированы, из-за чего на скрипт может быть атака.
А теперь правильный вариант того же кода.

<?php
$id1 
intval(@$_GET['id1']); 
$id2 intval(@$_GET['id2']); 
if(
$id1 && !$id2)
    
mysql_query("SELECT * FROM table WHERE cat_1=$id1 "); 
else if(
$id1 && $id2)
    
mysql_query("SELECT * FROM table WHERE cat_1= $id1 AND cat_2=$id2 ");
else
{
  
header("Location: index.php");
  exit(); 
}
?>

   
 
 автор: ANGO   (18.05.2007 в 17:55)   письмо автору
 
   для: Trianon   (18.05.2007 в 17:43)
 

а можно по подробнее, для человека, который только год програмит
вы добавили @
гда то можно более подробнее почитать?

   
 
 автор: ANGO   (18.05.2007 в 17:57)   письмо автору
 
   для: ANGO   (18.05.2007 в 17:55)
 

то есть проверку if(isset($_GET['id1'])) осуществлять не нужно?

   
 
 автор: ANGO   (19.05.2007 в 00:46)   письмо автору
 
   для: ANGO   (18.05.2007 в 17:57)
 

Попрошу, кто может объяснить подробнее, чем

if(isset($_GET['id1'])) $id1=intval(SqlSafeStr($_GET['id1']));

отличается от

$id1=intval(SqlSafeStr(@$_GET['id1']));

раньше я думал что @ ставится перед функцией чтобы скрыть ее ошибку

   
 
 автор: cheops   (19.05.2007 в 01:06)   письмо автору
 
   для: ANGO   (19.05.2007 в 00:46)
 

Первый вариант позволяет исключить генерацию замечаний (Notice), правда последние часто отключают (на всех хостингах отключены). Для этого, следует выставить соответствующее значение для директивы error_reporting http://www.softtime.ru/info/articlephp.php?id_article=23, в конфигурационном файле php.ini
error_reporting = E_ALL & ~E_NOTICE  

Так же можно изменить уровень обработки ошибок локально, для этого в начало скрипта следует поместить функцию
<?php 
Error_Reporting
(E_ALL & ~E_NOTICE); 
?>

В качестве параметра, которой передать соответствующий уровень обработки ошибок.

   
 
 автор: Trianon   (19.05.2007 в 14:32)   письмо автору
 
   для: cheops   (19.05.2007 в 01:06)
 

Варианты разнятся в первую очередь в том, что первый вариант имеет случаи, когда оставит переменную без вновь присвоенного значения. Это в рассматриваемом контексте - значимое отличие. А то, чем глушить нотисы - так, мелочи, на алгоритм не влияющие.

   
 
 автор: Trianon   (19.05.2007 в 14:29)   письмо автору
 
   для: ANGO   (19.05.2007 в 00:46)
 

Строка if(isset($_GET['id1'])) $id1=intval($_GET['id1']); - ошибочна. Ошибка её заключается в том, что в случае отсутствия параметра id1 в строке запроса, переменная $id1 оказывается незаданной, и вполне может остаться от другого кода. Например от magic-quotes.
Правильный код такой:
if(isset($_GET['id1'])) $id1=intval($_GET['id1']); else $id1=false;
где false - значение, которое заведомо не может являться актуальным идентификатором.
Этот оператор может быть упрощен до
$id1= isset($_GET['id1']) ? $_GET['id1'] : false;
А вот последний практически эквивалентен записи $id1=intval(@$_GET['id1']);
Небольшая разница проявляется в том, как регистрируются ошибки, и в том что он возвращает null вместо false, но в последующий код не чувствует различий между null, false, 0 и даже "".

[поправлено модератором]

   
 
 автор: ANGO   (21.05.2007 в 15:09)   письмо автору
 
   для: Trianon   (19.05.2007 в 14:29)
 

Спасибо, понял!

   
Rambler's Top100
вверх

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