|
|
|
| Привет всем!
меня немного волнует такой вопрос:
если данные из формы передаются в запрос базы данных методом 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 ? | |
|
|
|
|
|
|
|
для: ANGO
(18.05.2007 в 14:09)
| | >ВОПРОС:
>Есть ли опасность, если кто то угадает и передаст переменную $sID методом GET , которая минует проверку ?
Есть.
>или же нужно дополнительно прописывать if(isset($_GET['ID'])) ???
нет, не в этом дело
>И какова принципиальная часть здесь активации или нет REGISTER_GLOBALS ?
да, это принципиально.
[поправлено автором] | |
|
|
|
|
|
|
|
для: Trianon
(18.05.2007 в 14:30)
| | а если я REGISTER_GLOBALS отключил полностью, и устроил проверку всех переменных вначале файла?
с какой стороны могут пролезть необработанные провереой переменные? | |
|
|
|
|
|
|
|
для: Trianon
(18.05.2007 в 14:30)
| | >Есть ли опасность, если кто то угадает и передаст переменную $sID методом GET , которая минует проверку ?
Есть.
>или же нужно дополнительно прописывать if(isset($_GET['ID'])) ???
нет, не в этом дело
------ А В ЧЕМ ТУТ ДЕЛО ??? | |
|
|
|
|
|
|
|
для: ANGO
(18.05.2007 в 15:02)
| | $_REQUEST можно использовать этот масив | |
|
|
|
|
|
|
|
для: Саша
(18.05.2007 в 15:55)
| | не поможет. | |
|
|
|
|
|
|
|
для: ANGO
(18.05.2007 в 15:02)
| | >------ А В ЧЕМ ТУТ ДЕЛО ???
в неинициализированных переменных.
и не надо так орать. Энергию лучше направить на то, чтобы подумать над скриптом. | |
|
|
|
|
|
|
|
для: Trianon
(18.05.2007 в 15:57)
| | то есть не определять новую переменную $sID, а сделать так:
if(isset($_POST['ID']))
$ID=intval(SqlSafeStr($_POST['ID'])); | |
|
|
|
|
|
|
|
для: ANGO
(18.05.2007 в 16:22)
| | сколько переменных инициализировано в вашем скрипте если в массиве POST нет ключа ID?
зависит ли это обстоятельство от того, как именно Вы назвали переменную? | |
|
|
|
|
|
|
|
для: 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' ")
то есть из каталога идет выборка по категории и подкатегории
вот я думаю, где тут мне могут подсунуть что то нехорошее? | |
|
|
|
|
|
|
|
для: ANGO
(18.05.2007 в 16:44)
| | Как будет выполняться Ваш скрипт, если переменных id1 и id2 передано не будет? | |
|
|
|
|
|
|
|
для: ANGO
(18.05.2007 в 16:22)
| | - | |
|
|
|
|
|
|
|
для: Valick
(18.05.2007 в 16:45)
| | страница обрабатывает 2 условия, в которых находится SQL запрос и весь рабочий РНР код:
if(isset($id1) AND !isset($id2))
{
...
тут открывается только 1 категория
...
}
if(isset($id1) AND isset($id2))
{
...
тут открывается, например 1 подкатегория 1 категории
...
} | |
|
|
|
|
|
|
|
для: ANGO
(18.05.2007 в 16:56)
| | Написаное Вами только что противоречит написанному ранее. | |
|
|
|
|
|
|
|
для: Trianon
(18.05.2007 в 17:00)
| | что именно противоречит? | |
|
|
|
|
|
|
|
для: ANGO
(18.05.2007 в 17:03)
| | я вот думаю. в такой конструкции, есть ли какие дырки? | |
|
|
|
|
|
|
|
для: 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))
условия отличаются. | |
|
|
|
|
|
|
|
для: 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();
}
?>
|
| |
|
|
|
|
|
|
|
для: 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();
}
?>
|
| |
|
|
|
|
|
|
|
для: Trianon
(18.05.2007 в 17:43)
| | а можно по подробнее, для человека, который только год програмит
вы добавили @
гда то можно более подробнее почитать? | |
|
|
|
|
|
|
|
для: ANGO
(18.05.2007 в 17:55)
| | то есть проверку if(isset($_GET['id1'])) осуществлять не нужно? | |
|
|
|
|
|
|
|
для: ANGO
(18.05.2007 в 17:57)
| | Попрошу, кто может объяснить подробнее, чем
if(isset($_GET['id1'])) $id1=intval(SqlSafeStr($_GET['id1']));
отличается от
$id1=intval(SqlSafeStr(@$_GET['id1']));
раньше я думал что @ ставится перед функцией чтобы скрыть ее ошибку | |
|
|
|
|
|
|
|
для: 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);
?>
|
В качестве параметра, которой передать соответствующий уровень обработки ошибок. | |
|
|
|
|
|
|
|
для: cheops
(19.05.2007 в 01:06)
| | Варианты разнятся в первую очередь в том, что первый вариант имеет случаи, когда оставит переменную без вновь присвоенного значения. Это в рассматриваемом контексте - значимое отличие. А то, чем глушить нотисы - так, мелочи, на алгоритм не влияющие. | |
|
|
|
|
|
|
|
для: 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 и даже "".
[поправлено модератором] | |
|
|
|
|
|
|
|
для: Trianon
(19.05.2007 в 14:29)
| | Спасибо, понял! | |
|
|
|