Я хочу, чтобы пользователь мог выбрать, какие результаты заказа будут отображаться, например. по возрасту), и я не хочу сортировать их после получения их из базы данных.Как мне параметризовать имена столбцов в pysqlite, чтобы избежать SQL Injection
Очевидно, что если пользователь может указать ввод, который влияет на команды 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()
BTW, я просто попытался с помощью SQLI с этим входом ' 'возраст; DROP TABLE test; - «для третьей команды SQL, и pysqlite поднял исключение, говорящее« sqlite3.Warning: вы можете выполнять только одно заявление за раз ». Поэтому, возможно, я не должен беспокоиться? Мне все еще кажется, что использование форматирования строк опасно, хотя ... – Grezzo
Может ли пользователь каким-либо образом повлиять на фактическое содержимое строки? (В вопросе вы используете постоянную строку '' age'', что не имеет смысла.) –
Это происходит из запроса http. Если они используют правильный клиент (веб-страницу), это должно быть любое из шести имен столбцов, но если кто-то решит быть злым, это может быть все, что они выбирают. – Grezzo