Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Функция эранирования "опасных" данных


Автор: BASILIO 20.8.2008, 03:57
Функция:
Код

function safe_string($str)
    {
    if (get_magic_quotes_gpc())
        {
        $str = stripslashes($str);
        }
    return htmlentities(strip_tags($str),ENT_QUOTES, 'UTF-8');
    }


Задуманный смысл:
1. иничножение всех хтмл тэгов
2. обезопасивание БД от пакостей

Ход мыслей:
1. htmlentities не захотел работать если кавычки за слэшем стоят, посему если надо убираем автоматические слэши
2. удоляем тэги хтмл`а
3. в остатки находим ковычки и заменяем их


Проблема:
Вроде бы всё правельно задаю, но одиночная ковычка всё равно проскакивает :(

Автор: krundetz 20.8.2008, 08:40
Советую разделить функционал и избавляться от тегов уже непосредственно перед выводом в браузер.

Чтобы обезопасить базу данных в PHP есть встроеные функции экранирующие спецсимволы.

А маджик квотес лучше вообще отключить

Автор: Feldmarschall 20.8.2008, 09:43
1. слово кавычка пишется через "а"
2. кавычками "опасные для бд символы" не исчерпываются. 
3. для того, чтобы обезопасить данные для БД, есть специальная функция mysql_real_escape_string. применять недо её, а не шаманство с HTML сущностями.
4. Работа с текстом и работа с БД - это РАЗНЫЕ вещи. В базу может заносить данные и администратор сайта. Он может иметь право добавлять и html. ПОЭТОМУ никакой функции safe_string быть не может.
А может быть две функции
- функция обработки данных для запроса
- функция обработки небезопасных данных для вывода на экран.

Автор: BASILIO 20.8.2008, 13:43
Цитата(krundetz @  20.8.2008,  08:40 Найти цитируемый пост)
избавляться от тегов уже непосредственно перед выводом в браузер.

Не имеет смысла держать в Базе данные, которые всё равно никто не увидет
Цитата(krundetz @  20.8.2008,  08:40 Найти цитируемый пост)
Чтобы обезопасить базу данных в PHP есть встроеные функции экранирующие спецсимволы.

Знаю, делают если не ошибаюсь с помощью "\", но потом их надо вырезать после получения данных обратно, чего хочется избежать, ибо в базу записываем один раз а выдаём большое количество раз

Автор: skyboy 20.8.2008, 14:47
Цитата(BASILIO @  20.8.2008,  12:43 Найти цитируемый пост)
Знаю, делают если не ошибаюсь с помощью "\"

ошибаешься. ещё и посты предыдущие не читаешь. делается это(если мы говорим про mysql) при помощи функции mysql_real_escape_string. после выборки из базы ничего "вырезать" не надо. 
Цитата(BASILIO @  20.8.2008,  12:43 Найти цитируемый пост)
Не имеет смысла держать в Базе данные, которые всё равно никто не увидет

ога. конечно. написал человек "1< 2", а ты так о-па и выбросил "<" во время работы  strip_tags. разумно-разумно... а если использовать htmlspecialchars - так вообще - все, что ввел пользователь и отображаться будет. 

Автор: krundetz 20.8.2008, 15:23
BASILIO, смысл как раз в том чтобы выести на экран все что ввел пользователь но не в виде HTML тегов а в виде обычного текста где теги будут заменены на соответсвующие им коды символов. Ч то вы будете делать если пользователь желает с кемто поделиться своим HTML кодом а вы у него взяли да и вырезали все теги?

Автор: Feldmarschall 20.8.2008, 15:34
krundetz, в этом случае человек поделится не кодом, а его представлением =)
вообще, проблема "резать или заменять", на мой взгляд, не нуждается в столь острых дискуссиях. вполне можно оставить решение на выбор разработчика.
куда более важной мне предтавляется проблема осмысленности копипастных действий, который совершает этот юный талант. Но здесь другая проблема - решение пока не найдено...

Автор: lukas 20.8.2008, 19:36
Советую автору топика прочитать пару статей почему нужно использовать mysql_real_escape_string, и как без вообще происходят SQL иньекции... а не тупо копировать способы обезопасить скрипт... 

Автор: Anarki 20.8.2008, 22:17
http://phpfaq.ru/slashes

Автор: BASILIO 21.8.2008, 04:23
Цитата(skyboy @  20.8.2008,  14:47 Найти цитируемый пост)
ошибаешься. ещё и посты предыдущие не читаешь. делается это(если мы говорим про mysql) при помощи функции mysql_real_escape_string. после выборки из базы ничего "вырезать" не надо. 

Цитата(http://de2.php.net/manual/ru/function.mysql-real-escape-string.php)

mysql_real_escape_string() вызывает библиотечную функцмю MySQL mysql_real_escape_string, которая добавляет обратную косую черту к следующим символам: \x00, \n, \r, \, ', " and \x1a.

Обратная черта, сама изчезает?
Да, игнорирую хамские посты.

Цитата(skyboy @  20.8.2008,  14:47 Найти цитируемый пост)
ога. конечно. написал человек "1< 2", а ты так о-па и выбросил "<" во время работы  strip_tags. разумно-разумно...

Цитата(http://de2.php.net/manual/ru/function.strip-tags.php)

Эта функция возвращает строку str , из которой удалены HTML и PHP тэги.

Функция немного умней, и удоляет ТОЛьКО тэги, не трогая не чего другово

Цитата(skyboy @  20.8.2008,  14:47 Найти цитируемый пост)
а если использовать htmlspecialchars - так вообще - все, что ввел пользователь и отображаться будет.  

Мне не надо этого, на сайте ясно сказано, тэги не юзать, кто вписывает, тот сам виноват.


Цитата(krundetz @  20.8.2008,  15:23 Найти цитируемый пост)
BASILIO, смысл как раз в том чтобы выести на экран все что ввел пользователь но не в виде HTML тегов а в виде обычного текста где теги будут заменены на соответсвующие им коды символов. Ч то вы будете делать если пользователь желает с кемто поделиться своим HTML кодом а вы у него взяли да и вырезали все теги? 

Ресурс у меня немного другово плана, там не кто не должен делится ХТМЛ кодами через него ;)


Цитата(lukas @  20.8.2008,  19:36 Найти цитируемый пост)
Советую автору топика прочитать пару статей почему нужно использовать mysql_real_escape_string

Цитата(http://de2.php.net/manual/ru/function.mysql-real-escape-string.php)

mysql_real_escape_string() вызывает библиотечную функцмю MySQL mysql_real_escape_string, которая добавляет обратную косую черту к следующим символам: \x00, \n, \r, \, ', " and \x1a.

Мне не нужны некакие добовления лишние, мне надо чтоб всё лишние превратилось в код, который не опасен для БД, но виден браузеру как нормальные символы

Цитата(lukas @  20.8.2008,  19:36 Найти цитируемый пост)
а не тупо копировать способы обезопасить скрипт...  

В гугле искали? Удевлюсь если что-то нашли, ибо скрипт мой.

Автор: BASILIO 21.8.2008, 04:59
Цитата(Anarki @  20.8.2008,  22:17 Найти цитируемый пост)
Ну и вдогонку 

Спасибо, полезная статья

Автор: BASILIO 21.8.2008, 05:16
Цитата(Anarki @ 20.8.2008,  22:17)
http://phpfaq.ru/slashes

Дочитал до конца статью.... мои выводы:
1. забирая вариаблу из $_REQEUST применять сходу:
Код

function safe_string($str)
    {
    if (get_magic_quotes_gpc())
        {
        $str = stripslashes($str);
        }
    return strip_tags($str);
    }

strip_tags
2. в запросах MYSQL добовлять "mysql-real-escape-string($str)".
3. Перед передачи данных в браузер делать "htmlentities($str)".

Автор: Feldmarschall 21.8.2008, 08:54
Я считаю, что топикстартер хамит отвечающим. 
Игнорируя полезную информацию, и выставляя напоказ воинствующее невежество.
Плюс клевета, что ему, якобы, пишут хамские посты.

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

Что вообще тут творится? 10 профи вокруг него бегают, уговаривают, а он кобенится - "это я делать не буду, то мне не нравится, а здесь я выковырял из носа гениальное умозаключение, и все ваши слова мне до нижней планки!"


Автор: Mal Hack 21.8.2008, 11:20
BASILIO, все директивы связанные с magic_quotes_gpc отключать надо на уровне php.ini и .htaccess.
Это первое. Второе. Для экранирования символов при вставке данных в БД надо использовать специфические функции для этой БД, в частности для mySQL - mysql_real_escape_string.
Удаляться из строки после такой операции ничего не будет, но строка будет экранирована и на 99% безопасна в использовании в запросе.

Цитата(BASILIO @  21.8.2008,  05:23 Найти цитируемый пост)
Мне не нужны некакие добовления лишние, мне надо чтоб всё лишние превратилось в код, который не опасен для БД, но виден браузеру как нормальные символы

Экранирование и организация безопасности в данном вопросе как раз НАДО организовывать так, как вы не хотите.
В основе технологии программирования, в качестве, не то, чтобы основных, но тем не менее важных правил - данные должны храниться СЫРЫМИ, так называемые (raw data). Оставляю скидку на то, что иногда это просто не нужно...

Автор: BASILIO 21.8.2008, 16:37
Цитата(Mal Hack @  21.8.2008,  11:20 Найти цитируемый пост)
все директивы связанные с magic_quotes_gpc отключать надо на уровне php.ini и .htaccess.

Пробывал, закончилось "500 Internal Error" =(
Цитата(Mal Hack @  21.8.2008,  11:20 Найти цитируемый пост)
Экранирование и организация безопасности в данном вопросе как раз НАДО организовывать так, как вы не хотите.

Прочитав линк Anarki решил здеать так:
Код

function safe_input($str)
    {
    if (get_magic_quotes_gpc())
        {
        $str = stripslashes($str);
        }
    return strip_tags($str);
    }

function safe_dbstring($str)
    {
    return mysql_real_escape_string($str);
    }

function safe_output($str)
    {
    return htmlentities($str,ENT_QUOTES, 'UTF-8');
    }


Применяю в таком порядке:
Код

$mailtext = safe_input($_REQUEST['mailtext']);
mqq("INSERT INTO internmail VALUES ('".safe_dbstring($mailtext)."')");
echo safe_output(nl2br($line[mailtext]));

Автор: HackMan 21.8.2008, 17:06
Цитата(BASILIO @  21.8.2008,  16:37 Найти цитируемый пост)
function safe_dbstring($str)
    {
    return mysql_real_escape_string($str);
    }

 smile извини, но, по-моему очень глупо так делать

Теперь про magic_qoutes. Наверное что-то не так прописываешь в .htaccess. Вообще magic_quotes - это зло. Но если хостер не даёт тебе отключать эти кавычки, то срочно меняй хостера в принципе есть такой хак:

Код

  // magic_quotes hack
  function stripslashes_recursive($var)
    {
      return (is_array($var) ? array_map('stripslashes_recursive', $var) : stripslashes($var));
    }

  if (get_magic_quotes_gpc())
    {
      $_GET = stripslashes_recursive($_GET);
      $_POST = stripslashes_recursive($_POST);
      $_COOKIE = stripslashes_recursive($_COOKIE);
    }

Автор: Mal Hack 21.8.2008, 18:45
Цитата(BASILIO @  21.8.2008,  17:37 Найти цитируемый пост)
Пробывал, закончилось "500 Internal Error" =(

От  сюда же не следует то, что этого сделать нельзя. Значит вы что-то делаете не так. А что - без кода сказать нельзя.

Цитата(BASILIO @  21.8.2008,  17:37 Найти цитируемый пост)
Прочитав линк Anarki решил здеать так:

Это в корне не правильный подхд с точки зрения технологии.

Цитата(HackMan @  21.8.2008,  18:06 Найти цитируемый пост)
 Но если хостер не даёт тебе отключать эти кавычки, то срочно меняй хостера в принципе есть такой хак:

А чего там не давать-то? Доступ к .htaccess есть всегда, директивы эти могут там конфигурироваться. А Хак - это лишь частичный обход проблемы, а не ее решение.

Автор: BASILIO 21.8.2008, 18:51
Цитата(HackMan @  21.8.2008,  17:06 Найти цитируемый пост)
извини, но, по-моему очень глупо так делать

Согласен, безспорно, мне просто лень писать текст, длинный, да ещё если ошибку допущу, посему скажемс так "слегка переименовал" ;)
Хотя с другой стороны, если прейдётся меня БД, то не надо будет весь проект переворошивать, хватить только тута подправить ;)

Цитата(HackMan @  21.8.2008,  17:06 Найти цитируемый пост)
Теперь про magic_qoutes. Наверное что-то не так прописываешь в .htaccess. Вообще magic_quotes - это зло. Но если хостер не даёт тебе отключать эти кавычки, то срочно меняй хостера в принципе есть такой хак:

Да нет, с нескольких страниц уже брал один и тот же текст, хостер не даёт 100%, я бы его сменил, но хостинг это не моя деректива, этим занимается другой человек, и платит за него тоже другой человек.

Хак этот чо-то очень не охота использовать, ибо мне не надо творить такое со всеми вариаблами, будет лишния нагрузка =)



Ну а в общем, подведём итог, такое использование правельное?

Автор: Sannis 21.8.2008, 20:31
Цитата(BASILIO @  21.8.2008,  18:51 Найти цитируемый пост)
Хотя с другой стороны, если прейдётся меня БД, то не надо будет весь проект переворошивать, хватить только тута подправить ;)

В таком случае обычно используют готовые фреймворки/библиотеки. Тем более, что если прийдётся менять БД с вашим кодом, то прийдётся всё равно править как созданные для очистки функции, так и названия функций, производящих запрос(mysql_query).
Цитата(BASILIO @  21.8.2008,  18:51 Найти цитируемый пост)
Хак этот чо-то очень не охота использовать, ибо мне не надо творить такое со всеми вариаблами, будет лишния нагрузка =)

Думаю у вас очень слабое представление о том, что создаёт нагрузку. Лучше забудьте эту мысль пока с ними не сталкнётесь.
Цитата(BASILIO @  21.8.2008,  18:51 Найти цитируемый пост)
Ну а в общем, подведём итог, такое использование правельное? 

Имхо Feldmarshall и Mal Hack всё сказали. Осталось только ещё раз перечитать их посты, запомнить и усвоить.

Автор: Feldmarschall 22.8.2008, 09:03
попросите, кто-нибудь, автора объяснить смысл функции safe_output
мне зело любопытно, что именно она делает safe

Автор: skyboy 22.8.2008, 13:41

M
skyboy
BASILIO, видео на youtube выкладывай. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)