Моя функция против Mysql_real_escape_string - PullRequest
0 голосов
/ 02 апреля 2012

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

   $username = CleanMe($_SESSION["username"]);
   $password = CleanMe($_SESSION["password"]);

   //return clean values
   $_SESSION["username"] = $username;
   $_SESSION["password"] = $password;

CleanMe:

       function CleanMe($strWords){ 
       $bad_string = array("select", "drop", ";", "--", "insert","delete", 
       "xp_", "%20union%20", "/*", "*/union/*", "+union+", "load_file", 
       "outfile", "document.cookie", "onmouse", "<script", "<iframe", "<applet", 
       "<meta", "<style", "<form", "<img", "<body", "<link", "_GLOBALS", "_REQUEST", 
       "_GET", "_POST", "include_path", "prefix", "http://", "https://", 
       "ftp://", "smb://", "'", "\""); 
       for ($i = 0; $i < count($bad_string); $i++){ 
       $strWords = str_replace ($bad_string[$i], "", $strWords); 
       } 
       return $strWords; 
       }

Теперь, имеет ли смысл использовать mysql_real_escape_stringили что у меня, CleanMe более безопасный?

Ответы [ 3 ]

3 голосов
/ 02 апреля 2012

Просто максимально используйте существующие функции; mysql_real_escape_string в этом случае. Вполне вероятно, что вы забыли что-то в CleanMe, что делает его небезопасным. Вам нужно только забыть одну строку, чтобы сделать ее небезопасной, и вы можете не знать, что это за строка сейчас.

Просто помните: у злоумышленника достаточно времени, и он должен сделать это правильно только один раз, но разработчик должен быть прав каждый раз. Итак, урок: не усложняйте себе, правильно используйте и применяйте существующие функции.

1 голос
/ 04 апреля 2012

Несмотря на то, что ваша Cleanme() функция не имеет абсолютно никакого смысла, функция mysql_real_escape_string() также не имеет смысла (в этом контексте).

Вы не должны использовать ни один из них!

с целью какой бы то ни было "очистки".

mysql_real_escape_string() не предназначен для «чистки» чего-либо

, но только для строк формата.

Всякий раз, когда вам нужна эта функция, она нужна вам, несмотря на «очистку», но только потому, что это требуется синтаксисом SQL. А если вам это не нужно, экранирование не поможет вам даже немного.

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

Это просто функция, связанная с синтаксисом, а не связанная с безопасностью.

В зависимости от этой функции в вопросах безопасности, полагая, что она «очистит» ваши данные БУДЕТ в конечном итоге приведет вас к инъекции.

Защита ваших запросов от инъекций - более сложная задача. См. полное объяснение для получения полной информации.

Подготовленные заявления тоже не серебряная пуля. Она покрывает вашу спину только для половины возможных случаев. Смотрите важное дополнение, которое я сделал к известному вопросу для деталей

0 голосов
/ 02 апреля 2012

Вы можете использовать mysql_real_escape_string , подготовленные операторы или использовать другой уровень абстракции. Это кажется намного более безопасным, чем CleanMe.

...