Pers.narod.ru. 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). Кроме того, в 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);

в начале скрипта, чтобы "волшебными кавычками" не портились данные, получаемые во время работы.

В общем, считаем, что данные формы получены в удобном виде, дальше делайте с ними что угодно.

Рейтинг@Mail.ru

вверх гостевая; E-mail
Hosted by uCoz