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

fixxxer

К.О.
Партнер клуба
Только что заметил.
Вообще, htmlspecialchars надо использовать всегда, когда заведомо нет гарантии в "чистоте" текста от HTML/entities, а не только при выводе value. Если, конечно, нет желания разрешать HTML.
 

fisher

накатила суть
имхо этот фак уже очень устарел. за addslashes при работе с mysql девелоперам надо отрывать руки, и держать такое в факе сейчас - уже имхо просто позор. так и написать: ламо, читайте вниматительно апи к своей субд на предмет функций экранирования. если нет - искать есть ли биндинг. а вот если уж в апи совсем ничего нет - ну вот тады ой, так и быть.
 

BOJIK

Новичок
Конкретные правила экранирования могут отличаться для других СУБД, но общий принцип остается прежним.
Думаю, полезно было бы изоложить и принципы для других СУБД. Тогда бы этот FAQ был полезен не только начинающим но и профессионалам, которых судьба заставляет писать под незнакомые или малознакомые СУБД.
 

fixxxer

К.О.
Партнер клуба
Ну это все таки FAQ, ориентированный прежде всего на MySQL (на предыдущей странице обсуждалось уже это все).

fisher, я бы сначала искал биндинг, а потом уже функции экранирования. :)
 

BOJIK

Новичок
да и еще
short_open_tag никто не отменял (там может быть и Off) посему наверно лучше в FAQ для всех примеров использовать <?php
хотя конечно это может быть и просто мой снобизм.
 

fisher

накатила суть
>>fisher, я бы сначала искал биндинг, а потом уже функции экранирования
полностью согласен :) на строгий порядок действий не претендовал.
 

Фанат

oncle terrible
Команда форума
Посталался учесть всю критику.
http://phpfaq.ru/slashes

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

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

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

-~{}~ 17.06.05 13:34:

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

Фанат

oncle terrible
Команда форума
всё-таки, писать большую рекурсивную?..

да старый вариант глобальные страпать пытался - это не дело.
 

SiMM

Новичок
Ну вроде не такая уж и большая
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']);
}
?
 

Фанат

oncle terrible
Команда форума
не, это не дело.
надо всё в функцию запихнуть. со статик переменной, наверное
напишу, когда руки дойдут
 

SiMM

Новичок
Ещё. Давно хотел прицепиться ;)
Следует специально отметить: добавленные слеши НЕ идут в базу. Они нужны только в запросе. При попадании в базу слеши отбрасываются.
Некоторые понимают выделенное буквально и считают, что в базу ВООБЩЕ не попадают слэши. Не знаю, как это описать коротко и доступно, но как аналогию можно было бы привести что-то типа
PHP:
print "что случается со слэшами (символ \"\\\") при занесении их в \'базу\'";
Пример неудачный - но хоть чего-то демонстрирует :) Или как-то прокомментировать, что это "синтаксическая" необходимость, поскольку иначе в базу было бы невозможно записать такие символы, как кавычки.

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

Фанат

oncle terrible
Команда форума
чё-то какой-то монстр получился.
неужели нельзя попроще?..

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, поставил твой код.
 

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: а вообще фишка с одноразовым выполнением - неплохая идея, ИМХО.
 

Profic

just Profic (PHP5 BetaTeam)
неужели нельзя попроще?..
Может так? Конечно не сильно проще, но имхо поцивильнее :)
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).
 
Сверху