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


Автор: Артем125 20.9.2009, 13:44
Посмотрите, все ли учтено от инъекций и не создаст ли трудностей. Переданные данные - это любой текст, (а также теги description, keywords,title и т.д) который будет общедоступно заполнять статическую Интернет страничку
Код


// Если не нажата кнопка *** (Сохранить), то функция вызвана по ошибке
    if (!($_SERVER['REQUEST_METHOD'] == "POST" && isset($_POST['латинские буквы и цифры']))) {
        header( 'Location: '.$_SERVER['PHP_SELF'] );
        die();
    }
    
        
    // Обрезаем лишние пробелы
    if (isset($_POST['page_text']))    $page_text    = trim( $_POST['page_text'] );    else $page_text = '';
    ....    
    
    // Обрезаем переменные до длины, указанной в параметре maxlength тега input
    $page_text    = substr($page_text, 0, 10000);
    ....
  
    $error = '';
    // Проверяем, заполнены ли обязательные поля
    if (empty($page_text))    {
        $error = $error.'<li>не заполнено поле "Текст"</li>'."\n";
    }
    
    // Проверяем поля формы на недопустимые символы
    if (!empty($page_text) and !preg_match("#^[-.;:,?!\/)(_\"\s0-9а-яА-Яa-z]+$#i", $page_text)) {
        $error = $error.'<li>поле "Текст" содержит недопустимые символы</li>'."\n";
    }
    
    // Если были допущены ошибки при заполнении формы - 
    // перенаправляем оператора для исправления ошибок
    if ( !empty( $error ) )
    {
        ... Редирект в обратку
    }
    
    $result = mysql_query( "INSERT INTO ".TABLE_Ляляля." 
                            (
                            `page_id`,
                            ...
                            `page_date`,
                            ....
                            `page_text`
                            )
                            VALUES 
                            (
                            '',
                                                        ...
                            '".time()."', Чего то не работет ((
                            ...
                            '".mysql_real_escape_string($page_text)."'
                            )" );

Автор: Ипатьев 20.9.2009, 13:57
Вопросы.
1. Что такое "статическая Интернет"?
2. За что мучать сервер бесконечным циклом, если к скрипту обратились не через форму?
3. Зачем каждое поле проверять по три раза, а не один? 
4. Удалось бы вам написать свой вопрос на этом форуме, если бы он проверял вводимый текст на "недопустимые" символы?

Автор: Артем125 20.9.2009, 14:03
1) Интернет страничка, контент забивается через Веб интерфейс. Основные теги и контент
2) второй вопрос не понял((
3) так удобней все читать, группировать, ведь не одна переменная, а около десяти
4) вот потому и задался я таким вопросом )), для тегов это актуально, для контента видимо ограничивает

Автор: Ипатьев 20.9.2009, 14:11
1. Старайтесь писать более внятно. Если имеется в виду страница, то надо писать это слово. Если эта страница не лежит в готовом к отдаче виде, а формируется скриптом из базы данных, то это не статическая страница, а динамическая.
Что значит "основные теги"? Насколько я вижу, проверка на недопустимые символы не пропустит ни одного.

2. Зачем в строках 2-4 организован бесконечный цикл?

3. Неужели 30 одинаковых проверок удобнее, чем 10? Ну, на вкус и цвет...

4. Я не понял. Кому задан вопрос? Для кого эти символы "недопустимые"? Для незнакомого дяди в интернете? или все-таки для собственного произведения? 
Кроме вас никто не знает, какие на вашей "статической интернете" символы допустимы, а какие - нет.

Если данные вводятся общедоступно, то достаточной защитой от всяких яваскрипт-гадостей будет применение функции htmlspecialchars() при выводе данных.
При этом все теги, и основные, и не основные, будут выведены текстом, а не обработаны браузером.

Автор: Артем125 20.9.2009, 14:23
1) Простите, заработался. Есть форма, в которую вводят данные. Эти данные заносятся в б.д., оттуда при формировании динамической страницы попадают в теги title, description, keywords, основной контент этой страницы.
2) Это защита от подделки заголовков(возможно не прав). Если в $_POST не передано имя кнопки отправить ("латинские буквы и цифры"), то значит функция вызвана неправильно, может по ошибке. И кстати, почему бесконечный цикл. Если данные не верны, то редирект на главную страницу, а там ожидать действий пользователя
3) -
4) Главная задача часть данных обработать с защитой от инъекций и тегов, контент же только от инъекций и некоторых тегов, например td. Ведь после проверки данные сохраняются в базе

Автор: Ипатьев 20.9.2009, 14:41
Вы полагаете, что $_SERVER['PHP_SELF'] - это так на РНР называется главная страница? попробуйте найти описание этой переменной.
Цитата(Артем125 @  20.9.2009,  14:23 Найти цитируемый пост)
Главная задача часть данных обработать с защитой от инъекций

каких инъекций?
Цитата(Артем125 @  20.9.2009,  14:23 Найти цитируемый пост)
Теги как раз и не нужны, кроме как <p> в основном контенте

а зачем нужен <p>?

Автор: Артем125 20.9.2009, 14:50
Инъекции, вроде таких

Код

SELECT username, realname FROM users WHERE cityid='20' UNION SELECT username, password AS realname FROM users WHERE 1 OR '1'  AND age<'35'



<p> это тег абзаца, например, если не доработаны стили в шаблоне той страницы, в которую попадают обработанные данные из бд. 

Вообще, попробую выразиться по другому: все переданные данные должны обрабатываться от инъекций. Часть из них должна очищаться (или как угодно, экранироваться и т.п.) от тегов, другая часть лишь от избранных тегов (например <td><tr>).  


Автор: Ипатьев 20.9.2009, 14:52
От sql инъекций защищает строка 48 приведенного кода. 
Больше ничего не нужно.

Про стили не понял. 
Этот человек, который вводит информацию в форму, вот так и пишет - со стилями и параграфами? 

Автор: Артем125 20.9.2009, 14:59
Про стили не понял. 
Этот человек, который вводит информацию в форму, вот так и пишет - со стилями и параграфами?  

Ну например, сделал я шаблон. Вот так человек и пишет - с параграфами, а кто его знает, ну например, надо ему 2 строки отступить, вот он и добавляет тег <p>

"текст про чебурашку ......

<p></p>
И вот тут он нагнал серого волка///
"  

Получается строка 23 избавляет от тегов, да?, 48 от инъекций. А как бы избавиться от части тегов, например <td>,что бы конструкция из таблиц не полетела?

Автор: Ипатьев 20.9.2009, 15:05
а почему этот человек просто два раза в текстарии на ентер не нажмет?

Автор: Артем125 20.9.2009, 15:07
ну может и нажмет, а может и не нажмет , в конце концов не сообразит  smile . Честно сказать не думал, что сработает. 


Все же, может ему какие-то теги понадобятся, что ему тогда и мне делать и тут я прав? что строка 23 избавляет от тегов, да?, 48 от инъекций. 

Автор: Simpliest 20.9.2009, 15:09
Цитата(Артем125 @  20.9.2009,  14:59 Найти цитируемый пост)
А как бы избавиться от части тегов, например <td>

http://ua.php.net/manual/en/function.strip-tags.php


Цитата(Артем125 @  20.9.2009,  13:44 Найти цитируемый пост)
Код

// Если не нажата кнопка *** (Сохранить), то функция вызвана по ошибке
    if (!($_SERVER['REQUEST_METHOD'] == "POST" && isset($_POST['латинские буквы и цифры']))) {

А где здесь проверяется нажатие кнопки "Сохранить"?

Автор: Артем125 20.9.2009, 15:11
А где здесь проверяется нажатие кнопки "Сохранить"?  

ага, конечно, вот форма для отправки 
Код


<input type="submit" name="X234" id="submit" value="Сохранить"> 


// Если не нажата кнопка X234(Сохранить), то функция вызвана по ошибке
    
Код
 if (!($_SERVER['REQUEST_METHOD'] == "POST" && isset($_POST['X234']))) {


Спасибо за ссылку smile 

Автор: Ипатьев 20.9.2009, 15:12
Откуда у вас в форме возьмется человек, которому придет в голову писать в нее <p></p>?
Вам же не приходит?

Задача валидации html - сложная и муторная в решении.
Оно вам надо? 
Пусть пишут только текст. 
Если хочется хитрого оформления для фанатиков - bb-code или Wiki-разметка.




Автор: Артем125 20.9.2009, 15:13
Ну вообще - то. Если сломают авторизацию, не смогут базу попортить., может и не прав конечно, вообще то это админка. Просто хотел еще в добавок сделать защиту от дурака  smile 

Автор: Ипатьев 20.9.2009, 15:14
Simpliest, поскольк документацию все равно никто не читает, то надо рядом со ссылкой всегда обязательно дублировать, что
если функция вызывается с исключениями, то для той задачи, ради которой она обычно используется, strip_tags становится абсолютног бесполезной 

Добавлено @ 15:17
Цитата(Артем125 @  20.9.2009,  15:13 Найти цитируемый пост)
Если сломают авторизацию, не смогут базу попортить., 

тегами базу попортить невозможно.
в админке обычно оставляют возможность вводить любые теги.

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

Автор: Артем125 20.9.2009, 15:21
А что бы получить чистый текст без тегов подойдет строка 23?

Автор: Ипатьев 20.9.2009, 15:23
нет. эта строка позволяет получить ошибку

Автор: Артем125 20.9.2009, 15:25
редирект, если введен  тег?, да?

Автор: Ипатьев 20.9.2009, 15:26
эта строка не позволяет получить чистый текст без тегов 
она позволяет получить Редирект в обратку

Автор: Артем125 20.9.2009, 15:30
Понял, Вам Ипатьев респект и уважение за ответы и терпение!

Автор: Gold Dragon 21.9.2009, 13:16
может я просмотрел по тексту это замечание... но с чем сам сталкивался.. 

Если должны оставаться кроме чистого текста ещё и тэги, то с "обрезание" строки не всё так просто. Ты можешь обрезать по тэгу или, например, отрезать закрывающийся, а потом страница в будущем у тебя явно будет не валидной и скорее всего поползёт. Наверное, самый лучший способ - это контролировать количество символов при вводе или же сначала предупредить при отправке, а потом обрезать

Автор: Strilo4ka 22.9.2009, 22:09
воше то от скул иньекции строка в запросе два раза пропускаеться у вас Артем125,  !!! Ну в прынцыпе ничего страшного, но по умолчанию пхп настроен так что он сразу фильтрует, тоэсть "магические кавычки " включены. Все даные, неважно как они передаються, то ли гет, пост, в куках они фильтруються (екранируються). Можно просто сделать так если директива включена то не фильтруем, а если выключена то пропускаем через mysql_escape_string(). А воше мне еще нравится функция intval() она помогает тоже. Но у нее есть один недостаток. Она переводит строку в число О. Тоесть всегда будет выводится одна запись. Ну и substr в помощь !!!smile

Добавлено через 5 минут и 13 секунд
 
Код

if (!get_magic_quotes_gpc())
    {
     /* пропускаем сами через mysql_escape_string*/
    }



а еще после sttip_tags, trim еще можно через htmlspecialchars пропустить

Автор: Strilo4ka 22.9.2009, 22:30
и когда запрос выполняеться не мешало б @ поставить перед mysql_query на всякий случай!!! ООО и еще одна идеяка появилась, допустим хакер скопировать форму и хочет подменять даные, то можна написать функции защиты от заполнения маленькую (в нете встречал) типа такой вот 

Код

function false_form()
{
//защита формы от заполнения
$referer=$_SERVER["server_name"];

if(!preg_match("#www.kybik-rubik#", $referer))
    {
    echo "ХЕ-ХЕ:)...\n";
      exit;
    }
}


а потом просто в скриптах где форма поподключать... С другими какими то переменными масива сервер еще поиграться можно !!!

Автор: Ипатьев 22.9.2009, 22:46
это чудовищно. 
ТАКОЙ каши в голове я никогда в жизни не встречал.

Автор: Strilo4ka 22.9.2009, 23:02
а какая тут каша???

Автор: Simpliest 22.9.2009, 23:11
Цитата(Strilo4ka @  22.9.2009,  23:02 Найти цитируемый пост)
а какая тут каша??? 

Гречневая вперемешку с пшенной.

Автор: Ипатьев 22.9.2009, 23:42
Strilo4ka, если вы напишете эти свои "рекомендации" отдельным постом, то я постараюсь объяснить ошибки. 

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