php - nakładka na logowanie do poczty

0

Witajcie.
Ostatnio zachciało mi się stworzenia nakładki na logowanie do webmaila.
Nakodziłem takie coś:

<?php
ob_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>

<head>
  <title>Poczta - krolnet.pl Programowanie, webmastering, bazy danych. Artykuły, gotowce, tutoriale</title>
  <link rel="stylesheet" href="http://www.krolnet.pl/errors/style.css" type="text/css" />
  <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
</head>

<body>
<div id="cialo">
<img src="logo.jpg" alt="Logo krolnet.pl Programowanie, webmastering, bazy danych. Delphi, Logo, VB .Net">
<h1>Poczta krolnet.pl</h1>
<div id="tresc">

<?php
function formularz() {
print '<div style="padding: 15px; width:260px;">
<table border="0" width="100%">
<tr>
<td>
<form action="index.php" method="post">
	Login:<br />
	<input type="text" name="login_username" /><br />
	Hasło: <br />
	<input type="password" name="secretkey" /><br />
	<input type="hidden" name="js_autodetect_results" value="SMPREF_JS_OFF" />
	<input type="hidden" name="just_logged_in" value="1" />
	<input type="submit" value="Logowanie" name="wyslij"/>
</form>
</td>
<td>
<img src="key.png" alt="Poczta">
</td>
</tr>
</table>';
}

if (isset($_POST['wyslij'])) {
$fp = fsockopen("s19.vdl.pl", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {


$host = 's19.vdl.pl';
$path = '/squirrelmail/src/redirect.php';
$post = 'login_username='.$_POST['login_username'].'&secretkey='.$_POST['secretkey'].'&js_autodetect_results=SMPREF_JS_OFF&just_logged_in=1';

$pack  = "POST $path HTTP/1.0\r\n";
$pack .= "Host: $host\r\n";
$pack .= "User-Agent: Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n";
$pack .= "Referer: $host\r\n";
$pack .= "Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7\r\n";
$pack .= "Content-Type: application/x-www-form-urlencoded\r\n";
$pack .= "Content-length: " . strlen($post) . "\r\n\r\n";
$pack .= "$post\r\n";
$pack .= "Connection: Keep-Alive\r\n\r\n";

    fwrite($fp, $pack);
    while (!feof($fp)) {
      $strona .= fgets($fp, 128);
    }
    print $strona;
    fclose($fp);
    
if (strstr($strona, 'Musisz by')) {
  print '<span style="color: Red;">Wystąpił błąd sesji.</span>';
  formularz();
} else 
if (strstr($strona, 'Nieznany u')) {
  print '<span style="color: Red;">Wprowadzone dane są błędne.</span>';
  formularz();
} else {
///header('s19.vdl.pl');
//header('');
header('Host: s19.vdl.pl');
header('POST /squirrelmail/src/redirect.php HTTP/1.1');
//header('User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4');
//header('Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5');
header('Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7');
header('Keep-Alive: 300');
header('Connection: keep-alive');
//header('Referer: http://www.krolnet.pl/');
header('Content-Type: application/x-www-form-urlencoded\r\n');
header('Content-Length: '.strlen($post).'\r\n');
header($post);
header('Location: http://s19.vdl.pl/squirrelmail/src/redirect.php');
}
}
} else {
formularz();
}
?>
</div>

<div style="text-align: right; font-size: 8pt; font-style: Italic;">&copy Copyright 2008 by <a href="http://www.krolnet.pl">krolnet.pl</a></div>
</div>
</div>
</body>

</html>
<?php
ob_flush();
?>

I teraz w czym problem? W przekierowaniu. Skrypt rozpoznaje błędy. Złe dane, sesja itd.
Ale ma problem z przekierowaniem. Jeżeli dane są poprawne skrypt wywołuje adres:
http://s19.vdl.pl/squirrelmail/src/redirect.php
Jednak znowu otrzymuje komunikat, że wymagane jest zalogowanie. Czyli nie przekazuje tych danych, które powinien. Ktoś wie w czym błąd zrobiłem?

0

Musisz przekazac otrzymane cookie (z id sesji), zeby serwer rozpoznal, ze to znowu Ty.

0

bardzo fajne, a moze moglbys napisac jak samemu zrobic taka nakladke do innej strony?

0

Przeciez masz kod, czego jeszcze Ci potrzeba?

0

gelman: sorry. ale sie pytam jak rozwiązac problem a nie robie tutoriala dla ciebie ;D
Dzięki Johny, teraz powinno wszytko działac.

0

no widze ze mam kod ale nie wiem w ktorym miejscu znajduje sie "nakladka"
P.S. moglbys podac teraz w pelni dzialajacy kod?

0

nie mógłbym. jak chcesz to sie naucz PHP.

0

Jesli nie widzisz, w ktorym 'miejscu' jest nakladka, to znaczy nie nie znasz za dobrze php, co znaczy, ze pelny kod tez Ci nic nie da. Caly ten kod to nakladka, nie jakis kawalek. Poza tym do pelnego kodu brakuje tam 1-2 linijek ;)

0

no wlasnie nie znam dobzre php ;/ bardziej html znam. i wlasnie chcialem cos takiego zrobic tylko nie wiem jak sie do tego zabrac

0

No to masz podane 99% poprawnego kodu. Bez jego zrozumienia i tak nie napiszesz wlasnej wersji dla innej strony, wiec pozostaje Ci nauczyc sie php.

0

wydaje mi sei ze mniej wiecej rozumiem kod tylko nie moge dojsc w ktorym miejscu trzeba zmienic aby dane byly pobierane ze strony na ktora ja chce przerobic

0

[...] w ktorym miejscu trzeba zmienic [...]

I tu popelniasz blad, bo nie wiesz co czytasz. Zeby zrobic nakladke potrzebujesz:

  1. znac php
  2. wiedziec co i gdzie jest przesylane w przypadku wyslania formularza
    a - podgladnac wyslane elementy snifferem/LiveHTTPHeaders
    b - znac jako tako protokol HTTP, zeby wiedziec co sie dzieje pod spodem
  3. wyslac dokladnie takie dane, jakie otrzymuje zewnetrzny skrypt po wyslaniu formularza

A jak Ci sie wydaje, ze rozumiesz (a raczej nie rozumiesz) to sprawdz do czego sluza wykorzystane powyzej funkcje, to sie dowiesz. Podpowiedz - fsockopen.

0

ehh.. juz wydaje mi sie ze wszytko widze tylko jak to nalozyc na moja strone ? [???]

0

widze sam ze glupie pytania zadaje ;/ mozesz tylko powiedziec czy to gdzie bedzie zapisywalo hasla mam umiescic w tym skrpcie co jest podany wyzej? bo tego rozgrysc nie moge

0

Mam jeszcze jedno pytanie.
Bo fread zwraca mi również nagłówki wynikowe z cookies itd.
Wrzuciłem to do zmiennej $head, a potem w kodzie:

} else {
  header($header);
  exit;

I się nie wykonuje. Być może to przez to, że nagłówków jest kilka. (Location, cookies, itd)
Ale tak by było najprościej bo rozdzielać wsyzstko od siebie trudno może byc ;D

0

Problem generalnie jest taki, że nie da się zrobić "nakładki" na logowanie. Możesz zrobić własny interfejs dla całej poczty, ale nie dla samego logowania. Najprawdopodobniej strona, do której piszesz potrzebuje ciastek. Jeżeli logujesz się na stronę skryptem, po stronie serwera, to strona wysyła potrzebne ciastka do serwera. Potem wysyłasz użytkownika do strony, na której ma być zalogowany. Ale użytkownik nie ma tego ciastka. I nie dostanie go, bo nawet jeżeli wyślesz go ze swojego serwera, serwer zdalny go nie odczyta - nie ma uprawnień.

1 użytkowników online, w tym zalogowanych: 0, gości: 1