Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM    Subskrybuj kanał ATOM dla tagu php Kanał ATOM (tag: php)

Autor wpisu: eRIZ, dodany: 01.01.2010 23:30, tagi: php

Ostatnio o Nginksie pisałem już jakiś czas temu. Pozmieniało się sporo, sam rozwój tego demona był dla mnie sporym zaskoczeniem. Kiedyś niszowy projekt - dzisiaj - zdobywający popularność w szalonym tempie.

Jednak nie ma co się temu dziwić - wydajność jest znacznie wyższa niż najpopularniejszej kobyły (czyt: Apache). No i fakt, że jest produkcji rosyjskiej - już któryś raz z kolei o tym wspominam, a jest to kolejny program potwierdzający regułę. :)

Autor wpisu: cojack, dodany: 31.12.2009 21:59, tagi: php

Pomyślałem o tym by napisać o szyfrowaniu haseł w php, gdyż dużo osób myśli że jak sobie utworzy sumę md5 z hasła to jest bezpieczny. Otóż nie. Jest prawdopodobieństwo wygenerowania dwóch jednakowych sum md5 dla dwóch różnych stringów (nie majtki :) ).

Dlaczego nie używać md5?

W internecie możemy przeczytać nt używania sumy md5 w certyfikatach SSL przy połączeniach w np. systemach bankowych. Wg NIST (National Institute of Standards and Technology [ang. Narodowy Instytut Standaryzacji i Technologii]), powinno się wycofać używanie jej już w 1999r. I co Wy na to? Zdziwieni zapewne? A proszę bardzo, a to dlaczego? Jest za duża możliwość wygenerowania kolizji sumy, czyli to co pisałem wyżej wygenerowania dwóch identycznych sum.

Co zamiast md5?

Jest dużo algorytmów oferujących sumę kontrolną z stringu, lecz nie wszystkie są zalecane. W kolejności od najsłabszego:

  • SHA1
  • SHA-224
  • SHA-256
  • SHA-384
  • SHA-512

Wszystko wiąże się z przyrostem miejsca w bazie danych, więc i z czasem dostępu, porównaniem stringu. Szybciej jest pobrać 32 znaki alfanumeryczne z bazy danych niż 512 i je z sobą porównać. Ale na pewno nie jest bezpieczniej.

crypt() dobra alternatywa

Pewnie nie jeden z Was zastanawiał się jak w linuxie hasła są zabezpieczane. Otóż linux i unixowe systemy wykorzystują sól do zapisywania haseł. Tylko to nie polega na tym że wydzielimy sobie string, dorzucimy sól, połączymy ponownie i zrobimy z tego sumę md5 gdyż to nie zwiększy bezpieczeństwa. W php od wersji > 4 istnieje taka funkcja jak crypt(), link-manual. Funkcja ta ma zaimplementowany algorytm taki jak linuks do zapisywania hasła.

function genSalt($len = 64) {
    $safeChars = "0123456789abcdefghijkmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $n = strlen($safeChars);
	$p = ''; // na wszelki wypadek
	for ($i = 0; $i < $len; $i++) {
		$p .= $safeChars[rand(0, $n - 1)];
	} 
	return $p;
}
 
$password = $_POST['password'];
$salt = genSalt();
$pwdEncrypted = crypt($password, '$2a$07$'.$salt.'$');
echo $pwdEncrypted;

Problem z crypt()

Jest jeden mały problem z tą funkcją, po przeniesieniu strony wraz z bazą danych na inny hosting, istnieje prawdopodobieństwo iż hasła mimo że są poprawne nie będą pasować. Dlaczego? Nie mam pojęcia, przeczytałem to w jednej z książek ale autor nie wytłumaczył. Możliwe że zauważył ten problem, a mi się szukać nie chce ;] Ale who care? Jak można zawsze sobie hasło zmienić. Nie jestem do końca przekonany co do tej własności z tym że może być wygenerowany różnych suma dla teg samego stringa i soli.

A co z SHA-N?

Tak więc wg NIST do 2010r. SHA1 też ma zostać wycofane z użytku przy certyfikatach ssl. Tak więc pozostało nam parę funkcji. Nie wszystkie z tych funkcji są “jawnie” dostępne w php, w sensie że są w postaci funkcji tak jak np md5, aby móc użyć np algorytmu SHA-512 musimy wykonać taką operację:

hash('sha512','Jakiś tekst do zsumowania ;)');

W funkcji hash możemy również wywoływać inne algorytmy tworzące sumę kontrolną. link-manual

Ale to nie wszystko, zapewne ktoś z Was słyszał o tęczowych tablicach, a jak nie to zapraszam link-wikipedia. Po przeczytaniu sami dojdziecie do wniosku że używanie sum kontrolnych jest po prostu mało bezpieczne.

Słów kilka na zakończenie

Co byśmy nie zrobili, to i tak się znajdzie ktoś kto nam złamie hasło, to tylko kwestia czasu.

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Autor wpisu: batman, dodany: 30.12.2009 13:27, tagi: php

Natknąłem się dzisiaj na bardzo ciekawy efekt pseudolosowości przez duże P. Musiałem wygenerować 500 tysięcy unikatowych, ośmiocyfrowych liczb. Niby nic trudnego, funkcja rand, tablica lub baza do przechowywania informacji oraz nieskończona pętla, która mieli tak długo, aż wygeneruje wszystkie liczby. Okazało się jednak, że coś co miało zająć 15 minut zajęło mi godzinę. A wszystko przez to, że

Autor wpisu: Zyx, dodany: 29.12.2009 12:35, tagi: php

PHP 5 posiada dość dużo narzędzi służących do parsowania dokumentów XML. Chociaż posiadają one różne API, zbudowane są na bazie jednej i tej samej biblioteki, dlatego bez trudu możemy przełączać się między nimi. Dla większości programistów najlepszym wyjściem będzie SimpleXML oraz bardziej rozbudowany DOM, jednak wciąż zdarzają się sytuacje, gdy nie chcemy dostać zwykłego obrazu dokumentu w pamięci, lecz przejąć kontrolę bezpośrednio nad procesem parsowania. Ten wpis poświęcony będzie temu zagadnieniu oraz rozszerzeniu XMLReader.

Autor wpisu: Damian Tylczyński, dodany: 28.12.2009 22:55, tagi: php

Są 3 główne cechy programisty: ambicja, niecierpliwość i lenistwo. Chcemy podejmować się wspaniałych wyzwań, tworzyć aplikacje szybko i się przy tym się nie napracować. Nie brzmi to zbyt dobrze szczerze powiedziawszy. Gdybym miał narażać życie innych będąc chirurgiem, po wypowiedzeniu tych słów już płonął bym na stosie. Na szczęście w inżynierii oprogramowania mamy takie cuda [...]

Autor wpisu: stormfly, dodany: 24.12.2009 18:42, tagi: php

Jednym z najbardziej lubianych zajęć programistów jest grzebanie i naprawianie kodu po innych programistach. Dzisiaj miałem tą przyjemność i oczywiście nie wiadomo było czy się śmiać czy załamać :) Odkryłem dość błahy błąd, ale konsekwencje w całym serwisie były dość...

Autor wpisu: Diabl0, dodany: 08.12.2009 12:35, tagi: php

2009-12-08 12-15-01Ostatnio dawno nic nie pisałem, ale niestety nie zajmowałem się niczym nadzwyczajnym, ciekawym czy ambitnym. Dzisiaj też nie będzie o niczym ambitnym (dla większości też o  niczym ciekawym), ale być może niektórym ułatwi to pracę.

Niestety, jako że zajmuję się jednym podprojektem samodzielnie,  to na mnie trafiła żmudna robota z generowaniem PDF’ów. A żeby nie było zbyt łatwo, to PDF”y muszą być wygenerowane na formularzu dostarczonym przez zewnętrzną instytucję w identycznym układzie. Słowem, trzeba nanieść masę różnych tekstów, ticków itp. w ściśle określone miejsca na skanie formularza. Jak to nazywa współpracownik – gra w statki :)

Na dodatek jakoś marnie mi szło to całe “trafianie”. Nijak “milimetry TCPDF nie pasowały mi do tego co pojawia się na ekranie, przez co “zabawa” była bardzo czasochłonna. Do czasu aż nie wpadłem na pomysł banalny w swej prostocie, ale znakomicie ułatwiający pracę.

Nałożymy sobie tymczasową siatkę na PDF z skalą :)

Od pomysłu do realizacji, chwila programowania i odpowiednia metoda TCPDF gotowa.

2009-12-08 12-14-57

Prawda że genialne? A dzięki tej prostej siatce w jeden dzień udało mi się “trafić więcej statków” niż przez ostatnie 3 :)

A dla chętnych troszkę kodu:

class Mao_TCPDF extends TCPDF
{

    public function drawGrid ($minor = 5, $major = 10, $font = array(), $colors = array())
    {
        $_fontSize = $this->getFontSizePt();
        $_fontFamily = $this->getFontFamily();
        $_autoPageBreak = $this->AutoPageBreak;

        $minorColor = array(0 , 0 , 0);
        $majorColor = array(255 , 0 , 0);

        if (isset($colors['minor'])) {
            $minorColor = $colors['minor'];
        }
        if (isset($colors['major'])) {
            $minorColor = $colors['major'];
        }

        if (is_array($font)) {
            if (isset($font['family'])) {
                $this->SetFont($font['family']);
            }
            $this->SetFontSize((isset($font['size']) ? $font['size'] : 6));
        }

        $this->SetAutoPageBreak(false, 0);

        for ($x = 0; $x < $this->w; $x = $x + $minor) {
            if ($x % $major == 0) {
                $this->Line($x, 0, $x, $this->h, array('width' => 0.01 , 'color' => $majorColor));
            } else {
                $this->Line($x, 0, $x, $this->h, array('width' => 0.01 , 'color' => $minorColor));
            }
            $this->MultiCell(5, $this->getFontSizePt(), $x, 0, 'C', 0, 1, $x - 2.5, 0, true, 0, true);
            $this->MultiCell(5, $this->getFontSizePt(), $x, 0, 'C', 0, 1, $x - 2.5, $this->h - ($this->getFontSizePt()/2), true, 0, true);

        }

        for ($y = 0; $y < $this->h; $y = $y + $minor) {
            if ($y % $major == 0) {
                $this->Line(0, $y, $this->w, $y, array('width' => 0.01 , 'color' => $majorColor));
            } else {
                $this->Line(0, $y, $this->w, $y, array('width' => 0.01 , 'color' => $minorColor));
            }
            $this->MultiCell(5, $this->getFontSizePt(), $y, 0, 'L', 0, 1, 0, $y - ($this->getFontSizePt()/2), true, 0, true);
            $this->MultiCell(5, $this->getFontSizePt(), $y, 0, 'R', 0, 1, $this->w - 5 , $y - ($this->getFontSizePt()/2), true, 0, true);
        }

        $this->SetFont($_fontFamily);
        $this->SetFontSize($_fontSize);
        $this->SetAutoPageBreak($_autoPageBreak);
    }
}

Metoda przeznaczona jest do TCPDF lub klasy dziedziczącej, ze względu na użycie kilku pól prywatnych. Mam nadzieję że komuś się przyda.

Wszystkie wpisy należą do ich twórców. PHP.pl nie ponosi odpowiedzialności za treść wpisów.