прошу поглядеть интересующихся PHPFAQ slashes

Только что заметил.
Вообще, htmlspecialchars надо использовать всегда, когда заведомо нет гарантии в "чистоте" текста от HTML/entities, а не только при выводе value. Если, конечно, нет желания разрешать HTML.
 
имхо этот фак уже очень устарел. за addslashes при работе с mysql девелоперам надо отрывать руки, и держать такое в факе сейчас - уже имхо просто позор. так и написать: ламо, читайте вниматительно апи к своей субд на предмет функций экранирования. если нет - искать есть ли биндинг. а вот если уж в апи совсем ничего нет - ну вот тады ой, так и быть.
 
Конкретные правила экранирования могут отличаться для других СУБД, но общий принцип остается прежним.
Думаю, полезно было бы изоложить и принципы для других СУБД. Тогда бы этот FAQ был полезен не только начинающим но и профессионалам, которых судьба заставляет писать под незнакомые или малознакомые СУБД.
 
Ну это все таки FAQ, ориентированный прежде всего на MySQL (на предыдущей странице обсуждалось уже это все).

fisher, я бы сначала искал биндинг, а потом уже функции экранирования. :)
 
да и еще
short_open_tag никто не отменял (там может быть и Off) посему наверно лучше в FAQ для всех примеров использовать <?php
хотя конечно это может быть и просто мой снобизм.
 
>>fisher, я бы сначала искал биндинг, а потом уже функции экранирования
полностью согласен :) на строгий порядок действий не претендовал.
 
Посталался учесть всю критику.
http://phpfaq.ru/slashes

однако есть принципиальные моменты.
Рекомендация "читать вниматительно апи к своей субд на предмет, есть ли биндинг, а если нет - функций экранирования", правильная, но на фак не тянет.
В моём представлении ФАК - это
1) ответ на действительно часто задаваемый вопрос.
2) ответ конкретный, желательно, разжёваный, по мере сил, до состояния мелкой кашицы.
поэтому про mysql разжёвано, а общий принцип можно написать ниже.

BOJIK
Думаю, полезно было бы изоложить и принципы для других СУБД.
Буду рад вставить в фак эти принципы, если кто-нибудь напишет.
short_open_tag никто не отменял
принято, со временем постараюсь заменить.

fixxxer
, htmlspecialchars надо использовать всегда
Верно. Правда, если учесть, уже и само это применяние имеет весьма посредственное отношение к теме фака, то htmlspecialchars и подавно не к месту. Но напишу.

-~{}~ 17.06.05 13:34:

извиняюсь за назойливость, но у меня, всё-таки просьба к последним критиковавшим, посмотреть новую версию и сказать - всё ли там на их взгяд правильно?
 
всё-таки, писать большую рекурсивную?..

да старый вариант глобальные страпать пытался - это не дело.
 
Ну вроде не такая уж и большая
PHP:
function strips(&$el) { 
  if (is_array($el))
    foreach($el as $k=>$v)
      strips($el[$k]); 
  else $el = stripslashes($el); 
}

if (get_magic_quotes_gpc()) {
  strips($_GET);
  strips($_POST);
  strips($_FILES);
  strips($_COOKIE);
  strips($_REQUEST);
  if (isset($_SERVER['PHP_AUTH_USER'])) $_SERVER['PHP_AUTH_USER'] = stripslashes($_SERVER['PHP_AUTH_USER']);
  if (isset($_SERVER['PHP_AUTH_PW']))   $_SERVER['PHP_AUTH_PW']   = stripslashes($_SERVER['PHP_AUTH_PW']);
}
?
 
не, это не дело.
надо всё в функцию запихнуть. со статик переменной, наверное
напишу, когда руки дойдут
 
Ещё. Давно хотел прицепиться ;)
Следует специально отметить: добавленные слеши НЕ идут в базу. Они нужны только в запросе. При попадании в базу слеши отбрасываются.
Некоторые понимают выделенное буквально и считают, что в базу ВООБЩЕ не попадают слэши. Не знаю, как это описать коротко и доступно, но как аналогию можно было бы привести что-то типа
PHP:
print "что случается со слэшами (символ \"\\\") при занесении их в \'базу\'";
Пример неудачный - но хоть чего-то демонстрирует :) Или как-то прокомментировать, что это "синтаксическая" необходимость, поскольку иначе в базу было бы невозможно записать такие символы, как кавычки.

> надо всё в функцию запихнуть. со статик переменной, наверное
Кстати, да :) Выше хотел сказать, что жаль, что перед выходом из strip_superglobals нельзя сделать что-то вроде
PHP:
ini_set('magic_quotes_gpc',0);
;)
PS: Хы... оказывается одинарные кавычки слэшить было ненужно :)
 
чё-то какой-то монстр получился.
неужели нельзя попроще?..

PHP:
function strips(&$el) { 
  if (!get_magic_quotes_gpc()) return;
  static $flag;
  if (empty($flag)) {
    $flag=1;
    strips($_GET); 
    strips($_POST); 
    strips($_FILES); 
    strips($_COOKIE); 
    strips($_REQUEST); 
    if (isset($_SERVER['PHP_AUTH_USER'])) {
      $_SERVER['PHP_AUTH_USER'] = stripslashes($_SERVER['PHP_AUTH_USER']); 
      $_SERVER['PHP_AUTH_PW']   = stripslashes($_SERVER['PHP_AUTH_PW']); 
    }
  } else {
    if (is_array($el)) {
      foreach($el as $k=>$v) strips($el[$k]); 
    } else {
      $el = stripslashes($el); 
    }
  }
} 

strips($fake);

-~{}~ 10.07.05 09:10:

SiMM, поставил твой код.
 
Кстати, я тут подумал... может
PHP:
if (isset($_SERVER['PHP_AUTH_USER'])) strips($_SERVER['PHP_AUTH_USER']); 
if (isset($_SERVER['PHP_AUTH_PW']))   strips($_SERVER['PHP_AUTH_PW']);
выглядит более читабельно и менее громоздко.
PS: а вообще фишка с одноразовым выполнением - неплохая идея, ИМХО.
 
неужели нельзя попроще?..
Может так? Конечно не сильно проще, но имхо поцивильнее :)
PHP:
function strips_real(&$el) {
  if (is_array($el)) {
    foreach ($el as $k => $v) strips_real($el[$k]);
  } else {
    $el = stripslashes($el);
  }
}

function strips() {
  if (!get_magic_quotes_gpc()) return;
  static $stripped = false;
  if (!$stripped) {
    $stripped = true;
    strips_real($temp = array(&$_GET, &$_POST, &$_FILES, &$_COOKIE, &$_REQUEST));
    //if (isset($_SERVER['PHP_AUTH_USER'])) {
    //  $_SERVER['PHP_AUTH_USER'] = stripslashes($_SERVER['PHP_AUTH_USER']);
    //  $_SERVER['PHP_AUTH_PW']   = stripslashes($_SERVER['PHP_AUTH_PW']);
    //}
  }
}

strips();
Закомментированный кусок не нужен (по крайней мере для php5).
 
Сверху