У меня есть тот же вопрос, но … Я перенаправляю пользователя в зависимости от оператора if с использованием заголовков на динамическую страницу, которая создается через функцию. Чтобы эта функция работала правильно, ей нужны параметры, переданные в части GET заголовков.
В соответствии с тем, что дает ответы, это плохая практика. Каким образом я должен это делать?
function page($title,$msg){ $title = $_GET['title']; $msg = $_GET['msg']; echo '<h1>'.$title.'</h1>'; echo '<p>'; switch($msg){ case 1: echo 'dwasdwadawdwadwa'; break; case 2: echo 'wasdadwadwdad'; break; default: echo 'wadasdasd'; break; } echo '</p>'; }
ps: не стесняйтесь указывать на что-либо еще, что вы видите не так.
Я нашел это, но мне это действительно не помогает.
Ответ на связанный с вами вопрос предполагает, что функции не должны полагаться на внешние (например, глобальные) переменные. $_GET
и $_POST
(среди прочих) являются «суперглабильными», языковой функцией PHP, которая делает их доступными в любой области. Это означает, что они могут быть неожиданно изменены из любого места в ваших сценариях.
Один из способов избежать этого – избегать использования супер-глобалов в методах, а вместо этого, как следует из ответа на другой вопрос, – это вместо этого требовать параметры для переменных, которые вы могли бы получить из супер-глобальных.
Например, вместо:
function add_user() { $user = $_GET['user']; // ... } add_user();
Вы будете использовать:
function add_user($user) { // ... } add_user($_GET['user']);
В вашей ситуации вы хотите:
function page($title, $msg){ echo '<h1>'.$title.'</h1>'; echo '<p>'; switch($msg){ case 1: echo 'dwasdwadawdwadwa'; break; case 2: echo 'wasdadwadwdad'; break; default: echo 'wadasdasd'; break; } echo '</p>'; }
Затем, когда вы вызываете page
вы называете ее:
page($_GET['title'], $_GET['msg']);
Хотя вы не обязательно используете вход $ _GET для чего-то, что требует соображений безопасности (в данном случае), плохой практикой является не очистка значений от URL-адреса.
Необходимо не только проверять наличие вредоносного ввода (особенно если вы используете вход для запроса базы данных), но вы должны проверить, что ожидаемые целочисленные значения действительно являются целыми числами, а требуемые строки не пусты.
Кроме того, ваша функция page($title, $msg)
принимает $title
и $msg
и устанавливает их, даже если они не передаются по ссылке .
Если вы хотите изменить входные параметры, передайте их по ссылке.
Если вам нужно использовать входные параметры, не перезаписывайте их немедленно.
Если вам не нужны параметры ввода и используйте только значения из $_GET
локально для вашей функции, объявите page()
без каких-либо аргументов.
Зачем вам нужно использовать GET ? вы можете получить доступ ко всем тем же свойствам, если используете POST, который также более безопасен
Не уверен, что я понимаю ваш вопрос, но вот какой-то код, который я использую для обработки своих вызовов ajax с помощью:
$mc = new MyClass(); echo $mc->{$_GET["operation"]}($_GET);
Это означает, что «операция» относится к имени вашего метода внутри MyClass, и мне не нужно добавлять новый оператор switch для каждого метода. Теперь я могу просто добавить функцию «addRecord ($ args)» в MyClass, и мой вызов ajax будет выглядеть так:
ajax_users.php?operation=addRecord&name=testuser&dob=1980-01-01
ваша функция php получает аргументы в массиве, поэтому внутри функции addRecord()
вы должны обращаться к переменным типа $args['name']
и $args['dob']
, и он не имеет значения, сколько параметров вы должны пройти на ваш метод.
Убедитесь, что вы используете подготовленные инструкции здесь или надлежащее экранирование, чтобы предотвратить инъекции sql.