Как я должен предотвратить злоупотребления при использовании web.database web.py?
Я пишу быстрое приложение web.py и беру данные из web.input...
import web
urls = (
'/', 'something',
)
app = web.application(urls, globals())
db = web.database(dbn='postgres', db='database', user='username', password='password', host='127.0.0.1')
class something:
def GET(self):
i = web.input()
return db.select('foo.table', where="column=$variable", vars={'variable':i.input, })
if __name__ == "__main__": app.run()
Должен ли я беспокоиться о передаче i.input в db.select (или запрос и т. Д.), Как я делаю как часть vars? Возможности SQL-инъекций и т. Д.?
Редактировать: я сам играл с этим, пытаясь добиться чего-то неприятного. Играя с цитированием, например, http://localhost:8080/?id=13%27%20or%20%27x%27%20=%27x приводит к тому, что sql с хорошим экранированием отображается в Exceptions:
<sql: 'select * from foo.table where id = "13\' or \'x\'=\'x"'>
Я попробовал несколько других распространенных тестов, которые предлагает интернет, и думаю, что я очень доволен, что web.py занимается санитарией... Кто-нибудь еще сможет прокомментировать?
3 ответа
http://webpy.org/cookbook/query говорит:
Чтобы предотвратить атаки с использованием SQL-инъекций, db.query также принимает синтаксис "vars", как описано в db.select:
results = db.query("SELECT * FROM users WHERE id=$id", vars={'id':10})
Это позволит избежать пользовательского ввода, если вы доверяете им для переменной "id".
Так что, думаю, все так просто.
Конечно, я понимаю, что мне все еще нужно проверить ввод пользователя, если я собираюсь вставить его местами...
"Приятно избежавший sql", который вы видите, не имеет значения, поскольку он никогда не отправляется ядру базы данных.
Во всех случаях, если вы вручную не вставите значения в строку запроса SQL, вы защищены от внедрения SQL. Это включает в себя методы выбора / вставки / обновления / удаления, а также $variable_name
стиль замещения. В обоих случаях запрос SQL не полностью собран как текст, но должным образом преобразован в подготовленный оператор SQL и скомпилирован механизмом БД как таковым. Только после этого параметры фактически подставляются для выполнения оператора. Таким образом, если вы не строите строку SQL-запроса и / или ее части вручную, используя ненадежные данные, вы в безопасности.
К сожалению, я не могу предоставить ссылку на какой-либо источник лучше, чем исходный код модуля, так как это был мой единственный источник информации.
Да, потому что кто-то может изменить переменную, особенно если это происходит из URL, чтобы сказать что-то вроде "selecte * из таблицы, где id = [ variable + DELETE TABLE[. Это пример внедрения SQL. Это особенно важно, если пользователь имеет Любое представление о том, как называются ваши объекты данных.
Я не совсем уверен, как Python будет обрабатывать параметризацию переменных для оператора SQL, но мне пришлось выполнить аналогичные исправления безопасности для сайтов холодного синтеза и сайтов ASP.net.