Prośba o napisanie skryptu php


(Mercolini) #1

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


(slepciu) #2

A jak jest struktura tego pliku tekstowego. Login jest w pierwszej Lini, hasło w drugiej i nic poza tym, czy coś jeszcze?


(Mercolini) #3

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...


(slepciu) #4

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


(Mercolini) #5

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ć.


(slepciu) #6

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


(Mercolini) #7

Chyba się nie rozumiemy, postaram się inaczej wytłumaczyć.

Jest aplikacja program.exe, obok niej w folderze jest plik auth.txt. W pliku auth.txt znajduje sie

login=xxx1

pass=xxx2

Uruchamiam aplikacje, ona pierw wysyła pytanie do serwera :

www.jakishost.pl/ auth.php?reg=1&id=947565741&login=xxx1&pass=xxx2 "

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.


(slepciu) #8

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;