Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]tworzenie tokena, kilka pytań
Forum PHP.pl > Forum > Przedszkole
Majzel
Tworzę tokena z tutoriala bo nigdy wcześniej nie rozbiłem takiego czegoś, i mam taki kod:
Kod
<?php
$slowa=file('hasla.txt');

if(isset($_GET['id']))
    $nr=$_GET['id'];
    else $nr=rand(0,count($slowa)-1);

$slowo=$slowa[$nr];

$wysokosc=20;
$szerokosc=60;


$pic=ImageCreate($szerokosc,$wysokosc);

$bialy=ImageColorAllocate($pic,255,255,255);
$czarny=ImageColorAllocate($pic,0,0,0);
$szary=ImageColorAllocate($pic,150,150,150);

ImageFill($pic,1,1,$bialy);

for($i=0;$i<100;$i++)
    {
    $los1=rand(0,$szerokosc);
    $los2=rand(0,$wysokosc);

    ImageLine($pic,$los1,$los2,$los1,$los2,$szary);
    }
for($i=0;$i<count($slowa);$i++)
    {
    $rozmiar=rand(2,5);

    ImageString($pic,$rozmiar,$i*10+7,3,trim($slowo[$i]),$czarny);
    }
Header("Content-type: image/gif");
ImageGIF($pic);
?>



i co do powyższego kodu mam kilka zasadniczych pytań, od początku czyli:
else $nr=rand(0,count($slowa)-1);

jakie zadanie ma -1 ? bo po testach zauważyłem, że gdy jest -1 to zawsze wyświetli się wyraz, a jeżeli nie ma tego -1 to niekiedy nie wyświetla się wyraz tylko samo tło tokenu, nie rozumiem tego(?)

druga sprawa to druga pętla for:
Kod
for($i=0;$i<count($slowa);$i++)
    {
    $rozmiar=rand(2,5);

    ImageString($pic,$rozmiar,$i*10+7,3,trim($slowo[$i]),$czarny);
    }


i dokładnie nie rozumiem tam tego:
$i*10+7, to jest 3 argument tej funkcji, który ma być punktem zaczęcia napisu z lewej górnej strony, tak pisze w manualu w takim razie dlaczego $i*10 to jest przerwa pomiędzy kolejnymi literami, a 7 to odległość napisu z lewej strony?
testowałem inny obrazek bez pętli to działał normalnie czyli 3 argument to była poprostu odległość od lewego górnego pkt.
nie rozumiem jednak tej pętli, z góry dzięki za cierpliwosc i wytlumaczenie :]
pzdr.
biteater2008
Pozwolę sobie Panu odpowiedzieć.

Jeśli chodzi o linijkę:
CODE
else $nr=rand(0,count($slowa)-1);


count($slowa) oznacza po prostu długość tablicy $slowa. Jak wiemy, w PHP indeksy tablicy zaczynają się od zera, a nie od 1. Długość tablicy jest więc o 1 większa niż indeks jej ostatniego elementu. Gdybyśmy nie odjęli 1, funkcja rand() mogłaby wylosować element leżący poza tablicą (stąd czasami pojawia się Panu puste tło).

Odnośnie pętli:

CODE
for($i=0;$i<count($slowa);$i++)


Zawiera ona rażący błąd (byćmoże autor Tutoriala pomylił się). Zamiast count($slowa) powinno być strlen($slowo). Nie wątpię jednak, że token uruchamia się Panu pozornie prawidłowo. Proszę jednak zauważyć, że jeżeli długość słowa jest większa od ilości wpisów w pliku "hasla.txt", to nie zostanie wyświetlone pełne słowo. Jeżeli słów jest dużo, to problem jest niezauważalny. Niestety, jeżeli mamy np. 5 słów w pliku, z których jedno brzmi np. "Parasaurolofus", to na tokenie zobaczymy tylko literki "Paras".
Dzieje się tak, ponieważ count($slowa) oznacza długość tablicy $slowa, czyli ilość tekstów z pliku. Zamiast tego powinno być:
CODE
for ($i=0;$i<strlen($slowo);$i++)

Teraz wyświetli się Panu tyle literek, ile zawiera ich tekst w zmiennej $slowo.

Odnośnie linijki:
CODE
ImageString($pic,$rozmiar,$i*10+7,3,trim($slowo[$i]),$czarny);

Punktem, od którego zaczniemy rysowanie tekstu w poziomie będzie 7, ponieważ w pierwszym przebiegu pętli wartość zmiennej $i będzie wynosić 0, a więc 0*10+7 = 7.
W kolejnym przebiegu wartość zmiennej $i będzie wynosić 1, a więc 1*10+7 = 17.
Jak więc Pan widzi, odległość między początkami kolejnych liter wynosi 10.
Majzel
dziękuję bardzo smile.gif
słuszna uwaga z tym:
Kod
for($i=0;$i<count($slowa);$i++)


nawet tego nie zauważyłem, bo każde moje słowo w pliku hasla.txt miało 5 znaków a wyrazów było o wiele więcej smile.gif

pozdrawiam.

p.s mam jeszcze pytanie czy jest sens działania tej pętli:
Kod
for($i=0;$i<100;$i++)
    {
    $los1=rand(0,$szerokosc);
    $los2=rand(0,$wysokosc);

    ImageLine($pic,$los1,$los2,$los1,$los2,$szary);
    }


skoro kropki są koloru innego niż tekst (są koloru szarego) więc nie utrudni to botom rozszyfrowania tekstu, prawda?
zrobić więc czarne kropki? da to coś? czy w ogóle zrezygnować z kropek?
biteater2008
Jeżeli bot jest pisany specjalnie do złamania tokena na Pańskiej stronie, to cracker na pewno każe mu odrzucić wszystko co jest w kolorze innym niż czarny. Radziłbym Panu wprowadzić kolorowe tło, oraz tekst i kropki w losowanych barwach.

Poza tym, rada na przyszłość:
jeżeli rysujemy pojedyncze piksele, to jest do tego prostsza instrukcja niż imageline():

imagesetpixel($obraz,x,y,$kolor);

Również pozdrawiam :-)

Tak nawiasem, to lepiej od imagestring() do tworzenia tekstów nadaje się funkcja imagettftext();
Ta pierwsza pozwala tworzyć tekst tylko z jednym krojem czcionki, poza tym nie ma możliwości obrócenia liter - to gratka dla botów :-(

Funkcja imaggettftext() służy do utworzenia czcionki z pliku. Przyjmuje argumenty w następującej kolejności:
- $obraz - wskaźnik do obrazu;
- rozmiar
- kąt obrotu
- lewy dolny wierzchołek tekstu (x,y)
- wskaźnik do koloru
- ścieżka do pliku z czcionką (z roszerzeniem .ttf)
- tekst do wypisania.

Ciekawym rozwiązaniem byłoby napisanie każdej litery pod losowym kątem (na przykład z przedziału (-45 do 45 stopni) innym (również losowym) krojem czcionki.
linuxoida
a ja mam mały problem, ponieważ mam uruchomioną bibliotekę gd i exif oraz mbstring i mi jak nie chce działać tak nie działa (zrobiłem to zgodnie z tym jak napisane jest w php.net) a skopiowany skrypt mi nie działa. Wyświetla mi tylko napis że:

  1. Obrazek http://localhost/token.php nie może zostać wyświetlkony ponieważ zawiera błędy


nie wiem co się dzieje. Czy ktoś może pomóc z tym? Z góry dzięki
erix
Skomentuj wywołania header" title="Zobacz w manualu PHP" target="_manual i zobacz, jakie błedy sypie.
linuxoida
header("Content-type: image/gif"); jak zakomentuje to pokazuje mi

Notice: Uninitialized string offset: od 7 do 20 in C:\wamp\www\token.php on line 23

no i dodatkowo znaczki
erix
No to znaczy, że nie masz takich znaków o takich pozycjach w zmiennej tekstowej. Jakbyś chciał odczytać znaki 7-20 z sześcioznakowego ciągu.
linuxoida
nie rozumiem o co chodzi. Możesz jaśniej?
erix
Masz np:
  1. <?php
  2. $str = 'Ala';
  3. ?>

A chcesz wyciągnąć czwartą literę z $str.
linuxoida
jest mały problem, ponieważ jak dodałem po jednym znaku to nic mi się nie zmieniło. A możesz mi podpowiedzieć co mam zrobić, aby mi sie normalnie wyświetlało??
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.