Nickolay.info. PHP. Передаем параметры формы PHP-скрипту |
Значительная часть любой программы на PHP - обработка данных, переданных пользователем через ту или иную HTML-форму. Для PHP версий младше 4.1.0 параметры обрабатывались, как правило, через массивы, которые назывались $HTTP_POST_VARS и $HTTP_GET_VARS для методов передачи данных POST (отдельно от адреса URL) и GET (в URL-адресе) соответственно . Эти массивы нужно было явно объявлять как глобальные кодом
global $HTTP_POST_VARS;
и затем извлекать оттуда данные конструкциями вроде
if (isset($HTTP_POST_VARS['n'])) $n = trim($HTTP_POST_VARS['n']);
Это порождало кучу проблем с безопасностью , в частности, нужно было разрешать в системе глобальные переменные. С версии 4.1.0 стали доступны "суперглобальные" массивы $_POST и $_GET, которые не нужно объявлять и обращаться с которыми значительно проще. Однако, для многих (и часто для меня самого по инерции) их использование свелось к тому, что они лишь перестали писать слово global. В остальном код остается таким же унылым:
$start=''; if (isset($_GET['s'])) $start = trim($_GET['s']); if (empty($start)) $start = 0;
Меж тем, корректная обработка всех разрешенных переменных, переданных скрипту по GET или POST, займёт на PHP всего строк 5 кода. Давайте эти 5 строк сейчас и напишем. Итак, некий скрипт хочет получить данные формы. Для простоты и удобства будем считать, что имена переменных в скрипте совпадают с HTML-атрибутами name нашей формы. Все допустимые параметры перечислим в начале скрипта в виде массива $params, а второй строкой подключим одноименный файл params.php, который создаст соответствующие переменные. Поместить этот код следует на глобальном уровне скрипта, то есть, вне какой-либо функции:
$params = array('id','mode'); require_once ("params.php");
В файле params.php содержится код, нужный для получения перечисленных в массиве переменных, полученных по GET или POST. Если переменную ни одним из методов получить не удалось, скрипт еще и заботливо инициализирует её пустой строкой:
<? while (list($num,$var) = each($params)) { if (!empty($_POST[$var])) $$var = trim(htmlspecialchars(magic($_POST[$var]))); else if (!empty($_GET[$var])) $$var = trim(htmlspecialchars(magic($_GET[$var]))); else $$var = ''; } ?>
"Волшебным ключиком" здесь является поддержка в PHP типа данных "переменная переменных", позволяющего использовать значение одной переменной в качестве имени другой ($$var).
P.S. Начиная с PHP 7.2 объявлена устаревшей функция each.
Для работы в последних версиях PHP замените в params.php строку
while (list($num,$var) = each($params)) {наforeach ($params as $num=>$var) {
Кроме того, в 99% случаях нам требуется от формы следующее: нельзя пропускать от юзера любой HTML (если нужна разметка - есть BBCode и другие безопасные решения); желательно подчистить за юзером лишние пробелы, хотя бы в начале и конце ввода; обязательно нужно разобраться с кавычками, которые для PHP - служебные символы. Все эти задачи и решает вызов trim(htmlspecialchars(magic(...))) Первые 2 функции в PHP уже есть, а функцию magic, устраняющую проблему с "умными кавычками" независимо от настроек PHP-интерпретатора, мы сейчас напишем:
function magic($path){ if( ini_get('magic_quotes_sybase')=='1'){ $path=str_replace('""','"',$path); $path=str_replace("''","'",$path); } else { if(@get_magic_quotes_gpc()=='1'){ $path=str_replace('\\"','"',$path); $path=str_replace("\\'","'",$path); $path=str_replace("\\\\","\\",$path); } } return $path; }
Естественно, мы поместим ее тело в модуль функций, подключаемый к каждому скрипту проекта, скажем, с именем functions.php:
<? session_start (); require_once ("functions.php"); ...
Во избежание SQL-инъекций и прочих гадостей следовало бы функцией magic
возвращать не просто $path
, а
mysql_real_escape_string ($path)
. Последняя функция - стандартная начиная с PHP 4.3.1, она позволяет "экранировать", то есть, заменить
на спец.символы кавычки, которые могли быть переданы нашему запросу хакером, скажем, с целью изменения того, что извлекает запрос.
После обработки функцией mysql_real_escape_string
, символ '
например,
превратится в \'
, что, скорее всего, помешает хакеру отправить синтаксически верный запрос.
"Лишние" обратные слеши в базу при этом не пишутся.
Числа, полученные через GET или POST, "закавычивать" необязательно, но очень желательно извлекать их явно, с отбрасыванием всего, что не является числом:
$id=intval($id);
Однако, функция mysql_real_escape_string
обработает и переводы строк, так что если пропускать через неё абсолютно все внешние данные, то при повторном открытии какого-либо добавленного через форму текста мы можем увидеть вместо
строка 1 строка 2
вот такое:
строка 1\r\nстрока 2
Как поступать? Промучиться с настройками кавычек можно очень долго, я бы совсем отключал их, создав на хостинге файл .htaccess
со следующим содержимым:
php_flag magic_quotes_gpc 0 php_flag magic_quotes_runtime 0
Тогда в magic
останется только вызов mysql_real_escape_string
. Ещё можно добавить строку
set_magic_quotes_runtime(0);
в начале скрипта, чтобы "волшебными кавычками" не портились данные, получаемые во время работы.
В общем, считаем, что данные формы получены в удобном виде, дальше делайте с ними что угодно.
гостевая; E-mail |