- PHP safe $_GET or not
- Безопасный get запрос php
- Форма ввода данных
- Безопасность в PHP (Обработка даных полученных от пользователей)
- SQL-инъекции
- XSS
- PHP-инъекция
- Заключение
- Защита GET параметров
- 3 ответа 3
- PHP $_GET security, $_POST security best practice
- 4 Answers 4
- It is not the source but destination that matters
PHP safe $_GET or not
The switch thing is okay, because you are comparing against a hard-coded value (however, it’s case «show»: btw).
As @Bruce mentions in the comments, you should add a default: case as well to catch values that are not on the list, or empty values:
The second thing is potentially dangerous, as it would be possible to inject HTML and more importantly, JavaScript into the document body. You should apply a htmlspecialchars() on the variable before echoing it.
I tend to go further and validate $_GET[‘action’] against a list of expected actions, failing out if it’s not one of them
The switch will throw an error (if enabled) if ‘action’ does not exist. Checking the input against a fixed set is good, but you should also check that the parameter is passed at all in addition to adding a default case.
$_GET[‘action’] will also fail if ‘action’ does not exist. This may display errors (or stop execution), depending how PHP is configured.
The $_GET superglobal is not safe by default as it may contain special or encoded characters and other undesirable text sequences.
You can use the built in PHP function filter_input to sanitize the string according to several standard filters (see the list of filters for an idea of what is possible).
if (!($action = filter_input(INPUT_GET, 'action', FILTER_SANITIZE_STRING)))
Relies on built-in sanitize filtering, which ensures:
- security fixes are available as PHP is patched
- consistent/standard filtering
- solid filter implementation (in terms of performance and security)
- also provides a clear default case
- syntax is a bit of a bear to remember
- cannot use filter_input if you modify the superglobal $_GET (which you probably shouldn’t do anyway).
You could also check that the field was one of a set using in_array , which is a more dynamic method of checking if you have one of a set.
$search = in_array($search, array('show', 'hide')) ? $search : 'some-default';
The dynamic approach allows you to either execute or look up the target action safely, while storing the set of potential choices in a data structure versus static code.
Yes, as mentioned, you must validate the value of any $_GET variable before using it blindly. But.
You should also be checking that it even exists before using it. Depending on how you have error_reporting() set on your server, if you try to use $_GET[‘action’] and ?action=something has not been specified in the URL then you’ll get an E_NOTICE — Undefined index : action, which will either pollute your error logs or worse, appear in the browser.
$urlAction = isset($_GET['action']) ? $_GET['action'] : null; if (isset($urlAction)) < // Rest of validation. >
Безопасный get запрос php
Большое значение в PHP имеет организация безопасности данных. Рассмотрим несколько простых механизмов, которые могут повысить безопасность нашего веб-сайта.
Но вначале возьмем форму из прошлой темы:
if(isset($_POST["age"])) < $age = $_POST["age"]; >echo "Имя: $name
Возраст: $age"; ?>Форма ввода данных
Имя:
Возраст:
И попробуем ввести в нее некоторые данные. Например, введем в поле для имени ««:
После отправки данных в html разметку будет внедрен код javascript, который выводит окно с сообщением.
Это относительно простой и безвредный скрипт. Однако внедряемый код может быть более вредоносным. И чтобы избежать подобных проблем с безопасностью, рекомендуется применять функцию htmlentities() . В качестве параметра она принимает значение, которое надо экранировать:
$name = "не определено"; $age = "не определен"; if(isset($_POST["name"])) < $name = htmlentities($_POST["name"]); >if(isset($_POST["age"])) < $age = htmlentities($_POST["age"]); >echo "Имя: $name
Возраст: $age";
И даже после ввода кода html или javascript все теги будут экранированы, и мы получим следующий вывод:
Еще одна специальная функция — htmlspecialchars() похожа по действию на htmlentities :
$name = "не определено"; $age = "не определен"; if(isset($_POST["name"])) < $name = htmlspecialchars($_POST["name"]); >if(isset($_POST["age"])) < $age = htmlspecialchars($_POST["age"]); >echo "Имя: $name
Возраст: $age";
Еще одна функция — функция strip_tags() позволяет полностью исключить теги html:
$name = "не определено"; $age = "не определен"; if(isset($_POST["name"])) < strip_tags($_POST["name"]); >if(isset($_POST["age"])) < strip_tags($_POST["age"]); >echo "Имя: $name
Возраст: $age";
Результатом ее работы при том же вводе будет следующий вывод:
Безопасность в PHP (Обработка даных полученных от пользователей)
Всегда проверяйте полученные данные от пользователя ($_POST, $_GET, $_REQUEST, $_COOKIE, $_FILES) , причем не только от разных инъекций, XSS и прочего, но и на корректность вводимых данных, например, если у вас интернет магазин, то проверяйте, чтобы количество товаров было не отрицательным и целым.
Представьте себя на месте хакера, подумайте чтобы вы сделали с сайтом.
SQL-инъекции
- mysql_escape_string() — для защиты строк и двоичных данных
- mysql_real_escape_string() — для защиты строк и двоичных данных в соответствии с кодировкой, установленной на сервере (требуется соединение с сервером, иначе возвращает пустой результат)
- intval() — для защиты целочисленных цифровых значений, intval() возвращает 0 в случае если строка не число.
- floatval() — для защиты дробных значений, аналогичное поведение как и у intval()
XSS
PHP-инъекция
PHP-инъекция (англ. PHP injection) — один из способов взлома веб-сайтов, работающих на PHP, заключающийся в выполнении постороннего кода на серверной стороне. Читать дальше на wikipedia
Это способ взлома, когда можно исполнить любой php-код на стороне сервера, Очень наспространен благодаря функции include(), в которую новички передают перерменную, полученную от пользователя. Ошибочно думают, что код include($_GET[‘file’].».php»); спасает от такой инекции. НО ЭТО ОШИБКА. Потому что злоумышленник может передать в переменную file «ya.ru/%00»(без ковычек) что отбросит расширение .php
- addslashes() — она экранирует NULL-символ(в html он обозначется как %00), слеш и ковычки, что позволяет избавиться от нежелательных инъекций, но лучше пользоваться оператором switch, например:
Заключение
Здесь я описал общие принципы, которыми пользуюсь я. Буду рад, если вы поможите дополнить эту статью.
Защита GET параметров
Привет.Помогите новичку. Подскажите как правильно проверять и защищать GET-параметры? Припустим они отправляются по нажатию на ссылку:
защитаphp