обезопасить входящие данные

Spear

почемучка
обезопасить входящие данные

Добрый вечер,
у меня такая проблема возникла - делаю некоторые раздела на сайте, где пользователи смогут записывать в БД некоторые данные (например, комментарии).
Раньше об этом не задумывался (безопасность) но сейчас по-моему превращаюсь в параноика.

Единственное, что я хотел бы сейчас узнать - достаточно ли кода ниже, чтобы быть уверенным что такая переменная от пользователя не принесет мне никаких бед?:

PHP:
function clean_value($val)
    {   
            if ($val == "")
            {
                    return "";
            }  
            $val = str_replace( " ", " ", $val );           
            $val = str_replace( "&"            , "&"         , $val );
            $val = str_replace( "<!--"         , "&#60;&#33;--"  , $val );
            $val = str_replace( "-->"          , "--&#62;"       , $val );
            $val = preg_replace( "/<script/i"  , "&#60;script"   , $val );
            $val = str_replace( ">"            , "&gt;"          , $val );
            $val = str_replace( "<"            , "&lt;"          , $val );
            $val = str_replace( "\""           , "&quot;"        , $val );
            $val = preg_replace( "/\n/"        , "<br>"          , $val ); 
            $val = preg_replace( "/\\\$/"      , "&#036;"        , $val );
            $val = preg_replace( "/\r/"        , ""              , $val ); 
            $val = str_replace( "!"            , "&#33;"         , $val );
            $val = str_replace( "'"            , "&#39;"         , $val ); 
            
            $allow_unicode = "1";
            if ($allow_unicode)
                {
                        $val = preg_replace("/&amp;#([0-9]+);/s", "&#\\1;", $val );
                }
                                
            if (get_magic_quotes_gpc()) 
            {
                    $val = stripslashes($val);
            }          
            $val = preg_replace( "/\\\(?!&amp;#|\?#)/", "&#092;", $val ); 
            return $val;
    }
использование:
$username = clean_value($_POST[username]);
$comment = clean_value($_POST['txt']);

Очень прошу,подскажите - все ли учтено? по идее теперь никакие данные от пользователя, прошедшие эту бработку проблем принести не должны (я имею ввиду, например, XSS или SQL-иньекцию).
 

Фанат

oncle terrible
Команда форума
всё это глупости

-~{}~ 12.10.05 23:24:

от SQL-иньекций помогает праовильное составление запросов.
от XSS - htmlspecialchars
 

Spear

почемучка
Фанат
дело в том что код выше - не моих рук дело, а взят из исходника IPB
Я поэтому-то и начал беспокоиться - почему тогда они не используют протсой HTMLSPECIALCHARS? наврядли зр яони писали этот код.
Хотя мои догадки это все - ничто.
Поэтому и привел код и задал вопрос... беспокоюсь о безопасности :(
 

Фанат

oncle terrible
Команда форума
мало ли чего в IPB напишут.
особенно мне нравится общая замена
"<!--" на "& #60;& #33;--"
и отдельные замены восклицательного знака и угловой скобки.
"бережёного бог бережёт" - говаривала монашка, надевая на свечку презерватив. прямо про них сказано.
 

Spear

почемучка
Фанат
спасибо :)))
Ну теперь я спокоен :)
Главное не забывать при запросе в бд убирать все слешы с переменных а потом майскл_рил_эскеип_стринг, правильно? :)
 

Spear

почемучка
SiMM
как же неправильно?
Может я просто плохо обьяснил что мею ввиду.
Например, поступает от пользователя перменная
Me'n'u
(например это ник)
проверяю, не поставил ли magic_quotes слешы.
Если поставил - убираю.
Имеем $name = Me'n'u.
при запросе в базу select * from table where name='".mysql_real_escape_string($name)."'

Если я правильно понимаю - то никогой скл-иньекции тут быть не может.
А убираются слешы затем, чтобы при том же оставлении комментариев не получилось что-то типо

Как вам чтото с названием \"блаблабла\"?
-~{}~ 13.10.05 00:14:

да ещё такой вопрос - как записывать в базу бувкы типо о, u когда над ними две точки стоит (не знаю как эти буквы читаются в таков виде)
 

SiMM

Новичок
> Может я просто плохо обьяснил что мею ввиду.
Плохо. Потому что убирать эти слеши (magic_quotes_gpc) нужно (по крайней мере, так проще) всегда. И непосредственно к sql-injection это отношения никакого не имеет.

> никогой скл-иньекции тут быть не может.
Тут - не может.

> как записывать в базу бувкы типо о, u когда над ними две точки стоит
Проще всего - юзать UTF-8
 

Spear

почемучка
и я думаю последний вопрос по этой теме - как думаете, стоит ли записывать в базу кавычки ' и " в прямом виде и менять их на &#39; &quot; при выводе в браузер, или сразу хранить как &#39; &quot;?

-~{}~ 13.10.05 00:25:

тут - в смысле при таком виде запросов? я вприцнипе так всегда делаю :) спасибо :) Теперь по этому вопросу уже не волнуюсь.
 

jdoe

Новичок
cтоит ли записывать в базу кавычки ' и " в прямом виде
именно так и нужно делать. исключение - если ты уверен, что ни редактировать однажды внесенные данные, ни осуществлять по ним поиск тебе не понадобится вообще никогда - только тупо выводить...
 
Сверху