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

Форум PHP

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

 

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

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

тема: Переход на страницу, переданную в GET
 
 автор: bishake   (29.03.2010 в 20:16)   письмо автору
 
 

Добрый вечер!
Я только начал писать на PHP, и подумал, что было бы удобно передавать название просматриваемой страницы прямо через GET-параметр.
Скажите, приемлем ли такой подход для навигации по страницам сайта (админки) с точки зрения безопасности и надёжности?
<?php
// Удаляем все символы кроме букв и  цифр
$item_txt preg_replace("/[^a-z0-9]/i"""$_GET["item"]);
switch(
$item_txt)
{
  case 
"inbox":     $item_num 1; break;
  case 
"langs":     $item_num 2; break;
  case 
"textedit":  $item_num 3; break;
  case 
"stats":     $item_num 4; break;
  case 
"history":   $item_num 5; break;
  case 
"logout":    $item_num 6; break;
  default:          
$item_num = -1;
}

if (
$item_num 0)
{
   require_once 
"$item_txt.php";
}
else
{
   echo 
"Вы ввели неверный адрес!";
}
?>

  Ответить  
 
 автор: neadekvat   (29.03.2010 в 20:36)   письмо автору
 
   для: bishake   (29.03.2010 в 20:16)
 

1. Зачем чистить строку, приходящую в $_GET["item"], если у вас есть список возможных вариантов. Просто перебираете их и все.

2. Зачем разные цифры, если они более нигде не участвуют? Я бы использовал булевые значения, плюс избегаем нотайсов:

<?php
$include 
false;

if (isset(
$_GET["item"])) {
 switch(
$_GET["item"])
 { 
   case 
"inbox":     $include true; break; 
   case 
"langs":     $include true; break; 
   
// ...
   
default:          $include false; break;
 }
}

if (
$include) {
 include(
$_GET["item"] . '.php');
} else {
 echo 
'Адрес неизвестен';
}

  Ответить  
 
 автор: bishake   (29.03.2010 в 21:01)   письмо автору
 
   для: neadekvat   (29.03.2010 в 20:36)
 

>1. Зачем чистить строку, приходящую в $_GET["item"], если у вас есть список возможных вариантов. Просто перебираете их и все.

Честно говоря, не знаю :) Я думал, что так будет безопаснее. Ведь в GET можно пихнуть и какой-нибудь нехороший скрипт 0_o


>2. Зачем разные цифры, если они более нигде не участвуют? Я бы использовал булевые значения, плюс избегаем нотайсов:

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

  Ответить  
 
 автор: neadekvat   (29.03.2010 в 21:08)   письмо автору
 
   для: bishake   (29.03.2010 в 21:01)
 

> Ведь в GET можно пихнуть и какой-нибудь нехороший скрипт 0_o
Туда многое можно пихнуть, но в данном случаи это неважно, почему - я уже сказал, у вас есть список возможных вариантов и все, что не то - пойдет лесом.

> индексы у меня используются для подсветки выбранного элемента в меню
Это не индексы =) Но понятно.

> А что такое нотайсы?
Самые безобидные ошибки - предупреждения.
В пустом файле PHP напишите эти строки:
<?php
error_reporting
(E_ALL); // выставляем уровень ошибок
echo $name// обращаемся к необъявленной переменной

Возникнет notice.
И впредь всегда разрабатывайте свои скрипты с этим уровнем ошибок, чтобы ни одного нотайса не выскакивало. А в рабочем скрипте уровень выставляйте в 0, пользователи не должны увидеть никаких ошибок.

  Ответить  
 
 автор: bishake   (29.03.2010 в 21:18)   письмо автору
 
   для: neadekvat   (29.03.2010 в 21:08)
 

Понятно, спасибо!
Вы написали "плюс избегаем нотайсов". Я так понял, что мы просто начали проверять GET-параметр?
if (isset($_GET["item"])) { 


А я вот так сделал:
$item_txt = $_GET["item"];
if (empty($item_txt)) $item_txt = "inbox";

Можно так? :)

  Ответить  
 
 автор: neadekvat   (29.03.2010 в 21:24)   письмо автору
 
   для: bishake   (29.03.2010 в 21:18)
 

А вы попробуйте, вылезает ли нотайс, если не передать вообще значение item

  Ответить  
 
 автор: bishake   (29.03.2010 в 21:26)   письмо автору
 
   для: neadekvat   (29.03.2010 в 21:24)
 

Не вылезает, по-всякому пробовал!
Спасибо!!!

  Ответить  
 
 автор: neadekvat   (29.03.2010 в 21:32)   письмо автору
 
   для: bishake   (29.03.2010 в 21:26)
 

Не могет быть того, должен вылезти =)
Notice: Undefined index: item in адрес_скрипта on line строка


Ну и сразу, чтобы не вылезал, надо так:
<?php
if (isset($_GET['item'])) {
 
$item $_GET['item'];
} else {
 echo 
'Адрес страницы не передан';
}

То есть isset проверяет существование переменной (или индекса в массиве, как в этом случаи), а empty проверяет существование значения переменной.

И поэтому при isset нотайс не вылезает, а при empty - да, ведь нелогично проверять значение у переменной, которой не существует =) (но этот абзац не относится к данному случаю, это так, в целом)

  Ответить  
 
 автор: bishake   (29.03.2010 в 22:27)   письмо автору
 
   для: neadekvat   (29.03.2010 в 21:32)
 

Ок, исправлю, хотя нотайса всё равно нету. Спасибо!!

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

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