|
|
|
| Добрый вечер!
Я только начал писать на 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 "Вы ввели неверный адрес!";
}
?>
|
| |
|
|
|
|
|
|
|
для: 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 'Адрес неизвестен';
}
|
| |
|
|
|
|
|
|
|
для: neadekvat
(29.03.2010 в 20:36)
| | >1. Зачем чистить строку, приходящую в $_GET["item"], если у вас есть список возможных вариантов. Просто перебираете их и все.
Честно говоря, не знаю :) Я думал, что так будет безопаснее. Ведь в GET можно пихнуть и какой-нибудь нехороший скрипт 0_o
>2. Зачем разные цифры, если они более нигде не участвуют? Я бы использовал булевые значения, плюс избегаем нотайсов:
Пардон, я не уточнил, что индексы у меня используются для подсветки выбранного элемента в меню, поэтому они-таки нужны. А что такое нотайсы? | |
|
|
|
|
|
|
|
для: bishake
(29.03.2010 в 21:01)
| | > Ведь в GET можно пихнуть и какой-нибудь нехороший скрипт 0_o
Туда многое можно пихнуть, но в данном случаи это неважно, почему - я уже сказал, у вас есть список возможных вариантов и все, что не то - пойдет лесом.
> индексы у меня используются для подсветки выбранного элемента в меню
Это не индексы =) Но понятно.
> А что такое нотайсы?
Самые безобидные ошибки - предупреждения.
В пустом файле PHP напишите эти строки:
<?php
error_reporting(E_ALL); // выставляем уровень ошибок
echo $name; // обращаемся к необъявленной переменной
|
Возникнет notice.
И впредь всегда разрабатывайте свои скрипты с этим уровнем ошибок, чтобы ни одного нотайса не выскакивало. А в рабочем скрипте уровень выставляйте в 0, пользователи не должны увидеть никаких ошибок. | |
|
|
|
|
|
|
|
для: neadekvat
(29.03.2010 в 21:08)
| | Понятно, спасибо!
Вы написали "плюс избегаем нотайсов". Я так понял, что мы просто начали проверять GET-параметр?
if (isset($_GET["item"])) {
|
А я вот так сделал:
$item_txt = $_GET["item"];
if (empty($item_txt)) $item_txt = "inbox";
|
Можно так? :) | |
|
|
|
|
|
|
|
для: bishake
(29.03.2010 в 21:18)
| | А вы попробуйте, вылезает ли нотайс, если не передать вообще значение item | |
|
|
|
|
|
|
|
для: neadekvat
(29.03.2010 в 21:24)
| | Не вылезает, по-всякому пробовал!
Спасибо!!! | |
|
|
|
|
|
|
|
для: 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 - да, ведь нелогично проверять значение у переменной, которой не существует =) (но этот абзац не относится к данному случаю, это так, в целом) | |
|
|
|
|
|
|
|
для: neadekvat
(29.03.2010 в 21:32)
| | Ок, исправлю, хотя нотайса всё равно нету. Спасибо!! | |
|
|
|