Как защититься от извращений в адресной строке?

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Как защититься от извращений в адресной строке?

подскажите плз как защититься от того, чтоб юзер не смог ввести в строку урлы другое значение (например должно быть
index.php?n=20, ну а есть всякие таланты, которые вводят index.php?n=афвыа, ну и тому подобное)

в итоге ПХП-ешный скрипт начинает матюжиться.....
что не совсем хорошо...

где выход?
 

Gadget

Guest
Ну хотя бы сделать проверку
if (!is_numeric(n)) die "Stop messing with url ";
 

DVA

Guest
А если надо не только определить правильность типов но и заблокировать ручное изменение параметров:
PHP:
<?
# Создаём хэш
function get_check($get,$add="bla-bla")
{
return md5($get.$add);
}
# Проверка
function check($ch)
{
if ($ch!=get_check($ch)) {die("Нарушение целостности данных");}
}
?>
На стороне передачи пишем:
PHP:
<?
$get="?a=".$a."&b=".$b"&c=".$c"&check=".get_check($a.$b.$c);
?>
<a href=index.php<?=$get>>Пошли?</a>
На стороне приёма:
PHP:
check($_GET['a'].$_GET['b'].$_GET['c']);
Кажется так..
 

С.

Guest
Вы странные ребята. Зачем вы вообще передаете аргумент, если заранее знаете какой он должен быть?
 

DVA

Guest
А гдже написано что мы знаем ? Если Скрипт1 знает нечто, как ему это передать Скрипту2 в другом домене ? :)
 

С.

Guest
Так если не знаете, так с чем же сверяте?

Максимум, с чем можно сверить - со списком или диапазоном допустимых значений, и если пришедший аргумент не входит в него, то поступать по умолчанию.

Все, что сверх этого вы там навяли разных get_check() и есть самое настоящее извращение.
 

vasilisk

Guest
Совершенно верно, предложенный способ в данном случае полная лажа. Решение достаточно интересное, но в данном случае его применение не обоснованно. Объясню на примере: Если у выводятся данные из таблицы, и у каждой записи есть типа "edit" и нужно передавать несколько параметров, то также для КАЖДОЙ записи нужно считать и передавать "ключ целостности". Бред полный.
Я эту проблему обхожу по простому
$var=floor($HTTP_GET_VARS["var_name"]);
if ($var==0){print "Something going wrong :)";}

и так для всех переменных которые должны придти в int.
"0" в качестве параметров передаются крайне редко и эти случаи легко отследить. За подстановку text переменных волноваться не стоит, т.к. благодоря magic_quotes=On что-то плохое сделать сложно :)
 

RomikChef

Guest
Вася, это делается так:

if (!($var=intval($var))) print "Something goes wrong ";

;-)
 

RomikChef

Guest
или как Дима сказал
if (!$var+=0) print "Something goes wrong ";
 

Чих-пых

Guest
На самом деле DVA предложил реальный метод защиты от изменения данных в строке. Он же так и написал: "А если надо не только определить правильность типов но и заблокировать ручное изменение параметров..."
 

RomikChef

Guest
очень интересно, и что же помешает сюзеру написать фыва, а скрипту - матюкнуться?

И почему ты читаешь только половину сообщения, а не все?
Если бы здесь отвечали не на тот вопрос, который человек ИМЕЛ В ВИДУ, а на тот, который НАПИСАЛ, то это был бы не форум программистов, а помесь цирка с дурдомом.
 

Чих-пых

Guest
2 RomikChef:
PHP:
if ($ch!=get_check($ch)) {die("Нарушение целостности данных");}
если юзер напишет фыва, и не посчитает хэш для фыва, скрипт матюкнётся.
 

DVA

Guest
Помогите, убивают :)
подскажите плз как защититься от того, чтоб юзер не смог ввести в строку урлы другое значение (например должно быть
index.php?n=20, ну а есть всякие таланты, которые вводят index.php?n=афвыа, ну и тому подобное
Чем плох мой способ, объясните ?
Я действительно прошу ответа, а не доказываю свою правоту.
Речь же шла о защите от МОДИФИКАЦИИ а не о проверке на тип ?

Если у выводятся данные из таблицы, и у каждой записи есть типа "edit" и нужно передавать несколько параметров, то также для КАЖДОЙ записи нужно считать и передавать "ключ целостности". Бред полный.
Где бред ? Сложно посчитать для 10 записей 10 ключей ? А проверять имеет ли данный пользователь право на редактирование указанной записи не сложно ?
login.php - пользователь авторизовался.
list.php - выдача списка записей, доступных для редактирования.
edit.php - редактирование записей.
если я имею право на редактирование записей №1,2 и 3 - что в твоём случае помешает мне набрать edit.php?n=5 и забраться в запись которую я не должен менять, а ? Дополнительная проверка запросом к базе ?
А оно надо, если можно просто сравнить хэш полученный с хэшэм расчётным ?

Нет правда, объясните. Не понимаю :(
 

RomikChef

Guest
Чих, ты не заметил, что мой скрипт делает то же самое, только безо всяких дурацких преобразований?
Если человеку достаточно привести к числу - зачем все эти хэши?

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

RomikChef

Guest
Два, да проверка дополнительным запросом к базе.
НЕ ВАЖНО, каким путем попадают неверные данные в скрипт.
Злоумышленник - не единственный вариант.
 

si

Administrator
человек все правильно говорит, , его способ обладает как приемуществами так и недостатками, как и твой впрочем, все дело в том где и какой удобнее применять.

P.S давно заметил, если тебя несет, остановиться ты не можешь :)
 
Сверху