Помогите разобраться с тем как обращаться к $_GET
Вобщем есть простой код...
if(isset($_GET['link']){}
Когда я обращаюсь к $_GET мой NetBeans пишет мне, что я не должен обращаться к суперглобальному массиву напрямую. Покурил форумы, повтыкал на примеры, но все примеры написанные в интернете так и используют. Вопрос в том - как делать то?
И попутно хочу спросить. Если я проверяю с помощью isset есть ли такой-то GET, то безопасно ли это? Я имею ввиду, чтобы нельзя было засунуть в $GET['link'] что-то плохое, что может прервать выполнение моего кода.
Ответы (2 шт):
GET POST одно и тоже но GET отображается в адресе сайта, у меня была форма, <input type='text' name="login">
Я с нее проверял через пост,
if ($_POST['login']){ Действие }
Суперглобальные массивы таят в себе опасность. Возможность обратится к ним из любого места приводит к злоупотреблению и ситуациям типа:
<?php // foo.php
$x = $_GET['x']?? '';
// ...
function foo() {
$x = $_GET['x']?? '';
// ...
}
// ...
include 'bar.php';
<?php // bar.php
$x = $_GET['x']?? '';
// ...
Теперь, если надо поменять название параметра x на y, то придётся искать по всему коду $_GET['x'] и переименовывать. Представьте, что будет если где-то вы всё-таки забудете поменять этот x на y.
Вероятно использование функции filter_input успокоит нетбинс. Но обратите внимание, что этой функцией можно злоупотребить так же как суперглобальными массивами.
Ответственный разработчик строго определяет место, в котором он обращается к суперглобальным массивам. Часто это происходит только в одном месте -- при вызове конструктора объекта HttpRequest (например в симфони). Но если у вас просто набор скриптов, то соглашения использовать обращения к суперглобальным массивам только в точках входа, в начале файла может быть достаточно.
Конструкция if (isset($_GET['foo'])) {/* сделать что-то кроме присвоения значения переменной */} плохая по той причине, что может возникнуть необходимость повторять её снова. Допустим надо вывести сообщение:
<?php
echo 'Вам письмо';
if (isset($_GET['from'])) {
echo ' от ' . htmlspecialchars($_GET['from']);
}
echo "\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua\n\n";
if (isset($_GET['from'])) {
echo 'С наилучшими пожеланиями. Ваш ' . htmlspecialchars($_GET['from']) . "\n\n";
}
Получается мы обращаемся к $_GET четыре раза в разных местах! Так не годится. Правильнее будет получить значение один раз в начале скрипта и больше не трогать $_GET['from']:
<?php
$from = $_GET['from']?? '';
echo 'Вам письмо';
if ($from) {
echo ' от ' . htmlspecialchars($from);
}
echo "\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua\n\n";
if ($from) {
echo 'С наилучшими пожеланиями. Ваш ' . htmlspecialchars($from) . "\n\n";
}
Так гораздо лучше:
- Вы можете легко изменить название параметра
fromпри необходимости; - Если вы допустили ошибку при присвоении
$from(например написали в слове 'frоm' русскую о), то обнаружить её гораздо проще; - Если вы захотите найти все использования $from, то ваша IDE вам сможет помочь.
Нетбинс всё ещё может ругаться на прямое обращение к $_GET. Если вас это беспокоит, замените его на filter_input.
Про безопасность. Само по себе присвоение $foo = $_GET['foo']?? ''; безопасно. Но помните, что в $foo могут быть любые данные. Нельзя вставлять их в HTML, SQL, regex, sh и любой другой специальный формат без соответствующей обработки.