Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Экранирование опасных символов, Запись в БД 
:(
    Опции темы
Flier
Дата 18.8.2007, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 26.6.2007

Репутация: нет
Всего: нет



Что лучше ипользовать для экранирования опасных символов, педающихся из формы (текстовые поля).?
escapeshellcmd - вырезает все, что  можно, потом можно введенный в форму текст и не узнать.
escapeshellarg - ставит кавычки ...

Есть ли что-нибудь хорошее и подходящее в ПХП или юзать str_replace()?
Кто, что для таких целей использует?
PM MAIL   Вверх
GiV
Дата 18.8.2007, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 13.7.2006
Где: rus|53

Репутация: 4
Всего: 9



http://ru2.php.net/mysql_escape_string

escapeshellcmd и escapeshellarg  используются при работе из PHP с shell

Однако экранирование это только вершина айсберга, если лезть глубже то на данные приходящие от пользователя можно накладывать больше ограничений.
PM MAIL WWW ICQ   Вверх
SelenIT
Дата 18.8.2007, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



Цитата(GiV @  18.8.2007,  14:04 Найти цитируемый пост)
экранирование это только вершина айсберга, если лезть глубже то на данные приходящие от пользователя можно накладывать больше ограничений

Если только для записи или поиска в БД, то никаких других ограничений не нужно. Очень хорошо тема раскрыта в PHP FAQ:  \"Кавычки \". Cоставление запросов mysql, слеши, экранирование кавычек.


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
NightmareZ
Дата 20.8.2007, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 10.8.2006

Репутация: 2
Всего: 13



Цитата(SelenIT @ 18.8.2007,  15:26)
Цитата(GiV @  18.8.2007,  14:04 Найти цитируемый пост)
экранирование это только вершина айсберга, если лезть глубже то на данные приходящие от пользователя можно накладывать больше ограничений

Если только для записи или поиска в БД, то никаких других ограничений не нужно. Очень хорошо тема раскрыта в PHP FAQ:  \"Кавычки \". Cоставление запросов mysql, слеши, экранирование кавычек.

На меня, наверное, сейчас будут нападать по поводу моего говнокода, но всё же.... Я тоже долбался с экранированием символов и прочими сопутствующими проблемами.... В конце концов написал себе пару функций.... Может, конечно, оно через одно место и медленно будет работать, но меня пока во всём устраивало.
Код

<?php
    /**
     * Project:    MakarovCMS
     * File:       securetext.php
     *
     * Функция для перевода введённого текста в безопасный вид,
     * пригодный для хранения в базе данных и вывода на страницу.
     *
     * @copyright  2007 (c) Makarov Michael
     * @license    GPL License
     * @version    MCMS-6-VIII-2007
     * @link       http://systemhalt.org
     * @author     Makarov Michael <[email protected]>
     */

    function secureTextTrunc($s, $len)
    {
     /**
      * Если длина строки меньше нуля, то возвращаем
      * строку неизменённой.
      */
     if ($len < 0) {
         return $s;
     }

        /**
         * Если строка пустая, то ничего делать не надо.
         * Если длина строки меньше заданной, то тоже ничего делать не надо.
         */
        if (strlen($s) == 0 || strlen($s) <= $len) {
            return $s;
        }

        $result = '';
        $tmp = '';
        $i = -1;

        while (strlen($result . $tmp) <= $len) {
            $i++;
            $result .= $tmp;

            if ($s[$i] != '&') {
                $tmp = $s[$i];
            } else {
                $i--;
                $tmp = '';

                while ($s[$i] != ';') {
                    $i++;
                    $tmp .= $s[$i];
                }

                $tmp .= ';';
            }
        }
        return $result;
    }

    function secureText($text, $length = -1)
    {
        /**
         * Массив символов для замены.
         */
        $arr = array(
            '!' => '!',
            '"' => '&quot;',
            '#' => '#',
            '$' => '$',
            '%' => '%',
            '&' => '&amp;',
            '\'' => ''',
            '(' => '(',
            ')' => ')',
            '*' => '*',
            '+' => '+',
            ',' => ',',
            '-' => '-',
            '.' => '.',
            '/' => '/',
            ':' => ':',
            ';' => ';',
            '<' => '&lt;',
            '=' => '=',
            '>' => '&gt;',
            '?' => '?',
            '@' => '@',
            '[' => '[',
            ']' => ']',
            '\\' => '\',
            '^' => '^',
            '_' => '_',
            '`' => '`',
            '{' => '{',
            '}' => '}',
            '|' => '|',
            '~' => '&~',
            chr(10) => '<br />'
        );

        /**
         * Заменяем переводы строк.
         */
        $text = preg_replace('/'.chr(13).chr(10).'/', chr(10), $text);

        /**
         * Тут будет храниться результат.
         */
        $result = '';

        /**
         * Длина введённой строки.
         */
        $len = strlen($text);

        /**
         * Проходимся по всем символам введённой строки.
         */
        for ($i = 0; $i < $len; $i++) {

            /**
             * Если символ - буква или пробел, то записываем его
             * в результат неизменённым....
             */
            if (eregi('^[a-zA-ZА-Яа-яёЁ ]*$', $text[$i])) {
                $result .= $text[$i];
            } else {

                /**
                 * ....иначе, проверяем, можно ли его заменить на безопасный
                 * вариант, и, если да, то заменяем и записываем в результат;
                 * иначе - символ просто пропадает.
                 */
                if (array_key_exists($text[$i], $arr)) {
                    $result .= $arr[$text[$i]];
                }

            }

        }

        /**
         * Если указана длина, то обрезаем строку.
         */
        if ($length != -1) {
         $result = secureTextTrunc($result, $length);
        }

        /**
         * Возвращаем полученную строку.
         */
        return $result;
    }
?>


Это сообщение отредактировал(а) NightmareZ - 20.8.2007, 12:57


--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
GiV
Дата 20.8.2007, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 13.7.2006
Где: rus|53

Репутация: 4
Всего: 9



Чуть больше года назад, гудело и гремело здесь: http://ru2.php.net/manual/ru/ref.filter.php

Вещь приятная и полезная, а главное на уровне ядра/модуля. Но для применения надо либо отдельную обертку писать, либо в коде хорошо подумав smile
PM MAIL WWW ICQ   Вверх
SelenIT
Дата 20.8.2007, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



Цитата(NightmareZ @  20.8.2007,  12:28 Найти цитируемый пост)
На меня, наверное, сейчас будут нападать по поводу моего говнокода

Не сразу. Сначало спрошу: NightmareZ, от чего этот код должен защищать? От SQL-инъекции? От XSS-атаки? От дурного глаза? От всего на свете?

Цитата(NightmareZ @  20.8.2007,  12:28 Найти цитируемый пост)
      * Если длина строки меньше нуля, то возвращаем
      * строку неизменённой.

Ну ещё бы! Такое чудо нужно во что бы то ни стало сохранить для потомков и бережно передать в музей! Имхо, это надо бы в юмор... ;)


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
console
Дата 21.8.2007, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 307
Регистрация: 12.2.2007
Где: Belarus::Minsk

Репутация: 2
Всего: 3



Код

function secureTextTrunc($s, $len)
    {
     /**
      * Если длина строки меньше нуля, то возвращаем
      * строку неизменённой.
      */
     if ($len < 0) {
         return $s;
     }

        /**
         * Если строка пустая, то ничего делать не надо.
         * Если длина строки меньше заданной, то тоже ничего делать не надо.
         */
        if (strlen($s) == 0 || strlen($s) <= $len) {
            return $s;
        }
..............................

)) 
Вообще странный код )))))

Код

/**
         * Массив символов для замены.
         */
        $arr = array(
            '!' => '!',
            '"' => '&quot;',
            '#' => '#',
            '$' => '$',
            '%' => '%',
            '&' => '&amp;',
            '\'' => ''',
            '(' => '(',
            ')' => ')',
            '*' => '*',
            '+' => '+',
            ',' => ',',
            '-' => '-',
            '.' => '.',
            '/' => '/',
            ':' => ':',
            ';' => ';',
            '<' => '&lt;',
            '=' => '=',
            '>' => '&gt;',
            '?' => '?',
            '@' => '@',
            '[' => '[',
            ']' => ']',
            '\\' => '\',
            '^' => '^',
            '_' => '_',
            '`' => '`',
            '{' => '{',
            '}' => '}',
            '|' => '|',
            '~' => '&~',
            chr(10) => '<br />'
        );

Это похоже стоило юзать с strtr() ? 


--------------------
user posted image
Nothing is impossible
My WeBlog
PM MAIL WWW ICQ   Вверх
sTa1kEr
Дата 21.8.2007, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Цитата(SelenIT @  20.8.2007,  22:34 Найти цитируемый пост)
Ну ещё бы! Такое чудо нужно во что бы то ни стало сохранить для потомков и бережно передать в музей! Имхо, это надо бы в юмор... ;) 

Да, звучит забавно. Но насколько я понял, суть здесь заключается в том, что если по ошибке или специально (если обрезать не требуется) было передано значение -1, то ничего не делать. Своего рода искусственный аналог опционального параметра. Т.е. если передать null и сделать проверку if ($len === null).

По самой функции:
1. Зачем сначала перекодировать, а затем из-за того что длина изменилась обрезать строку собственной функцией? Не проще сначала обрезать, а затем уже перекодировать? Тогда надобность в первой функции отпадет вообще.
2. Зачем цикл в 118 строке, когда есть такая замечательная функция, как strtr()?
3. 103ия строка - это опять же лишняя работа. Зачем менять "\r\n" на "\n", а затем "\n" на "<br />", когда можно одним махом nl2br()? 

А сам стиль хороший и логика понятна, но реализовать можно было намного проще.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0565 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.