|
|
|
Java + PostgreSQL: sql injection protection
|
|||
|---|---|---|---|
|
#18+
Всем привет! Есть запрос вида: query.append("select id"); query.append("from users"); query.append("where login='"+login+"' and password='"+password+"'"); login/password приходят от юзера, юзер считается авторизованным если запрос вернул хотя бы одну запись. Вопрос в следующем, является ли экранирование символа ' 100% защитой от иньекции? Т.е. модифицированный защищеный код будет выглядить слещующим образом: query.append("select id"); query.append("from users"); query.append("where login='"+login.replaceAll("'","\\\\'")+"' and password='"+password.replaceAll("'","\\\\'")+"'"); Такое экранирвование делает невозожным OR иньекцию простейшего вида: login="1" password="' or 'a'='a" Существуют ли другие варианты? Есть идея использовать фукнцию chr() которая по коду символа возвращает сам символ, или не получится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 07:44 |
|
||
|
Java + PostgreSQL: sql injection protection
|
|||
|---|---|---|---|
|
#18+
Забыл сказать, запрос уходит в PosgtreSQL через JDBC драйвер ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 08:00 |
|
||
|
Java + PostgreSQL: sql injection protection
|
|||
|---|---|---|---|
|
#18+
cooluserВсем привет! Есть запрос вида: query.append("select id"); query.append("from users"); query.append("where login='"+login+"' and password='"+password+"'"); Потенциальная уязвимость -- не единственная проблема такого запроса. Вряд ли PostgreSQL будет кэшировать такой запроси и его план. используй что-то типа SELECT id FROM users WHERE login=:1 AND password=:2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 08:26 |
|
||
|
Java + PostgreSQL: sql injection protection
|
|||
|---|---|---|---|
|
#18+
Ладно, это понятно Вопрос в другом, как эту потенциальную уязвимость сделать реальной? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 08:53 |
|
||
|
Java + PostgreSQL: sql injection protection
|
|||
|---|---|---|---|
|
#18+
Отвечаю сам себе, запрос уязвим, поскольку для: login="\\" password=" or 1=1 ; -- " условие в where становится истинным... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 09:18 |
|
||
|
Java + PostgreSQL: sql injection protection
|
|||
|---|---|---|---|
|
#18+
cooluserЛадно, это понятно Вопрос в другом, как эту потенциальную уязвимость сделать реальной? применяй параметризированные запросы и забудь про уязвимости к sql-инъекциям. Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 09:34 |
|
||
|
Java + PostgreSQL: sql injection protection
|
|||
|---|---|---|---|
|
#18+
Можете подсказать алгоритм, по которому работает параметризированный запрос. Я так понимаю, что: 1. Java отправляет в БД параметризированный запрос, БД строит план запроса и возвращает приложению некоторый идентификатор этого запроса 2. Приложение формирует набор значений параметров и подставляет их в запрос данным идентификатором 3. Приложение дает команду выполнить запрос Я прав? Тогда вопрос, что, Джава или БД, в данном случае гарантирует экранирование спец. символов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2006, 06:12 |
|
||
|
Java + PostgreSQL: sql injection protection
|
|||
|---|---|---|---|
|
#18+
cooluser Тогда вопрос, что, Джава или БД, в данном случае гарантирует экранирование спец. символов? В случае Oracle -- БД, как я понимаю. http://injection.rulezz.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2006, 08:04 |
|
||
|
Java + PostgreSQL: sql injection protection
|
|||
|---|---|---|---|
|
#18+
А в случае постгрес? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2006, 11:52 |
|
||
|
Java + PostgreSQL: sql injection protection
|
|||
|---|---|---|---|
|
#18+
Tapac cooluser Тогда вопрос, что, Джава или БД, в данном случае гарантирует экранирование спец. символов? В случае Oracle -- БД, как я понимаю. http://injection.rulezz.ru тынц ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2006, 12:30 |
|
||
|
Java + PostgreSQL: sql injection protection
|
|||
|---|---|---|---|
|
#18+
Насколько я понял setEscapeProsessing() имеет смысл только для "обычного" Statement (не для PreperadStatement), поскольку экранируются вся строка запроса. Поэтому вопрос с тем, кто и как занимается экранированием параметров при использовании PreparedStatement остается открытым :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2006, 07:55 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=716&tid=2148826]: |
0ms |
get settings: |
11ms |
get forum list: |
24ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
69ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 254ms |
| total: | 431ms |

| 0 / 0 |
