English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основное руководство по SQLite

Дополнительное руководство по SQLite

Интерфейс программы SQLite

Инъекции в SQLite

Если ваш сайт позволяет пользователям вводить данные через веб-страницу и вставлять их в базу данных SQLite, в этом случае вы сталкиваетесь с проблемой безопасности, известной как SQL-инъекция. В этой главе мы расскажем, как предотвратить这种情况, обеспечить безопасность скриптов и команд SQLite.

Инъекции обычно происходят при запросе ввода от пользователя, например, когда необходимо ввести имя, но пользователь вводит команду SQLite, которая незаметно выполняется в базе данных.

Никогда не верьте данным, предоставленным пользователями, обрабатывайте только данные, прошедшие проверку, это правило выполняется через шаблонное соответствие. В следующем примере имя пользователя username ограничивается буквенно-цифровыми символами или подчеркиванием, длина должна быть от 8 до 20 символов - в зависимости от ваших требований изменяйте эти правила.

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)){}}
   $db = new SQLiteDatabase('filename');
   $result = @$db->query("SELECT * FROM users WHERE username = $matches[0]");} else {
   echo "username not accepted";}

Для демонстрации проблемы, посмотрите следующий отрывок-

$name = "Qadir'; 
DELETE FROM users;";@$db->query("SELECT * FROM users WHERE username = '{$name}'");

вызов функции предназначен для извлечения записей из таблицы users, где значение name соответствует указанному пользователем имени. В нормальных условиях:$name только символы алфавита, цифры или пробелы, например, строка ilia. Но в данном случае, к $name была добавлена全新的 запрос, который вызовет катастрофическую проблему: инъекция DELETE будет удалять все записи из таблицы users.

Хотя уже существуют интерфейсы базы данных, которые не позволяют叠ывать запросы или выполнять несколько запросов в одном вызове функции, при попытке叠овать запросы они будут失败的, но SQLite и PostgreSQL все еще позволяют叠овать запросы, то есть выполнять все запросы, предоставленные в одном строковом выражении, что может привести к серьезным проблемам с безопасностью.

для предотвращения SQL-инъекций

В языках скриптов, таких как PERL и PHP, вы можете巧妙но обрабатывать все символы escaping. Язык программирования PHP предоставляет строковые функции SQLite3::escapeString($string) и sqlite_escape_string() для escaping специфических символов ввода для SQLite.

Внимание: Используйте функцию sqlite_escape_string() требуется версия PHP: PHP 5 < 5.4.0

Для более высокой версии PHP 5 >= 5.3.0, PHP 7 используется функция:

if (get_magic_quotes_gpc()) {
   $name = sqlite_escape_string($name);
}
$result = @$db->query("SELECT * FROM users WHERE username = '{$name}'");

Хотя код делает вставку данных безопасной, он呈现简单的 текстовый сравнение, в запросе, для столбцов, содержащих двоичные данные:LIKE Подзапросы недоступны.

Пожалуйста, не используйте addslashes() для цитирования строк в запросах SQLite, так как это может привести к странным результатам при извлечении данных.