Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Одинарные кавычки
 
 автор: Николай2357   (01.08.2008 в 09:00)   письмо автору
 
 

Здравствуйте.
Вычитал на одном сайте, что при занесении данных в базу в целях безопасности нужно обрабатывать их на предмет наличия одинарных ковычек. Там дан пример:
$text=str_replace("'", "'", $text);

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

  Ответить  
 
 автор: Trianon   (01.08.2008 в 09:38)   письмо автору
 
   для: Николай2357   (01.08.2008 в 09:00)
 

Скорее всего на этом сайте просто честно применяют предлагаемые рекомендации.

  Ответить  
 
 автор: GeorgeIV   (01.08.2008 в 09:45)   письмо автору
 
   для: Николай2357   (01.08.2008 в 09:00)
 

` ' - это две разные кавычки, скорей всего либо броузер неправильно отображает, либо вы неправильно скопировали, но смысл в этом - приведение всех кавычек к единому виду

  Ответить  
 
 автор: Николай2357   (01.08.2008 в 09:54)   письмо автору
 
   для: GeorgeIV   (01.08.2008 в 09:45)
 

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

  Ответить  
 
 автор: Trianon   (01.08.2008 в 10:17)   письмо автору
 
   для: Николай2357   (01.08.2008 в 09:54)
 

не нужно ничего менять....

  Ответить  
 
 автор: GeorgeIV   (01.08.2008 в 10:42)   письмо автору
 
   для: Trianon   (01.08.2008 в 10:17)
 

Возможно имелась ввиду не MySQL. БД Оракл обратные кавычки не принимает (по крайней мере в девелопере точно)

  Ответить  
 
 автор: Trianon   (01.08.2008 в 10:57)   письмо автору
 
   для: GeorgeIV   (01.08.2008 в 10:42)
 

В Oracle другой способ представления символа кавычки в текстовом литерале. Они там удваиваются перед обрамлением.

В любом случае - менять один символ на другой - бред.
Чем другой символ хуже первого? Его как тогда представлять?

  Ответить  
 
 автор: GeorgeIV   (01.08.2008 в 11:33)   письмо автору
 
   для: Trianon   (01.08.2008 в 10:57)
 

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

  Ответить  
 
 автор: Trianon   (01.08.2008 в 11:47)   письмо автору
 
   для: GeorgeIV   (01.08.2008 в 11:33)
 

Унифицированной , в том смысле что независимо от того, на какой СУБД?

Для этого классы-обертки применяют. Там детали реализации скрываются, наружу вылезает до той или иной степени унифицированный интерфейс.

  Ответить  
 
 автор: Николай2357   (01.08.2008 в 12:32)   письмо автору
 
   для: Trianon   (01.08.2008 в 11:47)
 

Вот дословно, что там написано:
Старайтесь не допускать внесения в базу данных символа одинарной кавычки ("'"), поскольку это служебный символ запросов БД. Перед внесением в базу поле можно обработать функцией str_replace:
$somefield = str_replace("'", "'", $somefield); 

К тому же это лишний барьер на пути взломщиков вашего сайта. Пример "взлома" простой:

mysql_query("UPDATE users SET password=PASSWORD('$passwd') WHERE login='$login'");

Если кавычку не обработать на входе, злоумышленник может в качестве логина сунуть строку "vasya_pupkin' OR login LIKE '%". В базу данных залетит запрос:
mysql_query("UPDATE users SET password=PASSWORD('$passwd') WHERE login='vasya_pupkin' OR login LIKE '%'"); 
То есть все пароли будут одинаковые.

Бред?

  Ответить  
 
 автор: Trianon   (01.08.2008 в 12:58)   письмо автору
 
   для: Николай2357   (01.08.2008 в 12:32)
 

Чистой воды костыль.

А надо читать вот что:
--------------------------------------------------------------------------------------------------------------------

Справочное руководство по MySQL
6.1.1.1 Cтроки

   * 6 Справочник по языку MySQL
          o 6.1 Структура языка
                + 6.1.1 Литералы: представление строк и чисел
                      # 6.1.1.1 Cтроки
                      # 6.1.1.2 Числа
                      # 6.1.1.3 Шестнадцатеричные величины
                      # 6.1.1.4 Значения NULL 

Previous / Next / Up / Table of Contents
6.1.1.1 Cтроки

Строка представляет собой последовательность символов, заключенных либо в одинарные кавычки (`'') - апострофы, либо в двойные кавычки (`"'). При использовании диалекта ANSI SQL допустимы только одинарные кавычки. Например:

      'a string'
      "another string"

Внутри строки некоторые последовательности символов имеют специальное назначение. Каждая из этих последовательностей начинается обратным слешем (`\'), известным как escape-символ или символ перехода. MySQL распознает следующие escape-последовательности:

     \0
          Символ 0 (NUL) в ASCII коде. 
      \'
          Символ одиночной кавычки (`''). 
      \"
          Символ двойной кавычки (`"'). 
      \b
          Возврат на один символ. 
      \n
          Символ новой строки (перевода строки). 
      \r
          Символ перевода каретки. 
      \t
          Символ табуляции. 
      \z
          Символ (Control-Z) таблицы ASCII(26). 
Данный символ можно закодировать, чтобы обойти проблему, заключающуюся в том, что под Windows ASCII(26) означает конец файла (проблемы возникают при использовании ASCII(26) в выражении mysql database < filename).
     \\
          Символ обратного слеша. 
      \%
          Символ процентов `%'. 
Используется для поиска копий литерала `%' в контекстах, где выражение `%' в противном случае интерпретировалось бы как групповой символ (see section

6.3.2.1 Функции сравнения строк).
\`_'
Символ подчеркивания `_'. Используется для поиска копий литерала `_' в контекстах, где выражение `_' в противном случае интерпретировалось бы как групповой символ (see section 6.3.2.1 Функции сравнения строк).

Обратите внимание на то, что при использовании `\%' или `\_' в контекстах некоторых строк будут возвращаться значения строк `\%' и `\_', а не `%' и `_'.

Существует несколько способов включить кавычки в строку:
o Одиночная кавычка (апостроф) `'' внутри строки, заключенной в кавычки `'', может быть записана как `'''.
o Двойная кавычка `"' внутри строки, заключенной в двойные кавычки `"', может быть записана как `""'.
o Можно предварить символ кавычки символом экранирования (`\').
o Для символа `'' внутри строки, заключенной в двойные кавычки, не требуется специальной обработки; его также не требуется дублировать или предварять обратным слешем. Точно так же не требует специальной обработки двойная кавычка `"' внутри строки, заключенной в одиночные кавычки `''.

Ниже показаны возможные варианты применения кавычек и escape-символа на примерах выполнения команды SELECT:

      mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';
      +-------+---------+-----------+--------+--------+
      | hello | "hello" | ""hello"" | hel'lo | 'hello |
      +-------+---------+-----------+--------+--------+

      mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello";
      +-------+---------+-----------+--------+--------+
      | hello | 'hello' | ''hello'' | hel"lo | "hello |
      +-------+---------+-----------+--------+--------+

      mysql> SELECT "This\nIs\nFour\nlines";
      +--------------------+
      | This
      Is
      Four
      lines |
      +--------------------+


Если необходимо вставить в строку двоичные данные (такие как BLOB), следующие символы должны быть представлены как escape-последовательности:

      NUL
          ASCII 0. Необходимо представлять в виде `\0' (обратный слеш и символ ASCII `0'). 
      \
          ASCII 92, обратный слеш. Представляется как `\\'. 
      '
          ASCII 39, единичная кавычка. Представляется как `\''. 
      "
          ASCII 34, двойная кавычка. Представляется как `\"'. 

При написании программы на языке C для добавления символов экранирования в команде INSERT можно использовать функцию mysql_real_escape_string() из C API (see section 8.4.2 Обзор функций интерфейса C). При программировании на Perl можно использовать метод quote из пакета DBI для превращения специальных символов в соответствующие escape-последовательности (see section 8.2.2 Интерфейс DBI).

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

В качестве альтернативы многие интерфейсы прикладного программирования (API) для MySQL предоставляют определенную возможность использования символов-заменителей, что позволяет вносить специальные маркеры в строку запроса и затем связывать с ними значения данных при выдаче результатов запроса.

  Ответить  
 
 автор: Николай2357   (01.08.2008 в 13:04)   письмо автору
 
   для: Trianon   (01.08.2008 в 12:58)
 

Вот это да! Огромное спасибо!
Хорошо, что безграматные люди допускают много ошибок, если бы не опечатка, я долго бы наверное дурью маялся...

  Ответить  
 
 автор: Николай2357   (02.08.2008 в 10:05)   письмо автору
 
   для: Николай2357   (01.08.2008 в 13:04)
 

Снедает меня нездоровое любопытство, пришлось поднять тему, извините.
По иронии судьбы наткнулся на подобное на этом форуме:
http://www.softtime.ru/forum/read.php?id_forum=7&id_theme=14373
Может быть я все таки пропускаю что-то важное?
Спасибо.
PS Не подумайте, что я невнимательно читал ответы, просто всетаки зачем-то это делается иногда?

  Ответить  
 
 автор: cheops   (02.08.2008 в 11:20)   письмо автору
 
   для: Николай2357   (02.08.2008 в 10:05)
 

Функций очень много - разобраться со всеми сразу бывает поначалу не просто, а работать-то надо. Замена одного символа другим решение универсальное для всех языков программирования, поэтому это первое, что приходит в голову. Однако, лучше использовать экранирование - к сожалению, в PHP из-за режима "магических кавычек" (которые будут исключены в PHP 6) - это не всегда просто сделать.

  Ответить  
 
 автор: Николай2357   (02.08.2008 в 11:39)   письмо автору
 
   для: cheops   (02.08.2008 в 11:20)
 

Спасибо.
>Функций очень много - разобраться со всеми сразу бывает поначалу не просто
что правда, то правда.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования