witam piszę do Was z prośbą o napisanie krótkiego skryptu php, nie mam w tym języku pojęcia więc proszę o pomoc. Już tłumacze o co chodzi… jest aplikacja która wysyła na pewien serwer pewne pytanie w postaci : auth.php/login-xxx$pass-xxx2
Jeżeli w pliku auth.txt znajduje się login xxx
i hasło xxx2 to serwer odpowiada true a jeżeli brak takiego konta odpowiada false. Jeżeli się źle sprecyzowałem , proszę mówić ale myślę ze to prosty skrypt i liczę na waszą pomoc. pozdtawiam
zapomniałem dodać nie ma tego pliku, miałem na myśli ze ten skrypt sobie sprawdzi w oddzielnym pliku czy ten login z hasłem znajduje się na liście. Auth.txt to powiedzmy plik z kilkoma kontami , ale go jeszcze nie ma…
piszę na szybko nie sprawdzając czy nie robię pomyłki. Zakładając że plik z hasłami wygląda tak że w jednej linii jest login i hasło tak zapisane:
login1=haslo1
login2=haslo2
login3=haslo3
To powinien zadziałać skrypt:
$login=$_GET['login'];
$pass=$_GET['pass'];
$file=file("auth.txt");
foreach ($file as $f)
{
$temp=explode('=',$f);
if ($temp[0]==$login)
{
if (trim($temp[1])==$pass) return true;
}
}
return false;
Oczywiście powinniśmy na początku jeszcze sprawdzić czy zostały przesłane zmienne w adresie. No i zakładam, że wywoływany adres podałeś przez pomyłkę z błędem i powinno być tak: auth.php/login=xxx&pass=xxx2 bo tak poprawnie przekazuje się parametry w adresie strony. A no i oczywiście w miejce auth.txt trzeba wstawić ścieżkę do pliku tekstowego, w tym skrypcie zakładam, że jest w tym samym katalogu.
To by było tyle jeśli chodzi o odpowiedź na Twoje pytanie, ale polecałbym nie przechowywać haseł w czystej postaci, tylko zaszyfrowanej, a w zasadzie hash’e hasłe, no i najlepiej w bazie danych. No ale to tak na boczku uwaga :). Mam nadzieję że pomogłem
Witam ponownie, powiem tak co do skryptu bardzo dziękuje za zainteresowanie się tematem, ale potrzebna jest lekka poprawka, prawie doszliśmy do setna sprawy. W tym momencie pisze z komputera to dokładniej opiszę co gdzie i jak.
Jest sobie aplikacja xxx.exe . Pobiera ona sobie z pliku auth.txt który znajduję się w folderze z aplikacją informacje
Login: xxx1
pass: xxx2
Aplikacja wysyła pytanie do serwera w postaci powiedzmy " auth.php?reg=1&id=947565741&login=xxx1&pass=xxx2"
Jeżeli aplikacja, jest uruchamiana pierwszy raz na tym kompie, to na początku jak widać jest reg=1&id=947565741
Chodzi o to, że po pierwszym uruchomieniu serwer powinien sobie dopisać do auth.txt na serwerze, wartość id do tego konta (login=pass) czyli prawidłowo powinno wyglądać id+login+pass
Pozostałe logowania, z tego komputera będą wyglądały tak: auth.php?id=947565741&login=xxx1&pass=xxx2
ID aplikacja tworzy na podstawie zebranych informacji dysku. To takie skromne zabezpieczenie.
Tak jak wiadomo, na ftp z tym skryptem znajduję się jeszcze auth.txt w którym są loginy i passy.
Jeżeli, znajduję się tam
id 947565741
login xxx1
pass xxx2
to serwer odpowiada “true” w innym przypadku “false”.
Jak coś nie wiadomo pisać, wszystko postaram się opisać.
Nie wiem czy dobrze zrozumiałem, ale może o coś takiego chodzi:
$filname="auth.txt";
$login=$_GET['login'];
$pass=$_GET['pass'];
$id=$_GET['id'];
if (isset($_GET['reg']))
{
$w=file_put_contents($filname,$id."=".$login."=".$pass.PHP_EOL,FILE_APPEND);
if (!$w || $w==-1)
{
echo "Wystąpiuł błąd zapisu";
return false;
}
return true;
}
$file=file($filname);
foreach ($file as $f)
{
$temp=explode('=',$f);
if ($temp[0]==$id)
{
if ($temp[1]==$login && trim($temp[2])==$pass) return true;
}
}
return false;
Na początku do zmiany jest zmienna $filname na ścieżkę do pliku. Przy czy funkcja zwraca true lub false, ale jeśli to ma być odpowiedź serwera dla aplikacji, to trzeba to zamienić na wydruk, np echo “true”, albo jakiś kod XML czy JSON
A i jeszcze ważna sprawa, skrypt zakłada że znak “=” jest znakiem który nie będzie użyty ani w loginie, ani haśle, ani w id
W tym przypadku na początku jest reg=1&id=947565741 ponieważ uruchomiłem pierwszy raz na moim komputerze tą aplikację. Ta wartość 947565741 została sporządzona przez aplikacje z informacji która pobrała z mojego komputera i już zawsze taką będę miał liczbę. Jak wiadomo, na serwerze w pliku auth.txt znajdował sie mój login xxx1 z hasłem xxx2, ale pierwszy raz uruchomiłem. Wiec skrypt powinien dodać do tego pliku, tą liczbę obok tego konta. Jeżeli zgadza się login i pass, który znajduje się na serwerze w pliku auth.txt to skrypt powinien dopisać do tego konta id.
W pliku auth.txt na serwerze powinno to wyglądać tak
id=947565741 login=xxx1 pass=xxx2
Jeżeli ktoś będzie próbował uruchomić tć aplikacje, z tym loginem i passem, ale na innym kompie to go nie odpali ponieważ utworzy mu aplikacja inną liczbę sporządzoną na podstawie informacji z dysku a skrypt odpowie na te próbe false. Ale jeżeli id,login,pass będzie zgadzał się z wartościami w pliku auth.txt który znajduje się na serwerze FTP, to serwer odpowiada aplikacji true a finalnie aplikacja się uruchamia.
Mam nadzieję, że tym razem zrozumiałem o co chodzi. Dla uproszczenia dane w pliku tekstowym zapisuje jako: “id,login,haslo”, np:
176890,admin,mojehaslo
256757,user,jegohaslo
userBezID,hasloUseraBezid
Przy czym przecinek można zamienić na co innego i wpisać to w zmienną $sep. Mam nadzieję, że tak może być, nie ma sensu zapisywać w pliku nazw zmiennych, to tylko by skomplikowało skrypt i zwiększyło wagę pliku.
$filname="xxxx.txt";
$sep=",";
$marker=0;
$login=$_GET['login'];
$pass=$_GET['pass'];
$id=$_GET['id'];
$file=file($filname);
if (isset($_GET['reg']))
{
$count=count($file);
for ($i=0;$i<$count;$i++)
{
$temp=explode($sep,$file[$i]);
$temp[1]=trim($temp[1]);
if ($temp[0]==$login && $temp[1]==$pass)
{
$file[$i]=$id.$sep.$login.$sep.$pass.PHP_EOL;
$marker=1;
break;
}
}
if ($marker)
{
$f = fopen($filname, 'w');
foreach($file as $l){
fputs($f, $l);
}
if (fclose($f))
{
echo "Dopisano id";
} else
{
echo "Błąd podczas zapisywania pliku";
}
} else
{
echo "nie znaleziono uzytkownika do zapisania";
}
return;
}
foreach ($file as $f)
{
$temp=explode($sep,$f);
if ($temp[0]==$id)
{
if ($temp[1]==$login && trim($temp[2])==$pass)
{
echo "OK";
return true;
}
}
}
echo "niepprawny login lub haslo";
return false;
Wydruki za pomocą echa oczywiście można zastąpić return’ami czy czymkolwiek;