SQL Injection после удаления всех одиночных кавычек и тире символов
Может ли кто-нибудь показать пример оператора sql, когда SQL Injection произошел даже после того, как все "одиночные кавычки" и "штриховые символы" были удалены из пользовательского ввода?
SELECT MyRecord FROM MyTable
WHERE MyEmail='[email protected]' AND MyPassword='foo'
(Здесь не задействованы никакие INT).
Кажется, что все говорят "да, я могу это сделать"... но когда они нажаты для e-x-a-m-p-l-e... никогда не показывались.
(Вы можете использовать любую версию, новую или старую, любого SQL-движка: SQL Server, MySql, SqlLite, PostgreSQL, Oracle и многие другие.)
Ответы
Ответ 1
Как вы "лишили пользователя ввода"? Если вы просто удалили все вхождения кавычек, то это действительно не справедливо для susan.o'[email protected]
, который не сможет использовать ваш сайт.
Если вы избежите каждой цитаты с другой цитатой которая также может вызвать проблемы. Если вы прошли через \'; DROP TABLE users; --
(по крайней мере, в MySQL \'
является альтернативой экранированию кавычек), то экранирование одной кавычки приведет к атаке SQL-инъекции, которая приведет к потере таблицы пользователей:
SELECT MyRecord FROM MyTable
WHERE MyEmail='\''; DROP TABLE MyTable; --' AND MyPassword='foo'
единственным реальным безопасным способом дезинфекции ваших входов является Параметрирование:
SELECT MyRecord FROM MyTable
WHERE MyEmail=? AND MyPassword=?
а затем добавьте значения параметров, используя выбранный вами язык, например, в java, где ps
- PreparedStatement
:
ps.setString(1, "[email protected]");
ps.setString(2, "foo");
ps.executeQuery();
Ответ 2
Проблема заключается не в том, что вы не можете создать систему санитарии, которая может избежать инъекции SQL; ты можешь. Проблема в том, что вы не можете создать реалистичную систему санитарии, которая гарантирует отсутствие инъекции SQL и может использоваться в любой, но самой тривиальной ситуации.
Приведенный вами пример - один из тех тривиальных случаев, которые никогда не могли быть использованы в реальном продукте. Реальный продукт должен поддерживать как одиночные кавычки, так и дефисы в именах пользователей и, вероятно, должен позволять обе (по крайней мере, дефисы) в поле пароля. Ваша система не позволяет:
-
Пользователи с апострофами в своих именах, например О'Рейли.
-
Пользователи с дефисными именами (Jean-Pierre) или последними (Fortesque-Smythe).
-
Пользователи, чьи домены адресов электронной почты включают дефисы.
-
Пароли, в которых пользователи следуют общей рекомендации по выбору знаков пунктуации и хотят использовать дефис или апостроф.
Итак, ваша санитация довольно безопасна для SQL-инъекций. Но так будет система, которая допускала бы только верхнюю букву "A".
Ответ 3
Возможно, вам стоит попробовать эту строку: [email protected]%BF%27 OR true; /*
см. эту ссылку для объяснения