Шаг 220.
Основы языка Python.
Доступ к базам данных MySQL. Библиотека PyODBC. Обработка результата запроса

    На этом шаге мы рассмотрим особенности обработки результатов запроса.

    Для обработки результата запроса применяются следующие методы объекта-курсора:

    Объект-курсор поддерживает несколько атрибутов:

    Мы уже не раз говорили, что передавать значения, введенные пользователем, необходимо через второй параметр метода execute(). Если данные не обработать и подставить в SQL-запрос, то пользователь получит возможность видоизменить запрос и, например, зайти в закрытый раздел без ввода пароля. В качестве примера составим SQL-запрос с помощью форматирования и зайдем под учетной записью пользователя без ввода пароля:

>>> user = "unicross@mail.ru'/*"
>>> passw ="*/ '"
>>> sql = """SELECT * FROM `user`
       WHERE `email`='%s' AND `passw`='%s'""" % (user, passw)
>>> cur.execute(sql)
<pyodbc.Cursor object at 0x02445560>
>>> cur.fetchone()
(1, 'unicross@mail.ru', 'passwordl')

    Как видно из результата, мы получили доступ, не зная пароля. После форматирования SQL-запрос будет выглядеть следующим образом:

  SELECT * FROM `user` WHERE `email`='unicross@mail.ru'/*'
         AND `passw`=*/ ''

    Все, что расположено между /* и */, является комментарием. В итоге SQL-запрос будет выглядеть так:

  SELECT * FROM `user` WHERE `email`='unicross@mail.ru' ''

    Никакая проверка пароля в этом случае вообще не производится. Достаточно знать логин пользователя - и можно войти без пароля. Если данные передавать через второй параметр метода execute(), то все специальные символы будут экранированы, и пользователь не сможет видоизменить SQL-запрос:

>>> user = "unicross@mail.ru'/*"
>>> passw ="*/ '"
>>> sql = "SELECT * FROM `user` WHERE `email`=? AND `passw`=?"
>>> cur.execute(sql, (user, passw))
<pyodbc.Cursor object at 0x02445560>
>>> print (cur.fetchone())
None

    После подстановки значений SQL-запрос будет выглядеть следующим образом:

  SELECT * FROM `user` WHERE `email`='unicross@mail.ru\'/*'
         AND `passw`='*/ \''

    В результате все опасные символы оказались экранированы.

    Со следующего шага мы начнем знакомиться с библиотекой Pillow.




Предыдущий шаг Содержание