Я хочу, чтобы пользователь мог выбирать, какие результаты заказа будут отображаться, например. по возрасту), и я не хочу сортировать их после получения из базы данных.
Очевидно, что если пользователь может указать ввод, который влияет на команды SQL, его необходимо очистить, и я обычно использую параметризацию, но pysqlite, похоже, игнорирует параметры для всего, кроме значений.
Ниже приведен пример кода, показывающий, что параметризация не работает для ORDER BY
, а также обходной путь с использованием форматирования строк, но он уязвим для внедрения SQL.
Какое рекомендуемое решение позволяет пользователю влиять на порядок сортировки, не подвергая уязвимости SQLi? Должен ли я использовать форматирование строк и проверять каждый ввод пользователя вручную?
#!/user/bin/env python3
import sqlite3
con = sqlite3.connect(':memory:')
cur = con.cursor()
cur.execute('CREATE TABLE test (name, age)')
cur.execute('INSERT INTO test VALUES (:name, :age)', {'name': 'Aaron', 'age': 75})
cur.execute('INSERT INTO test VALUES (:name, :age)', {'name': 'Zebedee', 'age': 5})
cur.execute('SELECT * FROM test ORDER BY age ASC')
results = cur.fetchall()
print('\nGood, but hard coded:\n', results)
# Good, but hard coded:
# [('Zebedee', 5), ('Aaron', 75)]
cur.execute('SELECT * FROM test ORDER BY :order_by ASC', {'order_by': 'age'})
results = cur.fetchall()
print('\norder_by parameter ignored:\n', results)
# order_by parameter ignored:
# [('Aaron', 75), ('Zebedee', 5)]
cur.execute('SELECT * FROM test ORDER BY {order_by} ASC'.format(order_by='age'))
results = cur.fetchall()
print('\nRight order, but vulnerable to SQL injection:\n', results)
# Right order, but vulnerable to SQL injection:
# [('Zebedee', 5), ('Aaron', 75)]
con.close()
'age; DROP TABLE test;--'
для третьей команды SQL, и pysqlite вызвал исключение, говорящееsqlite3.Warning: You can only execute one statement at a time.
, так что, может быть, мне не стоит беспокоиться? Мне все еще кажется, что использование форматирования строк опасно, хотя... - person Grezzo   schedule 25.01.2017'age'
, что не имеет смысла.) - person CL.   schedule 25.01.2017