Просмотр полной версии : Вход на сервер нажатием кнопки в программе. как?
Собственно имеется сервер со скриптом файлового архива. при переходе по адресу http://mydomen.ru/index.php предлагается ввести имя и пароль. имя и пароль в виде хеша хранится в файле .htpasswd который лежит на сервере. как сделать программу на делфи чтобы при нажатии button1 пользователь попадал в файловый архив без ввода имени и пароля?
сам файл index.php выглядит так-
<?php
/**
* Handles all requests by the browser. This is the only file that can be
* accessed directly.
*
* @package AutoIndex
* @author Justin Hagstrom <JustinHagstrom@yahoo.com>
* @version 1.2.1 (January 06, 2007)
*
* @copyright Copyright (C) 2002-2007 Justin Hagstrom
* @license http://www.gnu.org/licenses/gpl.html GNU General Public License (GPL)
*
* @link http://autoindex.sourceforge.net
*/
/*
AutoIndex PHP Script is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
AutoIndex PHP Script is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/**
* OPTIONAL SETTINGS:
*/
//filenames and paths for configuration related files
define('CONFIG_STORED', 'AutoIndex.conf.php');
define('CONFIG_GENERATOR', 'config.php');
//paths for files that will be included
define('PATH_TO_CLASSES', './classes/');
define('PATH_TO_LANGUAGES', './languages/');
define('LANGUAGE_FILE_EXT', '.txt');
//filenames of template files
define('GLOBAL_HEADER', 'global_header.tpl');
define('GLOBAL_FOOTER', 'global_footer.tpl');
define('TABLE_HEADER', 'table_header.tpl');
define('TABLE_FOOTER', 'table_footer.tpl');
define('EACH_FILE', 'each_file.tpl');
/**
* When ENABLE_CACHE is true, the indexes of directories will be stored in
* files in the folder CACHE_STORAGE_DIR. You will notice a speed improvement
* when viewing folders that contain a few thousand files. However, the contents
* of the indexed folders will not be updated until you delete the cache file.
*/
define('ENABLE_CACHE', false);
/**
* This is the folder cache data will be stored in. PHP needs write permission
* in this directory. You can use an absolute path or a relative path, just
* make sure there is a slash at the end.
*/
define('CACHE_STORAGE_DIR', './cache/');
/**
* Format to display dates in.
* @see date()
*/
define('DATE_FORMAT', 'Y-M-d');
/**
* Sets debug mode. Off (false) by default.
*/
define('DEBUG', false);
/* END OPTIONAL SETTINGS */
/** The time this script began to execute. */
define('START_TIME', microtime(true));
/** Level for disabled/banned accounts. */
define('BANNED', -1);
/** Level for Guest users (users who are not logged in). */
define('GUEST', 0);
/** Level for regular user accounts. */
define('USER', 1);
/** Level for moderator ("super user") accounts. */
define('MODERATOR', 2);
/** Level for Admin users. */
define('ADMIN', 3);
/**
* Minimum user level allowed to upload files.
* Use the ADMIN, MODERATOR, USER, GUEST constants.
* GUEST will allow non-logged-in users to upload.
*/
define('LEVEL_TO_UPLOAD', USER);
/** The version of AutoIndex PHP Script (the whole release, not based on individual files). */
define('VERSION', '2.2.4');
/**
* This must be set to true for other included files to run. Setting it to
* false could be used to temporarily disable the script.
*/
define('IN_AUTOINDEX', true);
if (@get_magic_quotes_gpc())
//remove any slashes added by the "magic quotes" setting
{
$_GET = array_map('stripslashes', $_GET);
$_POST = array_map('stripslashes', $_POST);
}
@set_magic_quotes_runtime(0);
$_GET = array_change_key_case($_GET, CASE_LOWER);
$_POST = array_change_key_case($_POST, CASE_LOWER);
if (@ini_get('zlib.output_compression') == '1')
//compensate for compressed output set in php.ini
{
header('Content-Encoding: gzip');
}
/*
* Uncomment the following code to turn on strict XHTML 1.1 compliance in
* users' browsers. If you do this, make sure any changes you make to the
* template do not break XHTML 1.1 compliance.
*/
/*if (isset($_SERVER['HTTP_ACCEPT']) && preg_match('#application/(xhtml\+xml|\*)#i', $_SERVER['HTTP_ACCEPT']))
{
header('Content-Type: application/xhtml+xml');
}*/
session_name('AutoIndex2');
session_start();
/**
* Formats $text within valid XHTML 1.1 tags and doctype.
*
* @param string $text
* @param string $title
* @return string
*/
function simple_display($text, $title = 'Error on Page')
{
return '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>' . $title . '</title>
<style type="text/css" title="AutoIndex Default">
html, body
{
font-family: verdana, lucidia, sans-serif;
font-size: 13px;
background-color: #F0F0F0;
color: #000000;
}
</style>
</head>
<body>
<p>' . $text . '</p></body></html>
<!--
Powered by AutoIndex PHP Script (version ' . VERSION . ')
Copyright (C) 2002-2007 Justin Hagstrom
http://autoindex.sourceforge.net
-->
';
}
/**
* This function is automatically called by PHP when an undefined class is
* called.
*
* A file with the classname followed by .php is included to load the class.
* The class should start with an upper-case letter with each new word also in
* upper-case. The filename must match the class name (including case).
*
* @param string $class The name of the undefined class
*/
function __autoload($class)
{
if ($class != 'self')
{
$file = PATH_TO_CLASSES . $class . '.php';
/** Try to load the class file. */
if (!@include_once($file))
{
die(simple_display('Error including file <em>'
. htmlentities($file) . '</em> - cannot load class.'));
}
}
}
/**
* This is used to report a fatal error that we cannot display with the Display
* class. All Exceptions used in AutoIndex should inherit from this class.
*
* @package AutoIndex
*/
class ExceptionFatal extends Exception {}
try
{
//now we need to include either the stored settings, or the config generator:
if (@is_file(CONFIG_STORED))
{
if (!@is_readable(CONFIG_STORED))
{
throw new ExceptionFatal('Make sure PHP has permission to read the file <em>'
. Url::html_output(CONFIG_STORED) . '</em>');
}
$config = new ConfigData(CONFIG_STORED);
}
else if (@is_file(CONFIG_GENERATOR))
{
/** Include the config generator so a new config file can be created. */
if (!@include_once(CONFIG_GENERATOR))
{
throw new ExceptionFatal('Error including file <em>'
. Url::html_output(CONFIG_GENERATOR) . '</em>');
}
die();
}
else
{
throw new ExceptionFatal('Neither <em>'
. Url::html_output(CONFIG_GENERATOR) . '</em> nor <em>'
. Url::html_output(CONFIG_STORED) . '</em> could be found.');
}
//find and store the user's IP address and hostname:
$ip = (isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : 'N/A');
if (isset($_SESSION['host']))
{
$host = $_SESSION['host'];
}
else
{
$_SESSION['host'] = $host = @gethostbyaddr($ip);
}
//Create a language object:
$words = new Language();
//Create a logging object:
$log = new Logging($config -> __get('log_file'));
foreach ($config as $key => $item)
/* Go through each config setting, and set a constant with each setting's
* name to either true or false depending on if the config setting is
* enabled.
*/
{
$key = strtoupper($key);
if (defined($key))
{
throw new ExceptionFatal(Url::html_output($key)
. ' is already defined in <em>' . basename(Url::html_output($_SERVER['PHP_SELF']))
. '</em>, and should not be in the config file.');
}
define($key, ($item != 'false' && $item != '0'));
}
//make sure all required settings are set in the config file
foreach (array('base_dir', 'icon_path', 'language', 'template',
'log_file', 'description_file', 'user_list', 'download_count',
'hidden_files', 'banned_list', 'show_dir_size', 'use_login_system',
'force_download', 'search_enabled', 'anti_leech', 'entries_per_page',
'must_login_to_download', 'archive', 'days_new', 'thumbnail_height',
'bandwidth_limit', 'md5_show', 'parse_htaccess') as $set)
{
if (!defined(strtoupper($set)))
{
throw new ExceptionFatal('Required setting <em>' . $set
. '</em> is not set in <em>' . Url::html_output(CONFIG_STORED)
. '</em>');
}
}
/* From this point on, we can throw ExceptionDisplay rather than
* Exception since all the configuration is done.
*/
$b_list = $only_these_ips = $banned_ips = array();
if (BANNED_LIST && @is_file($config -> __get('banned_list')))
//make sure the user is not banned
{
$b_list = @file($config -> __get('banned_list'));
if ($b_list === false)
{
throw new ExceptionDisplay('Error reading from banned_list file.');
}
for ($i = 0; $i < count($b_list); $i++)
{
$b_list[$i] = rtrim($b_list[$i], "\r\n");
if (ConfigData::line_is_comment($b_list[$i]))
{
continue;
}
if ($b_list[$i]{0} === ':')
{
$only_these_ips[] = substr($b_list[$i], 1);
}
else
{
$banned_ips[] = $b_list[$i];
}
}
if (count($only_these_ips) > 0)
{
if (!(DirectoryList::match_in_array($ip, $only_these_ips) ||
DirectoryList::match_in_array($host, $only_these_ips)))
{
throw new ExceptionDisplay($words -> __get('the administrator has blocked your ip address or hostname') . '.');
}
}
else if (DirectoryList::match_in_array($ip, $banned_ips) ||
DirectoryList::match_in_array($host, $banned_ips))
{
throw new ExceptionDisplay($words -> __get('the administrator has blocked your ip address or hostname') . '.');
}
}
$show_only_these_files = $hidden_files = array();
if (HIDDEN_FILES && @is_file($config -> __get('hidden_files')))
//store the hidden file list in $hidden_list
{
$hidden_list = @file($config -> __get('hidden_files'));
if ($hidden_list === false)
{
throw new ExceptionDisplay('Error reading from "hidden_files" file.');
}
for ($i = 0; $i < count($hidden_list); $i++)
{
$hidden_list[$i] = rtrim($hidden_list[$i], "\r\n");
if (ConfigData::line_is_comment($hidden_list[$i]))
{
continue;
}
if ($hidden_list[$i]{0} === ':')
{
$show_only_these_files[] = substr($hidden_list[$i], 1);
}
else
{
$hidden_files[] = $hidden_list[$i];
}
}
}
//size of the "chunks" that are read at a time from the file (when $force_download is on)
$speed = (BANDWIDTH_LIMIT ? $config -> __get('bandwidth_limit') : 8);
if (DOWNLOAD_COUNT)
{
if (!@is_file($config -> __get('download_count')))
{
$h = @fopen($config -> __get('download_count'), 'wb');
if ($h === false)
{
throw new ExceptionDisplay('Could not open download count file for writing.'
. ' Make sure PHP has write permission to this file.');
}
fclose($h);
}
$downloads = new ConfigData($config -> __get('download_count'));
}
//create a user object:
$log_login = false;
if (USE_LOGIN_SYSTEM && isset($_POST['username'], $_POST['password'])
&& $_POST['username'] != '' && $_POST['password'] != '')
{
$you = new UserLoggedIn($_POST['username'], sha1($_POST['password']));
$log_login = true;
$_SESSION['password'] = sha1($_POST['password']);
unset($_POST['password']);
$_SESSION['username'] = $_POST['username'];
}
else if (USE_LOGIN_SYSTEM && isset($_SESSION['username'], $_SESSION['password']))
{
$you = new UserLoggedIn($_SESSION['username'], $_SESSION['password']);
}
else
{
$you = new User();
if (MUST_LOGIN_TO_DOWNLOAD && USE_LOGIN_SYSTEM)
{
$str = '<p>You must login to view and download files.</p>'
. '<table border="0" cellpadding="8" cellspacing="0">'
. '<tr class="paragraph"><td class="autoindex_td">'
. $you -> login_box() . '</td></tr></table>';
echo new Display($str);
die();
}
}
//set the logged in user's home directory:
$dir = Item::make_sure_slash((($you -> home_dir == '') ? $config -> __get('base_dir') : $you -> home_dir));
$config -> set('base_dir', $dir);
$subdir = '';
if (isset($_GET['dir']))
{
$dir .= Url::clean_input($_GET['dir']);
$dir = Item::make_sure_slash($dir);
if (!@is_dir($dir))
{
header('HTTP/1.0 404 Not Found');
$_GET['dir'] = ''; //so the "continue" link will work
throw new ExceptionDisplay('The directory <em>'
. Url::html_output($dir) . '</em> does not exist.');
}
$subdir = substr($dir, strlen($config -> __get('base_dir')));
if (isset($_GET['file']) && ($file = $_GET['file']))
{
while (preg_match('#\\\\|/$#', $file))
//remove all slashes from the end of the name
{
$file = substr($file, 0, -1);
}
$file = Url::clean_input($file);
if (!@is_file($dir . $file))
{
header('HTTP/1.0 404 Not Found');
throw new ExceptionDisplay('The file <em>'
. Url::html_output($file) . '</em> does not exist.');
}
if (ANTI_LEECH && !isset($_SESSION['ref']) && (!isset($_SERVER['HTTP_REFERER'])
|| stripos($_SERVER['HTTP_REFERER'], $_SERVER['SERVER_NAME']) === false))
{
$log -> add_entry('Leech Attempt');
$self = $_SERVER['SERVER_NAME'] . Url::html_output($_SERVER['PHP_SELF'])
. '?dir=' . Url::translate_uri($subdir);
throw new ExceptionDisplay('<h3>This PHP Script has an Anti-Leech feature turned on.</h3>'
. ' <p>Make sure you are accessing this file directly from <a class="autoindex_a" href="http://'
. $self . '">http://' . $self . '</a></p>');
}
$log -> add_entry($file);
if (DOWNLOAD_COUNT)
{
$downloads -> add_one($dir . $file);
}
$url = new Url($dir . $file, true);
$url -> download();
}
}
if ($log_login)
{
$log -> add_entry('Successful login (Username: '
. $_SESSION['username'] . ')');
}
if (DESCRIPTION_FILE)
{
$descriptions = new ConfigData((@is_file($config -> __get('description_file')))
? $config -> __get('description_file') : false);
}
if (PARSE_HTACCESS)
{
//parse .htaccess file(s)
new Htaccess($dir, '.htaccess');
}
if (MD5_SHOW && isset($_GET['md5']) && $_GET['md5'] != '')
{
$file = $dir . Url::clean_input($_GET['md5']);
if (!@is_file($file))
{
header('HTTP/1.0 404 Not Found');
throw new ExceptionDisplay('Cannot calculate md5sum: the file <em>'
. Url::html_output($file) . '</em> does not exist.');
}
$size = (int)@filesize($file);
if ($size <= 0 || $size / 1048576 > $config -> __get('md5_show'))
{
throw new ExceptionDisplay('Empty file, or file too big to calculate the'
. 'md5sum of (according to the $md5_show variable).');
}
die(simple_display(md5_file($file), 'md5sum of '
. Url::html_output($file)));
}
if (THUMBNAIL_HEIGHT && isset($_GET['thumbnail']))
{
$fn = Url::clean_input($_GET['thumbnail']);
if ($fn == '')
{
die();
}
echo new Image($fn);
}
if (ARCHIVE && isset($_GET['archive']))
{
$log -> add_entry('Directory archived');
$outfile = Item::get_basename($subdir);
if ($outfile == '' || $outfile == '.')
{
$outfile = 'base_dir';
}
$mime = new MimeType('.tar');
header('Content-Type: ' . $mime -> __toString());
header('Content-Disposition: attachment; filename="'
. $outfile . '.tar"');
@set_time_limit(0);
$list = new DirectoryList($dir);
$tar = new Tar($list, $outfile, strlen($dir));
die();
}
//set the sorting mode:
if (isset($_GET['sort']) && $_GET['sort'] != '')
{
$_SESSION['sort'] = $_GET['sort'];
}
else if (!isset($_SESSION['sort']))
{
$_SESSION['sort'] = 'filename'; //default sort mode
}
//set the sorting order:
if (isset($_GET['sort_mode']) && ($_GET['sort_mode'] == 'a' || $_GET['sort_mode'] == 'd'))
{
$_SESSION['sort_mode'] = $_GET['sort_mode'];
}
else if (!isset($_SESSION['sort_mode']))
{
$_SESSION['sort_mode'] = 'a'; //default sort order
}
if (count($_FILES) > 0)
//deal with any request to upload files:
{
$upload = new Upload($you); //the constructor checks if you have permission to upload
$upload -> do_upload();
}
if (USE_LOGIN_SYSTEM)
{
if (isset($_GET['logout']) && $_GET['logout'] == 'true')
{
$you -> logout();
}
else if (isset($_GET['action']) && $_GET['action'] != '')
{
$admin = new Admin($you); //the constructor checks if you really are an admin
$admin -> action($_GET['action']);
}
}
if (ANTI_LEECH && !isset($_SESSION['ref']))
{
$_SESSION['ref'] = true;
}
$search_log = '';
if (SEARCH_ENABLED && isset($_GET['search'], $_GET['search_mode'])
&& $_GET['search'] != '' && $_GET['search_mode'] != '')
{
$s = Url::clean_input($_GET['search']);
$dir_list = new Search($s, $dir, $_GET['search_mode']);
$search_log = "Search: $s";
}
else if (ENABLE_CACHE)
{
$cache = CACHE_STORAGE_DIR . strtr($dir, '\/:', '---'); //path to cache file
if (@is_file($cache))
{
$contents = @file_get_contents($cache);
if ($contents === false)
{
throw new ExceptionDisplay('Cannot open cache file for reading. Make sure PHP has read permission for these files.');
}
$dir_list = unserialize($contents);
}
else
{
$dir_list = new DirectoryListDetailed($dir);
if (!@is_dir(CACHE_STORAGE_DIR))
{
if (!Admin::mkdir_recursive(CACHE_STORAGE_DIR))
//Attempt to create the directory. If it fails, tell the user to manually make the folder.
{
throw new ExceptionDisplay('Please create the directory <em>'
. Url::html_output(CACHE_STORAGE_DIR)
. '</em> so cache files can be written.');
}
}
$h = @fopen($cache, 'wb');
if ($h === false)
{
throw new ExceptionDisplay('Cannot write to cache file. Make sure PHP has write permission in the cache directory.');
}
fwrite($h, serialize($dir_list));
fclose($h);
}
}
else
{
$page = ((ENTRIES_PER_PAGE && isset($_GET['page'])) ? (int)$_GET['page'] : 1);
$dir_list = new DirectoryListDetailed($dir, $page);
$max_page = (ENTRIES_PER_PAGE ? (ceil($dir_list -> total_items() / $config -> __get('entries_per_page'))) : 1);
}
$log -> add_entry($search_log);
$str = $dir_list -> __toString();
echo new Display($str);
}
catch (ExceptionDisplay $e)
{
echo $e;
}
catch (Exception $e)
{
echo simple_display($e -> getMessage());
}
?>
Читай http://forum.sysman.ru/index.php?showtopic=12171
Примерно в середине есть:
{
Simple HTTP POST.
Простой пример, показывающий использования метода POST.
©oded by BuH@LicH at sysman.ru 2007
}
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Winsock, StdCtrls; // не забудьте добавить Winsock
type
TMyThread = class(TThread) // поток из которого будем вызывать POST запрос
private
{ Private declarations }
protected
procedure Execute; override;
public
Host, URI, Login, Password : String;
end;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Edit2: TEdit;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
wsData: TWSAData;
implementation
{$R *.dfm}
function Resolve(host: string):string;// Функция преобразования HOST --> IP
var
IP:string;
hostEnt : PHostEnt;
hostName : array [0..255] of char;
addr : PChar;
begin
result:=host;
try
strpcopy(hostname, host);
hostEnt := gethostbyname(hostName);
if Assigned(hostEnt) and Assigned(hostEnt^.h_addr_list) then
begin
addr:=hostEnt^.h_addr_list^;
IP:=Format('%d.%d.%d.%d', [byte(addr[0]), byte(addr[1]), byte(addr[2]), byte(addr[3])]);
end;
result:=ip;
except
end;
end;
function SendString(Socket: TSocket; Str: string):boolean;// Отправка данных
var
Buffer: Array [1..1024] of Byte; {буфер для отправки данных}
i: Integer;
begin
FillChar(Buffer,SizeOf(Buffer),0); {заполняем буфер нулями}
if Length(Str)>1000 then Exit; {если длинна посылаемых данных больше 1000, выходим}
for i:=1 to Length(Str) do Buffer[i]:=Ord(Str[i]); {заполняем буфер}
{
function Send(S:TSocket;var Buf;Len,Flags:Integer):Integer;
Параметры:
S: задаёт сокет, который используется для передачи данных.
Buf: задаёт буфер, в котором хранятся данные для отправки.
Len: размер этих данных в байтах.
Flags задаёт дополнительные опции, в большинстве случаев равен 0.
}
i:=WinSock.send(Socket, buffer, sizeof(buffer), 0);
if i>0 then result:=true;
end;
function ReadString(Socket: TSocket): string;// Чтение данных из сокета
var
Buffer: Array [1..100] of Byte; {буфер для приёма данных}
i,RecB: Integer;
BufStr: String; {строка в которую сохраняется принятый буфер}
begin
BufStr := '';
{
function Recv(S:TSocket;var Buf;Len,Flags:Integer):Integer;
Параметры:
S: задаёт сокет, из входного буфера которого будут извлекаться данные.
Buf: буфер, в который эти данные будут копироваться.
Len: размер этого буфера.
Flags задаёт дополнительные опции, в большинстве случаев равен 0.
}
RecB:=Recv(Socket, Buffer, SizeOf(Buffer), 0);
for i:=1 to RecB do
BufStr := BufStr + Chr(buffer[i]);
try
Result := BufStr;
except
Result := '';
end;
end;
procedure TMyThread.Execute;
var
I: integer;
Sock: TSocket;
Request: string;
Answer: string;
_Host: string;
adr: sockaddr_in; {sockaddr - это общее представление адреса для сокетов. Для семейства AF_INET используется структура sockaddr_in.}
Data: string;
const
CRLF=#13#10;
begin
_host :=resolve(host);
{заполнение структуры sockaddr_in}
adr.sin_addr.s_addr :=inet_addr(pchar(_host)); // ip адрес
adr.sin_family :=AF_INET; // семейство протоколов
adr.sin_port :=htons(80); // порт
{
Function Socket(AF,SocketType,Protocol:Integer):TSocket;
Параметры:
AF задаёт семейство адресов (address family). Этот параметр определяет, какой способ адресации (т.е., по сути дела, какой стек протоколов) будет использоваться для данного сокета. При использовании TCP/IP этот параметр должен быть равен AF_Inet, для других стеков также есть соответствующие константы, которые можно посмотреть в файле WinSock.pas.
SocketType указывает на тип сокета и может принимать одно из двух значений: Sock_Stream (сокет используется для потоковых протоколов) и Sock_Dgram (сокет используется для дейтаграммных протоколов).
Protocol позволяет указать, какой именно протокол будет использоваться сокетом. Этот параметр можно оставить равным нулю - тогда будет выбран протокол по умолчанию, отвечающий заданным первыми двумя параметрами.
}
Sock:=Socket(AF_INET, SOCK_STREAM, 0);
if Sock =-1 then Exit;
if Connect(sock,adr,sizeof(adr))<>0 then
begin
CloseSocket(Sock);
exit;
end;
{Заполняем строку данных, которую мы будем посылать в запросе}
Data:='referer=&t=&f=&st=&UserName='+Login+'&PassWord='+Password+'&CookieDate=1';
{
Обратите внимание, что каждая строка заканчивается на CRLF - символ возврата каретки и перехода на новую строку.
}
Request:= 'POST '+URI+' HTTP/1.1'+CRLF+
'Host: '+Host+CRLF+
'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.2)'+CRLF+
'Accept: */*'+CRLF+
'Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3'+CRLF+
'Accept-Encoding: gzip,deflate'+CRLF+
'Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7'+CRLF+
'Content-Length: '+IntToStr(Length(Data))+CRLF+
'Content-Type: application/x-www-form-urlencoded'+CRLF+
'Connection: Close'+CRLF+CRLF+
Data;
SendString(Sock, Request);
{Считываем в переменную Answer ответ сервера}
for i:=0 to 5 do Answer:=Answer + ReadString(Sock);
IF Pos('302 Found', Answer) > 0 Then Form1.Label1.Caption := 'Good!'
Else Form1.Label1.Caption := 'Bad :(';
CloseSocket(Sock);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
{Функция WSACleanup завершает работу с библиотекой сокетов.
Не имеет параметров и возвращает ноль в случае удачного выполнения}
WSACleanup;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
{
function WSAStartup(wVersionRequired:Word;var WSData:TWSAData): Integer;
Функция для инициализации библиотеки сокетов. Её необходимо вызвать до использования любой другой функции этой библиотеки.
Параметры:
wVersionRequired задаёт требуемую версию библиотеки сокетов. Допустимы версии 1.0 ($0001), 1.1 ($0101), 2.0 ($0002) и 2.2 ($0202).
WSData является выходным параметром, т.е. значение, которое имела переменная до вызова функции, игнорируется,
а имеет смысл только то значение, которая эта переменная получит после вызова функции. Через этот параметр передаётся
дополнительная информация о библиотеке сокетов. В большинстве случаев эта информация не представляет никакого интереса,
поэтому её можно игнорировать.
В случае удачного завершения функция возвращает 0}
WSAStartup($101,wsData);
{Возможно, в других исходниках вы встретите такое написание: wsaStartup(MAKEWORD(1,1), wsData);}
end;
procedure TForm1.Button1Click(Sender: TObject);
var
host, URI, login, password: string;
MyThread : TMyThread;
begin
Label1.Caption:='';
Login := Edit1.Text;
Password := Edit2.Text;
Host := 'sysman.ru';
URI := '/index.php?act=Login&CODE=01';
{Создаём поток с параметрами Host, URI, Login, Password.}
MyThread := TMyThread.Create(True);
MyThread.Host := Host;
MyThread.URI := URI;
MyThread.Login := Login;
MyThread.Password := Password;
MyThread.Resume;
End;
end.
можно подробнее объяснить куда вводить адрес, логин и пароль. ничего не получается. при нажатии button1 ничего не происходит.
Ты код хоть читал?
Login := Edit1.Text;
Password := Edit2.Text;
читал я код. ввожу туда и нажимаю button1 и никакой реакции.
Собственно имеется сервер со скриптом файлового архива. при переходе по адресу http://mydomen.ru/index.php предлагается ввести имя и пароль. имя и пароль в виде хеша хранится в файле .htpasswd который лежит на сервере. как сделать программу на делфи чтобы при нажатии button1 пользователь попадал в файловый архив без ввода имени и пароля?
Я так понимаю, что авторизация должна прохадить на форме и по клику на нужную страницу файлового архива?Если так то из того, что дал Kaimi:
procedure TForm1.Button1Click(Sender: TObject);
var
host, URI, login, password: string;
MyThread : TMyThread;
begin
Label1.Caption:='';
Login := Edit1.Text; //Можешь так и оставить
Password := Edit2.Text; //Можешь так и оставить
Host := 'sysman.ru'; //ну сюда понятное дело свой домен
URI := '/index.php?act=Login&CODE=01';
{Создаём поток с параметрами Host, URI, Login, Password.}
MyThread := TMyThread.Create(True);
MyThread.Host := Host;
MyThread.URI := URI;
MyThread.Login := Login;
MyThread.Password := Password;
MyThread.Resume;
End;
Но вместо
URI := '/index.php?act=Login&CODE=01';
Попробуй
URI := '/index.php?act='+Login+'&'+'Password';
Обращая внимание на то какое значение должно передоваться скрипту index.php (в данном случае через act)
P.S могу ошибаться так как php я не знаю:)
мне немного не то надо. надо чтобы при нажатии button1 открывалось новое окно браузера, в котором автоматически вводилось имя и пароль и пользователь попадал в файловый архив как будто ввел логин и пароль. но логин и пароль один на всех поэтому пользователь не должен знать ни логин ни пароль.
Исследования показали, что GSM™-у нужно следующее по нажатию кнопки:
1. Запуск браузера (WinExec)
2. Ждать, пока не появится окно с запросом пароля (FindWindow(Ex))
3. Послать в поля логина и пароля соответствующие данные (SendMessage)
4. Ну и нажать кнопку (то же SendMessage)
Может кто нибудь поможет?
De-visible
28.03.2008, 11:39
Post данные можно передать методом get (В этом случае! -код работает!)основываясь на этом вот:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,ShellApi;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
ShellExecute(handle, 'open', 'http://win.mail.ru/cgi-bin/auth?Mpopl=1279619797&Login=Lamer007&Domain=mail.ru&Password=qwerty', nil, nil, SW_SHOW);
end;
end.
Я показал пример авторизации на mail.ru, твоего сайта я не знаю!
Просниффери и поменяй ссылку на свою:)
Нда... было б все так просто...
De-visible
28.03.2008, 11:54
Да е-мое!
Ты можешь ссылку дать!
Или в подробностях нормально объяснить! - Я НЕ ТЕЛЕПАТ!
ССЫЛКУ В СТУДИЮ!
Я просто точно не могу понять что тебе нужно!!!
надо чтобы при нажатии button1 открывалось новое окно браузера, в котором автоматически вводилось имя и пароль и пользователь попадал в файловый архив как будто ввел логин и пароль.
Я вроде так и сделал?!
Видимо, там авторизация по типу .htpasswd сделана. Похоже, тока через SendMessage, как я уже описывал.
nc.STRIEM
28.03.2008, 12:20
Post данные можно передать методом get
да???? и давно?
передай ка файл мегабайт эдак 500 гетом)
>>топикстартер
почитай про http протокол. сразу все поймеш
De-visible
28.03.2008, 13:46
да???? и давно?
передай ка файл мегабайт эдак 500 гетом)
Я отвечал на вопрос Gsm™, и не говорил, что post данные всегда можно передавать методом get!(Тем более я бы не сказал что методом Get можно передавать файлы[уж еще таких размеров!!!!]:))
В данном случае можно!
Код рабочий:)
---------------------------------------
По теме:
--
-если вылазиет окно авторизации-
Функция SendMessage
Описание:
function SendMessage(Wnd: HWnd; Msg, wParam: Word; lParam: Longint): Longint;
Посылает сообщение оконной функции указанного окна. Возвpат из функции осуществляется только после обpаботки сообщения.
Параметры:
Wnd: Окно, пpинимающее сообщение или $FFFF для посылки всем всплывающим окнам в системе.
Msg: Тип сообщения.
wParam: дополнительная инфоpмация о сообщении.
lParam: дополнительная инфоpмация о сообщении.
Возвpащаемое значение:
Значение, возвpащенное пpинимающей оконной функцией.
-----
Похоже, тока через SendMessage, как я уже описывал.
Согласен с krypt3r это выход:)!!
Подскажите хоть как сделать вход на форум (вобла) нажатием кнопки Button1.
P.S логин и пароль можно записать в Edit1 и Edit2 и поставить свойство Visible в значение false
Gsm™, ты как хочешь, послать данные постом и затем обрабатывать или так же, как и раньше - чтобы открывался браузер и вводились верные данные?
De-visible
22.04.2008, 16:39
http://www.delphisources.ru/pages/faq/base/win_msgs_introduction.html
Блин граждане до сих пор актуально. готов заплатить за готовый код.
disasembler
10.06.2008, 12:36
надо постом, а дальше сохранять куки и через IShellBrowser (то есть через Shdocwv) передать эти самые куки, но он поддерживает только ИЕ, для других браузеров можно через графический анализатор это делать - тоесть смотреть в окне сколько элементов, если смахивает на окно логина, но без SendMessage не обойтись:)
De-visible
26.10.2008, 00:53
не плачь....
--------
Ошибся разделом...
предлагаю выход методом API FindWindow
клава сломалась на компе с компилятором, такшто действуйте
не плачь....
--------
Ошибся разделом...
мне теперь новую тему создать в нужном разделе? может ты напишешь код? если что пиши в пм.
если пишешь на delphi - тебе нужен Embedded Web Browser отсюда http://www.bsalsa.com/ и многое станет проще
да и еще - самое просте когда не знаешь как поступить чтобы что-то заполнить, юзай снифер. Заходи "руками" на страницу и потом в проге отправляй такие же заголовки как и браузер. Вот и весь секрет.
в конечном итоге программа передает вот такую ссылку-
http://xxx.com/support/cardauth.php?a=588891577090AAC1FD449333C5785402064 5489684870EDA6757C1AB255E0EBAC2735E3B0AE8C1B319202 C95BF5821EDEE4321DDFC5DF9A1A14BCA2461D6F984420A122 54C3D838B5DA71E08EDEB27020A850D8629ADA74AFA5E5CAB9 B456B31F812226C62C84FBE8DDD5AD69C0205C763B3CACFE9E 10FE088BA&b=3CE682A6&c=C7E08B21&d=E13A378C&e=F8B12479
что там такое мне не понятно. может быть это и есть зашифрованные логин\пароль?
сейчас посмотрим время жизни этой ссылки.
дай урл в личку и логин с паролем. помогу чем смогу.
данные могут (шифроваться/сжиматься) яваскриптом перед постом
дай урл в личку и логин с паролем. помогу чем смогу.
данные могут (шифроваться/сжиматься) яваскриптом перед постом
сейчас погоди что то он работать перестал. щас починю скину
сдохла та ссылка. сейчас программа сгенерировала новую. не пойму как это происходит... видимо все намного сложнее...
понимаешь тут мало телепатов, в топике сказали даже более чем нужно для решения твоей проблемы.
понимаешь тут мало телепатов, в топике сказали даже более чем нужно для решения твоей проблемы.
да понимаю. кинул тебе в личку что просил.
FractalizeR
07.11.2008, 19:57
Блин граждане до сих пор актуально. готов заплатить за готовый код.
Ну... если вы готовы заплатить за готовый код, почему бы не обратиться к автору оригинала, т.е. ко мне? А то все реверсим, да реверсим.... :)
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot