![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
XeLpeR |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 22.9.2008 Репутация: нет Всего: нет |
Здравствуйте, помогите пожалуйста разобраться.
Скрипт принемает переменную и экранирует метасимволы, чтоб в дальнейшем выпольнить "SELECT" запрос:
и теперь если в переменной не было метасимволов, то все будет работать нормлаьно, но если вдруг появляется какой либо метасимвол(. ' &* $ @ и т.д) запрос завершается с ошибкой - "Unknow message type: 'a'" ! Тип поля в базе - "character varying(15)". А если quotemeta() при "INSERT" запросах - то все нормально. Из-за чего может быть ошибка ? |
|||
|
||||
KSURi |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 2 Всего: 27 |
В данном случае вам надо использовать вовсе не quotemeta, а placeholder'ы DBI (потенциально опасные символы будут обработаны прозрачно для вас):
Это сообщение отредактировал(а) KSURi - 10.10.2008, 11:25 -------------------- Died at Life.pl line 21 |
|||
|
||||
unicross |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 422 Регистрация: 15.6.2008 Репутация: 2 Всего: 53 |
или так
|
|||
|
||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: нет Всего: 18 |
не самый лучший вариант |
|||
|
||||
KSURi |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 2 Всего: 27 |
UPD: невнимательно прочитал пост unicross, сори
Это сообщение отредактировал(а) KSURi - 10.10.2008, 13:56 -------------------- Died at Life.pl line 21 |
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 4 Всего: 49 |
XeLpeR, покажите строку запроса к БД, при которой выдается ошибка. Текст ошибки нестандартный, интересно
![]() -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
unicross |
|
||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 422 Регистрация: 15.6.2008 Репутация: 2 Всего: 53 |
Чем он плох? Если вы о кавычках... То: Метод quote() экранирует все специальные символы в строке и заключает строку в апострофы. Результат метода зависит от используемого драйвера базы данных.
Выведет
|
||||||||
|
|||||||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 4 Всего: 49 |
unicross, существенное отличие использования quote() от placeholders в том, что подстановка осуществляется до синтаксического разбора строки:
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
unicross |
|
||||||||||||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 422 Регистрация: 15.6.2008 Репутация: 2 Всего: 53 |
Вы хотите сказать, что данное значение должно удалить таблицу table?
Выведет
Почему тогда таблица не была удалена? Ведь я не только вставил значение в поле, но и дважды его получил! Даже строка
не является проблемой. После использования метода quote() строка
будет преобразована в
а не в
в этом случае конечно придется туго ![]() ginnie, я не спорю, применение placeholders является хорошим решением. Особенно если добавляется или изменяется много записей, то этот способ очень эффективен, т.к. запрос готовится один раз.
XeLpeR, покажите строку запроса к БД. Мне тоже интересно... |
||||||||||||||||||
|
|||||||||||||||||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: нет Всего: 18 |
не самый лучший вариант потому что placeholders все-таки лучше использовать.
Это сообщение отредактировал(а) shamber - 10.10.2008, 18:38 |
|||
|
||||
unicross |
|
||||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 422 Регистрация: 15.6.2008 Репутация: 2 Всего: 53 |
shamber, спорить на эту тему не буду.
В случае с XeLpeR первая ошибка в строке
отсутствие апострофов
Потом, насколько я понял, функция quotemeta() экранирует не только метасимволы, но и все, что не подпадает под условие /[A-Za-z_0-9]/
выведет
Получаем ужастный SQL-запрос
Ничего странного в ошибке нет. Это закономерность. |
||||||||||
|
|||||||||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 4 Всего: 49 |
unicross, по поводу SQL-injection я был не прав!
![]() Это сообщение отредактировал(а) ginnie - 10.10.2008, 20:01 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
XeLpeR |
|
||||||||||||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 22.9.2008 Репутация: нет Всего: нет |
Извиняюсь, но в запросе есть кавычки, просто я писал по памяти и забыл тут их поставить ![]() Я подозреваю,что эта ошибка вылазит, потому что на 2-ом ноуте у меня винда и стоит PgPP - может из-за него.( пишет что ошибка в файле PgPP.pm line 730) Добавлено @ 22:42 И еще заметил,что эта ошибка возникает когда в запросе появляются 2 или больше обратных слеша ошибка
все нормально работает
но так не экранируется кавычка
Это сообщение отредактировал(а) XeLpeR - 10.10.2008, 22:42 |
||||||||||||
|
|||||||||||||
XeLpeR |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 22.9.2008 Репутация: нет Всего: нет |
$profile = IP или '0.0.0.0'(если что-то не верно)
функциия hashsref():
п.с. ошибка в файле PgPP.pm line 730 , для работы с PgSQL :
Это сообщение отредактировал(а) XeLpeR - 10.10.2008, 22:59 |
||||||||
|
|||||||||
XeLpeR |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 22.9.2008 Репутация: нет Всего: нет |
Я был прав, ошибка возникает только если используется модуль PgPP.pm, а при использовании Pg.pm все работает корректно.
Всем спасибо и звиняюсь за ложную тревогу ) |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl: CGI программирование" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: разработка для Web | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |