• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Oracle

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Теряю веру в жизнь :(

Есть агент, который инсертит данные в базу Oracle.
В запросе 32 параметра. Заполняются через PreparedStatement.
Инсерт происходит через executeBatch();
В итоге получаю ошибку:
java.sql.BatchUpdateException: ORA-12899: value too large for column "PERSONAL_ACCOUNT" (actual: 138, maximum: 30)
Но что самое интересное - данные, которые я пытаюсь вставить в это поле, меньше 30.
Подскажите, как просмотреть SQL-запрос, который образовался после подготовки?
Мне кажется, что проблема именно в нем.

Такой вариант не работает. Ппринтует только указатель
Java:
System.out.println(preparedStatement);
 
Последнее редактирование модератором:

garrick

Lotus Team
26.10.2009
1 351
151
BIT
187
Spring JDBC умеет это. Но у оракловых драйверов есть свои встроенные средства логирования (не пробовал) , только драйвера надо с буквой _g использовать.
  1. Разница в видимом вами количестве символов и реально вставляемым в базу может быть из-за разных кодировок.
  2. Убедитесь, что "вставляете" в ту схему, структуру таблицы которой вы смотрите, не полагайтесь на схему по-умолчанию, укажие её явно.
  3. Ну, и в конце-концов есть же отладка "по-шагам" (в какой-нибудь Java IDE). Посмотрите что у ваc там вставляется в это поле.
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
1. Кодировка приведена к UTF-8 как и сама таблица. Строку в байтах привожу к допустимой длине поля (-2 байта для хеша).
Так что в принципе такой ошибки быть не должно.
2. таблица та.
3. с отладкой проблема :( Пытаюсь решить, но пока никак
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
214
м.б. типа перехвата че-то посмотреть
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
214
или
 

garrick

Lotus Team
26.10.2009
1 351
151
BIT
187
1. Кодировка приведена к UTF-8 как и сама таблица. Строку в байтах привожу к допустимой длине поля (-2 байта для хеша).
Так что в принципе такой ошибки быть не должно.
Код:
SELECT * FROM nls_database_parameters;
что говорит?
Не таблица, а схема. В другой схеме может быть таблица с таким же именем.
3. с отладкой проблема :( Пытаюсь решить, но пока никак
А какие трудности?
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
этот вопрос снят.
Тяжело быть бестолковым. Спутал индексы параметров запроса.

Но появился другой вопрос. Необходимо по индексу определить имя параметра.
Запрос следующего вида
Код:
INSERT INTO table( fld1, fld2, fld3 )
VALUES ( ?, ?, ?)
Пробовал так :
Java:
ParameterMetaData paramMetaData = queryOra.getParameterMetaData();
String paramTypeName = paramMetaData.getParameterTypeName(1);
Но безрезультатно :(
Хотя paramMetaData в принципе есть. Количество параметров получить можно
 
Последнее редактирование модератором:

garrick

Lotus Team
26.10.2009
1 351
151
BIT
187
Не могу придумать зачем это может понадобиться.
Но может быть тогда уже сразу перейти к именованным параметрам?
Код:
ps = conn.prepareStatement("select * from tab where id = :id");
((OraclePreparedStatement)ps).setIntByName("id", 42);
или опять же Spring
 
Последнее редактирование модератором:

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Не могу придумать зачем это может понадобиться.
Но может быть тогда уже сразу перейти к именованным параметрам?
Код:
ps = conn.prepareStatement("select * from tab where id = :id");
((OraclePreparedStatement)ps).setIntByName("id", 42);
или опять же Spring
Могу сказать. Очень удобно, когда запросы пишет кто-то другой.
При обращении по индексу поля должны мапиться в определенном порядке. Иначе будет как у меня :)
Спутал порядок - получил ошибку.
Да я собвственно и не против обращаться по индексу, но мне нужно знать имя параметра
 

garrick

Lotus Team
26.10.2009
1 351
151
BIT
187
Код:
ParameterMetaData
Возвращает только тип параметра, например INTEGER, VARCHAR & etc., но не имя столбца.
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
в общем разобрался.
Пришлось писать парсер и параметры в запросе указывать в виде
Код:
:<имя параметра>
 

garrick

Lotus Team
26.10.2009
1 351
151
BIT
187
А на паркуа? Чем Spring JDBC Template не устроило? Там уже это есть готовое + много ещё чего интересного. К тому же, как я уже указывал выше, в оракловом JDBC драйвере уже есть методы setXXXAtName()*. Например:
Код:
void setStringAtName(String parameterName,
					 String value)
					 throws SQLException
Код:
OraclePreparedStatement ps = conn.prepareStatement("select * from tab where name = :name");
ps.setStringAtName("name", "Bob");

* - XXX - это Int, String, Date & etc.
 
Последнее редактирование модератором:
  • Нравится
Реакции: NickProstoNick
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!