Formular mittels POST senden
lima-city → Forum → Programmiersprachen → C/C++ und D
agent
aufruf
aufrufen
ausgeben
beitrag
checken
connection
control
daten
encoding
formular
image
keep
login
null
pawort
send
set
socket
weiterleitung
-
Wie kann ich mit "egal welche Programmiersprache" ein Formular mittels POST senden? Also ich habe jetzt auf der Seite: http://irgendwas/index.php ein Formular namens "Login" und dort befinden sich zwei Eingabefelder. Das erste ist "Name" und das zweite ist "Pass". Ich m?chte jetzt in Name "javadomi" und in Pass "passwort1" eintragen und es dann durch Submit nochmal auf diese Seite senden: http://irgendwas/index.php
Wie mache ich das? Die Programmiersprache ist egal. Ich bedanke mich f?r eure Antworten im Vorraus.
MfG Dominik
PS: Also ich brauche jetzt ein einfaches Programm, dass ein POST Formular simulieren kann, also wie ich es beschrieben habe mit den Header. Und eventuell dazu noch die HTML Ausgaben in eine Variable speichert.
Das w?re dann alles.
PS2: Oder k?nnte mir mal jemand ein Programm senden, dass einfach nur die HTML Ausgaben in eine Veriable speichert? Den Rest kann ich dann selber machen.
PS3: Kann es mal jemand doch ins C++ Board verschieben?
Beitrag ge?ndert am 18.09.2005 11:18 von javadomi -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Nein, ihr habt mich falsch verstanden. Ich m?chte, dass er es automatisch macht, also nicht, dass er jetzt auf Submit klicken muss, sondern das Programm f?r ihn das Passwort und den Benutzernamen eingibt und dann automatisch auf Submit klickt.
-
Wenn ich dich richtig verstanden habe willst du einen autologin haben?
Das geht soweit ich wei? nur ?ber cookies, wie aber genau wei? ich jetzt grad auch nicht -
Ich m?chte ein Programm schreiben, wo du erstmal dein Benutzernamen und Passwort eingibst und dann alle Informationen des Benutzers angezeigt werden, also die HTML Ausgaben, wenn man sich erfolgreich eingeloggt hat, aber das Passwort muss er nat?rlich selbst eingeben.
Also so:
User gibt bei Optionen Passwort und Namen ein. User klickt auf connect. Falls Passwort falsch, sagt Programm "Passwort falsch", oder richtig, dann zeigt das Programm den ganzen Quelltext an.
MfG Dominik -
Sehr gut @ttobsen! Danke, damit kann ich was anfangen. Stimmt. Ich bin in C++ ziemlich gut Aber mit Winsock habe ich mich noch wenig besch?ftigt. Daher w?re mir ein Beispiel brauchbar. Die Programmiersprache spielt immernoch keine Rolle. Naja, au?er Delphi, weil ich den Compilter nicht habe
MfG Dominik
Edit: Frage gekl?rt! Ich habs alleine hingekriegt Danke f?r eure Antworten und besonders @ttobsen!
Beitrag ge?ndert am 16.09.2005 14:01 von javadomi -
Wer sie will, dann muss ich ihn eine Zip Datei senden
-
Toll, daraus will ich soein Lima-City Tool machen. Man gibt seinen Benutzernamen ein + Passwort und dann gibt das Tool die heute gesammelten Gulden aus, aber wenn ich mich dann von der Login Seite mittels Post anmelde, dann kriege ich im Header 302 Found, statt 200 OK, also ich kann dann keine HTML Ausgaben sehen, wie Gulden, usw, aber ich wei?, dass ich mich richtig eingeloggt habe. Nun wie kann ich machen, dass ich die HTML Ausgaben sehen kann. Das Lima-City Login ist jetzt nur ein Beispiel.
MfG Dominik -
HTTP-Statuscode 302 m?sste eine Weiterleitung (Redirection) sein. Da musst du den String, den dir PostToHost() zur?ckgibt mal analysieren. Irgendwo steht da eine Adresse, an die weitergeleitet werden soll. Die musst du rausfischen und einen neuen HTTP-Request mit der neuen Adresse generieren. Ein Webbrowser macht das automatisch (es f?llt einem deshalb meist gar nicht auf).
MfG
alopex -
Ich kann dir genau sagen, wie der Receive Header ist, den ich bekomme:
HTTP/1.1 302 Found
Date: Fri, 16 Sep 2005 21:58:50 GMT
Server: Apache/1.3.26 (Unix) Debian GNU/Linux PHP/4.4.0
X-Powered-By: PHP/4.4.0
Set-Cookie: PHPSESSID=ffaa1512ee1774b45f122e7c834d74b0; path=/
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Last-Modified: Fri, 16 Sep 2005 21:58:50 GMT
Cache-Control: post-check=0, pre-check=0
location: usercp.php
Content-Encoding: gzip
Vary: Accept-Encoding
Connection: close
Content-Type: text/html
Soll ich jetzt die Datei usercp.php ohne Parameter aufrufen? Da sagt der, dass es ein gesch?tzer Bereich ist, so als ob ich kein Passwort eingegeben h?tte.
MfG Dominik -
Normalerweise musst du jetzt die Adresse aufrufen, die unter "location:" zu finden ist, also "usercp.php". Aber diesen Response sendet Lima nur, wenn du dich falsch einloggst.
Firefox sendet bei einem Formular-Login ?ber /login.php Folgendes:
POST /usercp.php HTTP/1.1
Host: www.lima-city.de
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.7.7) Gecko/20050414 Firefox/1.0.3
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en,de-de;q=0.8,de;q=0.5,en-us;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://www.lima-city.de/login.php
Cookie: PHPSESSID=e780a6c189582c1da649e2c7e75a99f8
Content-Type: application/x-www-form-urlencoded
Content-Length: 64
form_username=test&form_password=test2&securitys=on&action=login
Statt "test" den Usernamen einsetzen und statt "test2" das Passwort. Und nat?rlich Content-Length anpassen. Dann m?sste es klappen. -
Ok, ich habe bei login.php 302 Found erhalten. Ich habe alle Daten so gesendet, wie du es geschrieben hast. Die location dannach ist usercp.php.
Dannach rufe ich usercp.php per POST mit denselben Daten, wie bei login, und 200 OK, aber keine HTML Ausgaben. Der Header von usercp.php sieht dann so aus:
HTTP/1.1 200 OK
Date: Sat, 17 Sep 2005 06:55:54 GMT
Server: Apache/1.3.26 (Unix) Debian GNU/Linux PHP/4.4.0
X-Powered-By: PHP/4.4.0
Set-Cookie: PHPSESSID=afabfb241d93ee217c869ff9eb2bf72c; path=/
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Last-Modified: Sat, 17 Sep 2005 06:55:54 GMT
Cache-Control: post-check=0, pre-check=0
Content-Encoding: gzip
Vary: Accept-Encoding
Connection: close
Content-Type: text/html
Also keine weitere Location. Wenn ich aber usercp.php mit GET, also normal aufrufe, dann sind HTML Ausgaben mit "keine Berechtigung f?r diesen Bereich".
MfG Dominik -
Also keine weitere Location. Wenn ich aber usercp.php mit GET, also normal aufrufe, dann sind HTML Ausgaben mit "keine Berechtigung f?r diesen Bereich".
Es liegt wohl daran, dass das Cookie (in Deinem Falle PHPSESSID=afabfb241d93ee217c869ff9eb2bf72c) nicht zur?ck an den Server sendest.
//edit: Du m?sstest folgende Zeile an Deine HTTP-Anfrage hinzuf?gen:
Set-Cookie: PHPSESSID="DeineSessionID";
Beitrag ge?ndert am 17.09.2005 10:34 von compactdisc -
Es liegt wohl daran, dass das Cookie (in Deinem Falle PHPSESSID=afabfb241d93ee217c869ff9eb2bf72c) nicht zur?ck an den Server sendest.
//edit: Du m?sstest folgende Zeile an Deine HTTP-Anfrage hinzuf?gen:
Set-Cookie: PHPSESSID="DeineSessionID";
Beitrag ge?ndert am 17.09.2005 10:34 von compactdisc
Ja, das habe ich doch nicht ?bersehen. Ich habe es auch so versucht, aber das Resultat war das selbe. Ich versuche nochmal den HTTP Header zu ?ndern.
MfG Dominik -
Hmm, das Cookie k?nnte tats?chlich ein Problem darstellen. Ich habe auch keine Ahnung, ob man das einfach zur?ckschickt, oder ob es vorher irgendwie ver?ndert werden muss.
Vielleicht geht es aber auch ohne. Fr?her hat Lima auch mal Session-IDs in der URL unterst?tzt, d.h. wenn du keine Cookies zur?ckschickst, h?ngt der PHP-Interpreter auf dem Server noch so was ?hnliches wie "?phpsessid=394720347802347" an alle Links in der empfangenen Seite an. Hab ich aber noch nicht getestet.
Du kannst ja auch mal ein bisschen mit dem Firefox und der Live-HTTP-Headers-Erweiterung herumspielen. Dort sieht man sch?n, was der Browser schickt (wenn man z.B. ein Formular anfordert), und was der Server antwortet. Vielleicht hilft das ja.
MfG
alopex -
Hmmm. Bei anderen Seiten klappt es. Ich habe soein un?bersichtliches MFC Programm dazu runtergeladen und wei? nicht mal, wie es funktioniert, au?er, dass es Post Variablen verschicken kann. Evt. verschickt es einen falschen Header, obwohl ich ihn sehen kann. Ich werde mal das Programm genauer analysieren. Oder gibt es Programme, die in Ansi geproggt worden sind, also keine MFC? Wenn ja, dann w?re ich froh, wenn ihr mir Links dazu geben w?rdet. Bis dahin werde ich mich weiter mit diesen Programm qu?len. Danke im vorraus.
sneppa schrieb:
Bin ich im falschen thread gelandet oder was falsches gepostet weil mich niemand beachtet^^
Wahrscheinlich habe ich die Frage zu undeutlich formuliert. Ich m?chte ein Programm programmieren, dass sich f?r dich bei Lima-City einloggt und z.B. eine MessageBox ausgibt, wieviel Gulden du heute verdient hast. Also nur ein Beispiel.
MfG Dominik
PS: Also ich brauche jetzt ein einfaches Programm, dass ein POST Formular simulieren kann, also wie ich es beschrieben habe mit den Header. Und eventuell dazu noch die HTML Ausgaben in eine Variable speichert.
Das w?re dann alles.
PS2: Oder k?nnte mir mal jemand ein Programm senden, dass einfach nur die HTML Ausgaben in eine Veriable speichert? Den Rest kann ich dann selber machen.
Beitrag ge?ndert am 17.09.2005 22:25 von javadomi -
Also jetzt habe ich schon wieder ein Problem mit den einfachen aufrufen der HTML Ausgaben. Ich habe ein Programm geschrieben, dass http://www.lima-city.de/ aufruft und die Ausgaben in index.html speichert, aber das geht nicht, denn der Header ist 302 Found und wenn ich GMX aufrufe, dann sind die HTML Ausgaben ganz normal mit den Header 200 OK. Dasselbe ist auch bei http://www.piranho.com genauso wie der Header von Lima-city:
#include <windows.h>
#include <stdio.h>
class CWinTcpSocket
{
public:
CWinTcpSocket( void );
virtual ~CWinTcpSocket( void );
virtual bool Create( int af = AF_INET );
virtual bool Connect( const char *pszHost, int nPort );
virtual bool Bind( int nLocalPort );
virtual bool Accept( CWinTcpSocket *pSocket );
virtual bool Listen( int nBacklog = SOMAXCONN );
virtual int Send( const void *pData, int nDataLen, int nFlags = 0 );
virtual int SendText( const char *pszText );
virtual int Recv( void *pData, int nDataLen, int nFlags = 0 );
virtual int RecvLine( char *pszBuf, int nLen, bool bEcho = false );
virtual bool Shutdown( int nHow );
virtual bool Close( void );
SOCKET m_hSocket;
private:
static DWORD m_dwRefCount;
};
#define GET_REQUEST_FORMAT "GET %s HTTP/1.0\r\n\r\n"
#define HTTP_END_HEADER_STRING "\r\n\r\n"
#define HTTP_OK_STRING "200 OK"
#define HTTP_OK 200
#define HTTPERR_REQUEST 0x0001
#define HTTPERR_RESPONSE 0x0002
#define HTTPERR_NOTOK 0x0004
#define HTTPERR_HEADERSKIP 0x0008
#define HTTPERR_FILEIO 0x0010
#define HTTPERR_MEMORY 0x0020
#define HTTPERR_DISCONNECTED 0x0040
#define HttpErrorString( x, y ) itoa( y, x, sizeof( x ) )
typedef enum _tagHttpVersion
{
HTTPVER_10 = 0x0100,
HTTPVER_11 = 0x0101
} HttpVersion;
class CHttpDownload : public CWinTcpSocket
{
public:
CHttpDownload( void );
virtual int DownloadFile( const char *pszRemoteFile, const char *pszLocalFile );
protected:
bool MakeRequest( const char *pszRequest );
int GetResponse( char *pszBuf );
bool IsResponseOK( const char *pszResponse );
int SkipHeader( void );
int WriteToFile( const char *pszFile );
};
CHttpDownload *pDownloader = 0;
#define SERVER "www.lima-city.de"
#define FILENAME "/"
#define LOCALNAME "index.html"
int main()
{
pDownloader = new CHttpDownload();
pDownloader->Create();
pDownloader->Connect( SERVER, 80 );
if( pDownloader->DownloadFile( FILENAME, LOCALNAME ) != 0 )
{
MessageBox( NULL, "Unable to download file", NULL, MB_OK );
}
pDownloader->Close();
delete pDownloader;
MessageBox( NULL, "Download complete!", NULL, MB_OK );
return 0;
}
#define RECV_BUFFER_SIZE 1024
CHttpDownload::CHttpDownload( void )
: CWinTcpSocket()
{
}
int CHttpDownload::DownloadFile( const char *pszRemoteFile, const char *pszLocalFile )
{
char *pMemBuf;
if( !MakeRequest( pszRemoteFile ) )
{
return HTTPERR_REQUEST;
}
pMemBuf = new char[ RECV_BUFFER_SIZE ];
if( pMemBuf == 0 )
{
return HTTPERR_MEMORY;
}
if( GetResponse( pMemBuf ) != 0 )
{
return HTTPERR_RESPONSE;
}
if( !IsResponseOK( pMemBuf ) )
{
MessageBox(NULL,pMemBuf,"",NULL);
return HTTPERR_NOTOK;
}
delete[] pMemBuf;
if( SkipHeader() != 0 )
{
return HTTPERR_HEADERSKIP;
}
return WriteToFile( pszLocalFile );
}
bool CHttpDownload::MakeRequest( const char *pszRequest )
{
char *pReqStr = new char[ 32 + strlen( pszRequest ) ];
sprintf( pReqStr, GET_REQUEST_FORMAT, pszRequest );
int nErr = SendText( pReqStr );
delete[] pReqStr;
if( nErr == 0 || nErr == SOCKET_ERROR )
{
return false;
}
else
{
return true;
}
}
int CHttpDownload::GetResponse( char *pszBuf )
{
int nErr = RecvLine( pszBuf, RECV_BUFFER_SIZE );
if( nErr == 0 || nErr == SOCKET_ERROR )
{
return HTTPERR_DISCONNECTED;
}
else
{
return 0;
}
}
bool CHttpDownload::IsResponseOK( const char *pszResponse )
{
if( strstr( pszResponse, HTTP_OK_STRING ) == 0 )
{
return false;
}
else
{
return true;
}
}
int CHttpDownload::SkipHeader( void )
{
int nLen;
bool bFound = false;
char cur = 0, prev_1 = 0, prev_2 = 0, prev_3 = 0;
while( !bFound )
{
nLen = Recv( &cur, 1 );
if( nLen == 0 || nLen == SOCKET_ERROR )
{
return HTTPERR_DISCONNECTED;
}
if( (cur == '\n') && (prev_1 == '\r') && (prev_2 == '\n') && (prev_3 == '\r') )
{
bFound = true;
}
else
{
prev_3 = prev_2;
prev_2 = prev_1;
prev_1 = cur;
}
}
return 0;
}
int CHttpDownload::WriteToFile( const char *pszFile )
{
char *pBuf = new char[ RECV_BUFFER_SIZE ];
FILE *pFile = fopen( pszFile, "w+b" );
int nErr;
if( pFile == 0 )
{
return HTTPERR_FILEIO;
}
for( ;; )
{
nErr = Recv( pBuf, RECV_BUFFER_SIZE );
if( nErr == 0 )
{
break;
}
else if( nErr == SOCKET_ERROR )
{
fclose( pFile );
delete[] pBuf;
return HTTPERR_DISCONNECTED;
}
else
{
fwrite( pBuf, sizeof( char ), nErr, pFile );
}
}
fclose( pFile );
delete[] pBuf;
return 0;
}
DWORD CWinTcpSocket::m_dwRefCount = 0;
CWinTcpSocket::CWinTcpSocket( void )
{
WSADATA wd;
if( ++m_dwRefCount == 1 )
{
::WSAStartup( 0x0101, &wd );
}
}
CWinTcpSocket::~CWinTcpSocket( void )
{
Close();
if( --m_dwRefCount == 0 )
{
::WSACleanup();
}
}
bool CWinTcpSocket::Create( int af )
{
m_hSocket = ::socket( af, SOCK_STREAM, IPPROTO_TCP );
if( m_hSocket == INVALID_SOCKET )
{
#ifdef _DEBUG
::MessageBox( NULL, "Socket creation failed - why?!", NULL, MB_OK | MB_ICONERROR );
#endif
return false;
}
else
{
return true;
}
}
bool CWinTcpSocket::Connect( const char *pszHost, int nPort )
{
unsigned long ulAddr = 0;
hostent *pEnt = ::gethostbyname( pszHost );
SOCKADDR_IN addr;
if( pEnt == 0 )
{
ulAddr = ::inet_addr( pszHost );
if( ulAddr == INADDR_NONE )
{
#ifdef _DEBUG
::MessageBox( NULL, "Invalid address!", NULL, MB_OK | MB_ICONERROR );
#endif
return false;
}
else
{
addr.sin_family = AF_INET;
}
}
else
{
memcpy( &ulAddr, pEnt->h_addr_list[0], sizeof( long ) );
addr.sin_family = pEnt->h_addrtype;
}
addr.sin_addr.s_addr = ulAddr;
addr.sin_port = ::htons( nPort );
memset( addr.sin_zero, 0, sizeof( addr.sin_zero ) );
if( ::connect( m_hSocket, (const sockaddr *)&addr, sizeof( SOCKADDR_IN ) ) == SOCKET_ERROR )
{
#ifdef _DEBUG
char szBuf[64];
sprintf( szBuf, "Unable to connect: %X / %d", ::WSAGetLastError(), ::WSAGetLastError() );
::MessageBox( NULL, szBuf, NULL, MB_OK | MB_ICONERROR );
#endif
return false;
}
else
{
return true;
}
}
bool CWinTcpSocket::Bind( int nLocalPort )
{
SOCKADDR_IN addr;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_family = AF_INET;
addr.sin_port = ::htons( nLocalPort );
memset( addr.sin_zero, 0, sizeof( addr.sin_zero ) );
if( ::bind( m_hSocket, (const sockaddr *)&addr, sizeof( SOCKADDR_IN ) ) == SOCKET_ERROR )
{
return false;
}
else
{
return true;
}
}
bool CWinTcpSocket::Accept( CWinTcpSocket *pSocket )
{
if( pSocket == 0 )
{
return false;
}
SOCKADDR_IN addr;
int len = sizeof( SOCKADDR_IN );
memset( &addr, 0, sizeof( SOCKADDR_IN ) );
pSocket->m_hSocket = ::accept( m_hSocket, (sockaddr*)&addr, &len );
if( pSocket->m_hSocket == INVALID_SOCKET )
{
return false;
}
else
{
return true;
}
}
bool CWinTcpSocket::Listen( int nBackLog )
{
if( ::listen( m_hSocket, nBackLog ) == SOCKET_ERROR )
{
return false;
}
else
{
return true;
}
}
int CWinTcpSocket::Send( const void *pData, int nDataLen, int nFlags )
{
return ::send( m_hSocket, (const char *)pData, nDataLen, nFlags );
}
int CWinTcpSocket::SendText( const char *pszText )
{
return Send( pszText, strlen( pszText ) );
}
int CWinTcpSocket::Recv( void *pData, int nDataLen, int nFlags )
{
return ::recv( m_hSocket, (char *)pData, nDataLen, nFlags );
}
int CWinTcpSocket::RecvLine( char *pszBuf, int nLen, bool bEcho )
{
int nCount = 0;
int nRdLen;
char ch = 0;
while( ch != '\n' && nCount < nLen )
{
nRdLen = Recv( &ch, 1 );
if( nRdLen == 0 || nRdLen == SOCKET_ERROR )
{
nCount = 0;
break;
}
if( ch != '\n' && ch != '\r' )
{
pszBuf[nCount] = ch;
nCount++;
}
if( bEcho )
{
Send( &ch, 1 );
}
}
if( nCount != 0 )
{
pszBuf[nCount] = 0;
}
return nCount ? nCount : nRdLen;
}
bool CWinTcpSocket::Shutdown( int nHow )
{
return ::shutdown( m_hSocket, nHow ) == SOCKET_ERROR ? false : true;
}
bool CWinTcpSocket::Close( void )
{
return ::closesocket( m_hSocket ) == SOCKET_ERROR ? false : true;
}
-
Also jetzt habe ich den Header ?berpr?ft und dort wenn ich "www.lima-city.de" aufrufe ist die Location: "http://..lima-city.de/" Wenn ich das dann so aufrufe, dann wird die Seite nicht gefunden. Wie kann ich das machen?
-
Dasselbe Problem habe ich ebenfalls (PHP).
Wenn ich lima-city oder eine Userseite (bisher nur auf Pyrokar ausprobiert) aufrufe, gelange ich auf die 302-Seite (Found).
Jedoch noch nie auf die gew?nschte Seite.
Des Weiteren steht in der Location die falsche Adresse ...
Interessant ist, dass andere Seiten (z.B. http://www.eggdrop.ch) direkt den HTML-Quellcode senden ...
-
Ja, dasselbe ist bei Piranho.de und alle Userseiten. Vielleicht muss man fragen, wie man einen Browser macht.
MfG Dominik -
ttobsen schrieb:
Aber ich mu? jetzt auch mal ehrlich was sagen:
Finde ich ganz in Ordnung das es Probleme gibt bei senden ?ber Post hier bei Lima.
Irgendwann kommt noch so ein Witzbold auf die Idee uns ein paar Millionen Spambeitr?ge isn Forum zu knallen und dann Merci.
Vielleicht kommt ja bald beim Login ein Image zum eingeben eines zuf?llig generierten Zahlencodes. Dann kannst dein Programm einstecken, weil du sicher keine OCR Software schreibst um den Key zu entziffern.
Gru? Tobi
Naja, wie macht es dann ein Browser? In den Header den ich gesendet und bekommen habe befindet sich nichts desgleichen wie eine zuf?llig generierte Zahl. Nur die Location auf die Errorseite. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage