1) Вопрос. Это мой тестовый скрипт, для проверки работы передачи данных по http методом post размер буфера всего 5 байт, для простоты теста. Код пишется для ОС Linux . Компилятор NASM Код (Text): ;Секция не инициалезированных данных BSS ;Буфер для приёма параметров section .bss http_login_param_buf resb 5 ; зарезервировать память в 5 байт для пароля и логина переданных через форму. (команда инициализирует память заполненную нулями) section .date global _start _start: ;Системный вызов #3 read: mov eax, 3 ; syscall read mov ebx, 2 ; STD_IN mov ecx, http_login_param_buf ; адрес буфера для приёма параметров mov edx, 5 ; длинна записываемых данных в байтах int 0x80 ; Обратится к ядру для возбуждения системного вызова cmp eax,0 jg buf jmp exit buf: mov eax, 4 ; syscall write mov ebx, 1 ; STD_OUT mov ecx, http_login_param_buf ; адрес полученных данных mov edx, 5 ; длинна полученных данных в байтах int 0x80 ; Обратится к ядру для возбуждения системного вызова exit: ; test_post.asm Закончил обработку данных ;Системный вызов #1 exit: mov eax, 1 ; syscall exit xor ebx,ebx ; поместить 0 в ebx int 0x80 ; Обратится к ядру для возбуждения системного вызова Так вот ).. как сделать так, чтоб при передаче данных скрипту методом POST из html формы. Скрипт принимал не больше 5 байт? И чтоб не было вот такого: 0.o [stellaco@localhost]$ nasm -f elf test_post.asm [stellaco@localhost]$ ld test_post.o [stellaco@localhost]$ ./a.out aaaaa6789A aaaaa[stellaco@localhost]$ 6789A bash: 6789A: command not found [stellaco@localhost]$ Эта тема в разделе # WASM.NETWORKS Так как остальные вопросы будут связаны непосредственно с сетью.
Несколько вариантов 1) Пусть программа запишет эти данные в файл, а не на stdout 2) Проверяй - если переданный байт = 0Ah (перевод строки), то выкусывай его или выводи текст "/x0A" вместо него.
Вот попробовал такой кодик. Код (Text): ;Секция не инициалезированных данных BSS section .bss http_login_param_buf resb 5 ; зарезервировать память в 5 байт fd resd 1 section .date path_file db 'test.txt',0 ; имя создаваемого файла global _start _start: ;Системный вызов #3 read: mov eax, 3 ; syscall read mov ebx, 0 ; STD_IN mov ecx, http_login_param_buf ; адрес буфера для приёма параметров mov edx, 5 ; длинна записываемых данных в байтах int 0x80 ; Обратится к ядру для возбуждения системного вызова ;системный вызов open mov eax,5 ; syscall open mov ebx,path_file mov ecx,0001002 mov edx,7666 int 0x80 mov [fd],eax ; записываем в fd номер возвращённого дескриптора функции open ; write mov eax,4 mov ebx,[fd] ; сохраняем в дескриптор открытого файла mov ecx,http_login_param_buf mov edx,5 int 0x80 mov eax, 1 ; syscall exit xor ebx,ebx ; поместить 0 в ebx int 0x80 ; Обратится к ядру для возбуждения системного вызова Вот что получается [stellaco@localhost]$ ./a.out 123456789_10 [stellaco@localhost]$ 6789_10 bash: 6789_10: command not found [stellaco@localhost]$ Запускаю a.out и консоль переходит на следующую строку, ждёт ввода данных. Ввожу 123456789_10 Первые 5 байт записываются в созданный файл test.txt А остальные 6789_10 передаются, как команда bash Отсюда вытекает следующее bash: 6789_10: command not found Хотя в такой программе можно было бы вместо 123456789_10 передать к примеру 12345cd /var/www . Тогда бы первые пять байт снова записались в файл, а все последующие символы, bash воспринял бы, как команду cd /var/www . И перешёл бы в каталог /var/www [stellaco@localhost]$ ./a.out 12345cd /var/www [stellaco@localhost]$ cd /var/www /* прописалось само, после завершения записи в test.txt */ [stellaco@localhost www]$ ls -l итого 24 drwxrwxrwx 2 root root 4096 2008-12-15 07:24 cgi-bin/ drwxrwxrwx 3 root root 4096 2008-12-10 16:09 error/ drwxrwxrwx 2 root root 4096 2008-07-27 18:55 fcgi-bin/ drwxrwxrwx 3 root root 4096 2008-12-10 16:09 html/ drwxrwxrwx 3 root root 4096 2008-12-10 16:09 icons/ drwxrwxrwx 2 root root 4096 2008-12-10 16:09 perl/ Я как понимаю, это глюк bash связан с тем, как он оперирует с данными argv программы и завершением рабты проги данной консолью. (перевод строки...), вот и получается подобная хрень).. Поправьте если я ошибаюсь. А вообще, это и не важно в данном случаи) так как , мне интересно на данный момент то, как принимать данные присланные пользователем из html формы, cgi скрипту. Вот и интересно, если человек решит послать мне данные размером 600 байт, а у меня выделенно только 500 байт для принятых байтов. И я считываю данные через системный вызов read с ограничением в 500 символов. то будет ли возможен взлом? И ещё)..я буквально всю ночь просидел, пытаясь понять...как из Apache читать присланные данные с помощью ассембера! Говорят что подобные сервера, всё передают через стандартный ввод.и вывод... и если программе надо получить какието данные, то следует всеголишь считать их из стандартного ввода.... (что я и делал).... Так вот..ничего не получилось (((.. и сейчас опять не получается ничего принимать. Если кто может, пожалуйчта, разъясните мне...как это работает?!?!?!
Меня устраивают UNIX системы. И мне нравится контролировать каждый байт в приложении, такого в винде не добьешься. Вот тут ещё два вопроса, которые мне нужно решить http://www.wasm.ru/forum/viewtopic.php?id=30165 . Если кто может, помогите. В той теме есть вопрос, о подключении в БД , если кто знает как это сделать то прошу поделиться мудростью. Ну а если, кто знает, как делать свою базу данных (именно базу данных, а не структуру... наподобии есть клиент, есть адрес и тд..), то буду благодарен если просветите меня и в этом, или посоветуете качественные книги (которых я кстати, по этой теме не нашёл)
stellaco Фу, понял. У тебя получается вот что: - Ты пишешь текст, нажимаешь Enter и происходит следующее. - твоя программа читает из потока stdin 5 байтов и пишет их файл. - все остальные байты, оставшиеся в потоке ввода после выхода программы, достаются родительскому процессу (bash'у) Сделай вот что: - попробуй перед выходом из программы очистить поток stdin (по-моему функция flush, не помню), чтобы в нем не осталось непрочитанных байтов. - или прочитай все байты, пока не достигнешь "конца файла".
stellaco, если у тебя так много вопросов, сходи на Linux-сайт по программированию, на сайте, посвещенному Windows'у, тебе вряд ли ответят. P.S. Если все-таки хочешь на wasm'e полязить, попроси модераторов перенаправить эту тему на форум "Beginners".
О дааа!!! Этож только в юниксах можно... К базе можно подключиться например по TCP/IP. MSoft Ну, если не ошибаюсь WASM - Windows Assembly А вопрос лучше перенести в wasm.unix
stellaco Обычно читают в цикле пока не встретится допустим \n (или \r\n) . Например, читаешь 5 байт, остальные в цикле отбрасываешь пока не конец. Вот и все. Это один из вариантов. AndreyMust19 Если вы не знаете, это не значит что надо МНОГО ФЛУДИТЬ на этом форуме. И не надо говорить за всех! Каждый сам подумать может. Лучше молчите.
AndreyMust19 Точно, STD_IN записывает данные прежде всего в буфер, а затем уже в файл . Как-то я сразу не додумался. Не подскажите, как можно подобное сделать не прибегая к СИ ?? Хорошо, попрошу модераторов перенести тему в "Beginners"
Просто на UNIX заходят намного реже, чем на другие форумы. Если нужен ответ на UNIX-тему, то ответ лучше искать на UNIX-сайтах.
TermoSINteZ Спасибо, сегодня попробую этот вариант. K10 Подключиться то наверно можно, но мне хотелось бы посылать в неё sql запросы и получать данные. Былоб замечательно, еслиб мне показли на примере, как это сделать.
/offtop нда как флудить на тему win vs nix так большинство голосов обычно за nix и аргументов накидывают длинные списки , а как подсказать по программированию - так "поставь win" да "иди на nix форум"... А тема cgi на асме под nix имхо интересная и полезная, с учётом того, что куча серверов под nix. Я бы тоже с удовольствием почитал внятные ответы на вопросы ТС, просто чтобы что-то знать когда наконец ход дойдёт в этом разобраться
K10 вот блин. а я всегда читал ватком асм.. а он, собака, только что под армовые мобилы бинари не лепит. почему-бы?..