Бэкенд-программирование
Введено| English | Значение |
|---|---|
| route/ruːt/ | маршрут |
| validate input/ˈvælɪdeɪt ˈɪnpʊt/ | проверка ввода |
| status/ˈsteɪtəs/ | код состояния |
| SQL injection/ˌes kjuː ˈel ɪnˈdʒekʃn/ | SQL-инъекция |
| parameterised query/ˌpærəˈmetəraɪzd ˈkwɪərɪ/ | параметризованный запрос |
Строка поиска изменяет запрос
- Поиск по имени получает
' OR 1=1 --. Если код вставляет его в SQL-запрос, текст может изменить условие вместо того, чтобы оставаться именем. - Маршрут сопоставляет метод и путь запроса с обработчиком. Сохраняйте четкость контракта маршрута до реализации поиска.
Проверяйте структуру данных и права доступа
- Валидация ввода означает проверку наличия обязательных значений, типов, допустимой длины и диапазонов. Права вызывающего субъекта проверяются отдельно.
- Статус описывает результат: 200 для успешного поиска, 400 для некорректного ввода и 404 для отсутствующего ресурса. Сбои прав доступа требуют применения согласованной политикой приложения; они автоматически не являются ошибкой ввода.
Сопоставьте эти результаты с контрактом маршрута урока.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
Эти значения сами по себе не определяют, как должны представляться сбои в доступе к приватным разрешениям.
Храните значения вне текста SQL-запроса
- SQL-инъекция возникает, когда недоверенный текст становится частью синтаксиса SQL. Параметризованный запрос связывает значение отдельно от самого запроса.
- Заполнители привязывают значения, а не произвольные имена таблиц или направления сортировки. Выбирайте такие идентификаторы из фиксированного списка разрешенных элементов на стороне сервера, если маршрут требует их использования.
Какое использование параметров (placeholder) сохраняет введенное имя отдельно от синтаксиса SQL?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Привязка значений отделяет их от фиксированного запроса.
Объясните, что изменение при связывании имени со заполнителем SQL меняет.
Difficulty 3/5 · 200 coins + a small bonus on first completion today
Запрос остается неизменным, а отдельно связанное значение остается данными.
Заполнитель значения может безопасно представлять любое имя таблицы или направление сортировки.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Заполнители привязывают значения. Выбирайте динамические идентификаторы из фиксированного списка разрешенных на стороне сервера.
Запустите полный локальный пример
- Сохраните и запустите этот пример на Python с использованием SQLite. Необычная строка сохраняется как имя, затем ищется как привязанное значение.
- Результат содержит только строку с этим именем. Привязка предотвращает превращение этого значения в SQL-синтаксис; она не устанавливает права доступа и не делает любое приложение безопасным.
import sqlite3
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE students (id INTEGER PRIMARY KEY, name TEXT)")
name = "' OR 1=1 --"
con.executemany("INSERT INTO students VALUES (?, ?)", [(1, "Mei"), (2, name)])
rows = con.execute("SELECT id FROM students WHERE name = ?", (name,)).fetchall()
print(rows) # [(2,)]
con.close()
Что выводит полный пример SQLite?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Нестандартная строка сохраняется и затем сопоставляется как буквальное имя.
Сохраняйте ошибки полезными и приватными
- Предоставьте браузеру четкое сообщение, которое он может обработать, например, об ошибке в поле или временном сбое. Не возвращайте сырые SQL-ошибки, конфиденциальные учетные данные или стековые трассировки.
- Записывайте детали диагностики только в защищенные логи, удаляя чувствительные значения. Лог достаточно контекста для расследования, не копируя каждое тело приватного запроса.
Возвращать сырые ошибки базы данных обычным посетителям, чтобы они могли отладить SQL-запросы.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Возвращать полезные безопасные сообщения; защищать диагностические журналы и удалять чувствительные значения.
Проверяйте больше, чем успешный путь
- Проверяйте валидные, отсутствующие, неправильного типа и слишком большие входные данные; отказ в доступе; пустой результат поиска; и симуляцию сбоя базы данных. Указывайте ожидаемый результат для каждого случая.
- Держите все динамические значения привязанными, включая значения из выпадающих списков. Список браузера не предотвращает отправку другого значения напрямую.
Валидируйте запрос, авторизуйте вызывающую сторону и привяжите значения данных. Эти действия решают разные проблемы; ни одна из них не заменяет другие.
Какие внешние входные данные требуют соответствующих проверок на стороне сервера? Выберите все подходящие варианты.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
Внешние значения, которые выглядят обычными, все равно могут иметь неверные типы, длины или права доступа.
Запрос параметризован, но любой вызывающий может прочитать приватные строки студентов. Чего не хватает?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Привязка адресов — это подстановка значений; она не дает прав вызывающему.