Pymssql и заполнители - PullRequest
       3

Pymssql и заполнители

6 голосов
/ 13 марта 2012

Какие заполнители я могу использовать с pymssql. Я получаю свои значения из строки запроса html, поэтому они все имеют тип string. Это безопасно в отношении инъекции sql?

query = dictify_querystring(Response.QueryString)
employeedata = conn.execute_row("SELECT * FROM employees WHERE company_id=%s and name = %s", (query["id"], query["name"]))  

Какой механизм используется в этом случае, чтобы избежать инъекций?

Не так много документации по pymssql ...

Возможно, есть лучший модуль Python, который я мог бы использовать для взаимодействия с Sql Server 2005.

Спасибо

Barry

Ответы [ 2 ]

5 голосов
/ 15 марта 2012

Относительно внедрения SQL и не зная точно, как работает эта реализация, я бы сказал, что это небезопасно.

Несколько простых шагов, чтобы сделать это так:

  1. Изменитьэтот запрос в подготовленный оператор (или убедитесь, что внутренняя реализация делает это, но не похоже на это).

  2. Убедитесь, что вы используете 'вокруг аргументов вашего запроса.

  3. Проверьте ожидаемый тип ваших аргументов (если параметры запроса должны быть числовыми являются действительно числовыми и т. Д.).

В основном ... ключ номер один.Использование подготовленных операторов является наиболее важной и, вероятно, самой простой линией защиты от внедрения SQL.

Некоторые ORM позаботятся о некоторых из этих проблем для вас (обратите внимание на широкое использование слова some ), но я бы посоветовал убедиться, что вы знаете эти проблемы и как обойти их, прежде чем использовать абстракцию, такую ​​как ORM.

Рано или поздно вам нужно знать, что происходит под этими чудесными слоями экономии времени.

4 голосов
/ 15 марта 2012

Возможно, есть лучший модуль Python, который я мог бы использовать для взаимодействия с Sql Server 2005.

Что ж, мой совет - использовать ORM, такой как SqlAlchemy, для обработки этого.

>>> from sqlalchemy.ext.sqlsoup import SqlSoup
>>> db = SqlSoup('mssql:///DATABASE?PWD=yourpassword&UID=some_user&dsn=your_dsn')
>>> employeedata = db.employees.filter(db.employees.company_id==query["id"])\
                               .filter(db.employees.name==query["name"]).one()

Вы можете использовать one(), если хотите вызвать исключение, если существует более одной записи, .first(), если вы хотите только первую запись, или .all(), если вы хотите все записи.

В качестве дополнительного преимущества, если вы позже перейдете на другую СУБД, код останется прежним, за исключением URL-адреса соединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...