Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Войти
 
Страницы: 1
RSS
Как пропарсить ответ сервера.
 
Мне надо отловить ошибку SQL-Server`а, которая выводится из ASP. Точней мне надо отличить:ошибки нет, ошибка синтаксиса, ошибка конвертирования строки в число, ошибка доступа(по-народному permisson denied). Чтение с сокета происходит естественно последовательно, его не поseekишь как файл. Для этого мне нужно найти слово в ответе сервера, как это сделать. У меня есть несколько вариантов. Первая идея, это завести фиксированный буфер, сначала считать туда, и там искать, потом снова читать в буфер, а потом читать. Но только если слово окажется на границе, то это не прокатит. Можно также считывать не в начало буфера, а в начало, перед очищением буфера копировать его конец.
Например, надо найти слово microsoft
Буффер, считал в первый раз:
abc fgh jkl tyu iop fgh jkl micro
Буффер, считал во второй раз:
microsoft avb njk ghju iop gjlk f
Ещё есть мысля выделить буфер определённого размера, и по заполнению его, выделить буфер большего размера, скопировать старый буфер в новый, и дописывать в новый, потом снова...
Вот, так. Такой изврат. Вот я и спрашиваю, может есть способы получше, может у кого есть хорошая идея по этому поводу?
Вот например, что я хочу пропарсить, примеры ошибок:
1)
Некий HTML
[Microsoft][ODBC SQL Server Driver][SQL Server]SELECT permission denied on object 'syscomments', database 'hell', owner 'dbo'.
Некий HTML
2)
Некий HTML
Microsoft OLE DB Provider for SQL Server error '80040e14'

Line 1: Incorrect syntax near ','.

/ru/analytics/full-code.asp, line 32
Некий HTML
3)Некий HTML
Microsoft OLE DB Provider for SQL Server error '80040e07'

Error converting data type varchar to int.

/music/bodyarchiv.asp, line 750
Некий HTML.
4) Некий HTML.
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'submenu' to a column of data type int.

/tvline/body.asp, line 17
Некий HTML.

Ситуация осложняется тем, что ответы разные всё время, как видите. Но это уже проблемма #2. Номер один, это хотя бы найти слово нужное в ответе сервера.
Программить думал на gcc.
 
а если просто читать лог IIS?
 
Не-а. Лог читать не годится, я по эту сторону от сервера, то есть к логу доступа нет.
 
Я думаю он хочет по ответам сервера определять тип ошибки. Вообще тут главное созадь хорошую базу, а парсинг дело последнее. Эта фича хорошо реализована в платной версии спайдера, он способен обрабатывать более 200 различных ошибок.
Хочешь быть мудрым? Не желай всего, что видишь; не верь всему, что слышишь; не говори всего, что знаешь; не делай всего, что умеешь, а только то, что полезно.
 
Да, именно это я ихочу, а то надоело забивать вручную
script.asp?id=(SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN ('table1','table2','...',...))
И дык, задачка интересная, и я токо начинаю нормально на С программить. Пока ничего серьёзного не писал, вот так и начинаю...А то зыркать на чужие исходники конечно хорошо, но надо бы и самому писать ручками.
 
Цитата
MishaSt пишет:
Да, именно это я ихочу, а то надоело забивать вручную
script.asp?id=(SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN ('table1','table2','...',...))
И дык, задачка интересная, и я токо начинаю нормально на С программить. Пока ничего серьёзного не писал, вот так и начинаю...А то зыркать на чужие исходники конечно хорошо, но надо бы и самому писать ручками.
Так ты еще и автоматом хочешь их экспуатировать?
Более менее стандартая эксплуатация возможна только в MSSQL, в остальных от запроса зависит.

Посмотри как это в sleuth организовано, там кстати можно и свои скрипты писать.
Хочешь быть мудрым? Не желай всего, что видишь; не верь всему, что слышишь; не говори всего, что знаешь; не делай всего, что умеешь, а только то, что полезно.
 
на gcc не скажу.
вот например в последенем пхпББ эксплойте, похожая задача решалась с помощью пхп и курла.
Хотя конечно масшатаб там небольшой.
http://www.securitylab.ru/43699.html
 
Целесообразнее выделить буфер размера N+max длина подстроки, которую необходимо найти... при этом искать подстроку среди первых N символов буфера и если она не найдена, то копировать остаток в начало буфера и дописывать полученные очередные N символов....
Другой вариант - с одним проходом буфера и без копирования остатка в начало - менее изящен и немногим сложнее для написания...
 
regexp
 
Да. RegExp. Они оказываются есть поумолчанию. Вот, потестил. Хе, просто скопировал я, а по человечески в цикле надо было делать printf и memset.
#include<sys/types.h>
#include<regex.h>
#include<stdio.h>
int main(int argc, char **argv){
 regex_t regext;
 int res;
 regmatch_t regmatch[3];
 char pattern[]="([a-zA-Z0-9\\.]{1,20})@[a-zA-Z0-9\\.]{1,20}";
 memset(&(regmatch[0]),'\0',sizeof(regmatch_t));
 memset(&(regmatch[1]),'\0',sizeof(regmatch_t));
 memset(&(regmatch[2]),'\0',sizeof(regmatch_t));
 memset(&(regmatch[3]),'\0',sizeof(regmatch_t));
 if (regcomp(®ext,pattern,REG_EXTENDED)!=0)
 {
    printf("Error in compilation regex.\n");
    return -1;
 }  
 if  ((res=regexec(®ext,"MishaSt@localhost",(size_t)3,regmatch , 0))==0)
       printf("Yes, this is email!\n");
 else if (res==REG_NOMATCH)
       printf("No, this is not email.\n");
 else
       printf("Somthing error.");
 printf("start: %d\n",regmatch[0].rm_so);
 printf("end: %d\n",regmatch[0].rm_eo);
 
 printf("start: %d\n",regmatch[1].rm_so);
 printf("end: %d\n",regmatch[1].rm_eo);
 
 printf("start: %d\n",regmatch[2].rm_so);
 printf("end: %d\n",regmatch[2].rm_eo);
 
 printf("start: %d\n",regmatch[3].rm_so);
 printf("end: %d\n",regmatch[3].rm_eo);
 
 regfree(®ext);
 return 0;
}

[root@MishaStrij regtest]# ./test
Yes, this is email!
start: 0
end: 17
start: 0
end: 7
start: -1
end: -1
start: 0
end: 0


Токо надо всё-таки базу регэкспов. Как базу предлагаете организоввывать. А то можно впринципе записывать размер регэкспа, код, потом регэксп. Можно сделать индексный файл, и файл данных. Можно в мускуле хранить. Но это всё как-то мне не нравится. Первые два не так легко запись изменить, а c мускулом, дык, мускул надо. Можно ещё придумать как разделитель символ какой нибудь и хранить их через разделитель. А как делаются такие базы в известных, комерческих проекта? Может быть им насрать на то, что запись изменить сложно, у них спец прога есть, или они вообще всё это вкомпилируют внутрь исполняемого файла. Есть идея всё это в xml хранить, но как с ним работать, чтобы удобно было, а то вручную как-то туго, может есть библиотека какая? Дам-с, не представляю, как библиотека регэксповская работает, как не парился понять...Кстати файлы от OpenOffice .sxw как выяснилось это сжатые в архив обычным zip'ом xml-файлы.
Страницы: 1
Читают тему