English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Если ваш сайт позволяет пользователям вводить данные через веб-страницу и вставлять их в базу данных 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 все еще позволяют叠овать запросы, то есть выполнять все запросы, предоставленные в одном строковом выражении, что может привести к серьезным проблемам с безопасностью.
В языках скриптов, таких как 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, так как это может привести к странным результатам при извлечении данных.