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

Autor wpisu: matiit, dodany: 01.01.2014 18:21, tagi: php

Świat wolny od miliona require i include

PHP od wersji 5.3.0, a więc już od jakiegoś czasu wspiera przestrzenie nazw, czyli w oryginale namespace. Mówi się, że lepiej późno niż wcale, z tego powodu nie będę się rozwodził nad tym, że od wielu lat PHP było w tyle, zachęcało do budowania aplikacji w brzydkim stylu – trudno, od jakiegoś czasu wszystko idzie w lepszą stronę.

Nie trudno pewnie sobie wam przypomnieć sytuację, w której include był używany w co drugim pliku, nikt nie wiedział co się skąd bierze i tak dalej. Dzisiaj pokażę jak stworzyć małą aplikację w PHP korzystając z dobrodziejstw PSR, namespace, composer. Jak prosto jest używać zewnętrznych bibliotek i jak nie pogubić się we wczytywaniu masy plików w miejscach do tego nieprzeznaczonych.

Wyobraźmy sobie, że piszemy jakiś parser zbierający informacje. Mamy do wyciągnięcia dane z jakiejś strony – parsowanie HTML i zapisanie tego do bazy danych.

Zewnętrzne biblioteki

W celu ułatwienia sobie pracy, postanawiamy skorzystać z zewnętrznej biblioteki tworzenia zapytań HTTP. Wybieramy na przykład Guzzle.

Zacznijmy od zainstalowania composera. Proces instalacji jest banalnie prosty, więc nie ma sensu go opisywać. Daję tylko odnośnik: http://getcomposer.org/doc/00-intro.md#installation-nix

composer.json

Przejdźmy do stworzenia pliku, który będzie opisywał dla composera nasz projekt:

{
  "name": "matiit/justForExample",
  "description": "Example for blogpost",
  "license": "MIT",
  "require": {
    "guzzle/guzzle": "3.8.*@dev"
  }
}

Oraz wykonajmy polecenie composer install w katalogu z naszym projektem (lub php composer.phar install  - w zależności od tego jak zaintstalowaliśmy composera).

Dostaniemy fajną strukturę:


.
├── composer.json
├── composer.lock
└── vendor
 ├── autoload.php
 ├── composer
 │   ├── autoload_classmap.php
 │   ├── autoload_namespaces.php
 │   ├── autoload_real.php
 │   ├── ClassLoader.php
 │   └── installed.json
 ├── guzzle
 │   └── guzzle
 │   ├── build.xml

I tak dalej wgłąb guzzle/

Mamy więc już zainstalowaną i prawie gotową do użycia bibliotekę guzzle. Proste, tak? Tak.

Teraz potrzebujemy „naszego kodu”. Warto utworzyć folder o nazwie src oraz pozmieniać trochę w composer.json, tak, aby korzystać z dobrodziejstw PSR-0.

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

Autor wpisu: stormfly, dodany: 31.12.2013 10:40, tagi: php

Dzisiaj opiszę jak podłączyć Paczkomaty na bazie moich doświadczeń z jednym sklepem internetowym. Ogólnie integracja poszła sprawnie, nie napotkałem żadnych większych problemów, ale zacznijmy od początku, krok po kroku. W pierwszej kolejności należy ściągnąć i rozpakować ze...

Autor wpisu: zleek, dodany: 18.12.2013 13:27, tagi: php, zend_framework

Podczas generowania dokumentów Pdf przy wykorzystaniu komponentu Zend_Pdf z Zend Framework możne spotkać problem związany z zamieszczaniem w dokumencie długiego tekstu. Z pomocą może tutaj przyjść poniższa metoda, która przyjmując kilka parametrów załatwi za nas całą sprawę automatycznie. Jako parametry metoda ta przyjmuje przede wszystkim obiekt Zend_Pdf_Page, na którym obecnie pracujemy oraz treść $text, którą […]

Autor wpisu: Jacek Skirzyński, dodany: 09.12.2013 23:54, tagi: php

Przyszedł czas na drugie spojrzenie na Phing – czym on jest napisałem w skrócie w poprzednim wpisie.

Parametry uruchomienia

To narzędzie konsolowe, więc jest uruchamiane za pomocą wywołania phing [opcje] [cel] w konsoli (najlepiej w katalogu zawierającym plik build.xml). W wywołaniu można umieścić parametry/opcje:

  • [nazwa celu] – nazwa celu, który ma zostać wywołany; jeżeli się nie pojawi zostanie uruchomiony cel domyślny projektu (<project ... default="domyslny_cel"/>);
  • -h / -help – wyświetlenie ogólnej pomocy aplikacji;
  • -l / -list – wyświetlenie listy celów zdefiniowanych w build.xml;
  • -f [plik] / -buildfile [plik] – nazwa pliku skryptu, jeżeli inna niż build.xml;
  • -D[właściwość]=[wartość] – przekazanie do skryptu właściwości o podanej wartości;
  • -propertyfile [plik] – wczytanie podanego pliku z deklaracjami właściwości;

Cele

W poprzedniej sekcji wspomniałem o parametrze pozwalającym wyświetlić listę dostępnych celów. Jednak nie każdy cel powinien być uruchamiany „samodzielnie” – czasem jest potrzebny tylko do spełnienia jakichś podstawowych wymagań dla innego celu, który wykonuje faktyczne operacje. Przykładem może być cel, który wczytuje/ustala odpowiednie właściwości konfiguracyjne (np. ścieżki do katalogów, dane FTP etc.), wywołanie takiego celu samodzielnie do niczego nie doprowadzi. Dlatego takie „prywatne” cele można ukryć na liście za pomocą atrybutu <target ... hidden="true"/>.

Kolejną i chyba nabardziej przydatną możliwością celów jest ustalanie dla nich zależności – na przykład, żeby wykonać cel „deploy” (który wgrywa pliki na serwer), należy najpierw te pliki/katalogi przygotować (np. usunąć pliki tymczasowe). W skrypcie Phing nie trzeba deklarować dodatkowo wywołań celów, od których zależy wykonanie bieżącego lub samemu wywoływać ręcznie cele w odpowiedniej kolejności. W tym celu wykorzystuje się atrybut <target ... depends="cel1,cel2,cel3"/>

Są jeszcze dwa pomocne atrybuty celów – if, unless. Pierwszy uruchamia cel tylko w momencie, kiedy zmienna o podanej nazwie jest zadeklarowana. Drugi ma działanie odwrotnie. Poniżej przykład:

<?xml version="1.0" encoding="UTF-8"?>

<project name="HelloWorld" default="hello">

    <property name="uruchomione" value="" />

    <target name="hello" depends="cel1,cel2">
        <echo>Hello</echo>
    </target>

    <target name="cel1" if="uruchomione">
        <echo>cel 1</echo>
    </target>

    <target name="cel2" unless="uruchomione">
        <echo>cel 2</echo>
    </target>

</project>

Poniżej wynik uruchomienia (pojawiają się nagłówki wszystkich wywołanych celów, ale kod cel2 nie został wykonany ze względu na warunek zawarty w atrybucie unless.

cim@cim-k52:~/public_html/Phing$ phing 
Buildfile: /home/cim/public_html/Phing/build.xml

HelloWorld > cel1:

     [echo] cel 1

HelloWorld > cel2:


HelloWorld > hello:

     [echo] Hello

BUILD FINISHED

Total time: 0.0581 seconds

Właściwości

Właściwości są swego rodzaju zmiennymi dla skryptu Phing i zostały już użyte w poprzednich przykładach. Warto pamiętać, że odwołania do właściwości mają budowę ${nazwaWlasciwosci}, np. <echo>Wartość zmiennej: ${nazwa}</echo>. Przydatne jest używanie kropek dla budowania hierarchii – ${aplikacja.baza.host}% – można w ten sposób grupować właściwości co mocno zwiększa czytelność.

Do tej pory w przykładach pojawiały się właściwości z wartościami zadeklarowanymi w pliku build.xml, jednak to nie jedyne możliwe źródła danych:

  • <property name="nazwa" value="wartosc" /> – pokazywany wcześniej sposób deklarowania zmiennej, w deklaracjach można odwoływać się do innych zmiennych (np. do jakiejś ścieżki dodać nazwe kolejnego katalogu);
  • <property file="plik.properties" /> – wczytuje do skryptu właściwości zdefiniowane w podanym pliku; można użyć również dodatkowego atrybutu <property file="plik.properties" prefix="zPliku" /> co spowoduje dodanie prefiksu do wszystkich nazw właściwości znajdujących się w pliku;
  • <echo>${env.PATH}</echo> – odwołania z prefiksem env. pozwalają na dostęp do zmiennych środowiskowych (zależne od systemu);

W przypadku zdublowania nazw właściwości Phing będzie zwracał pierwszą wartość właściwości, żeby zmienić to zachowanie trzeba dodać do drugiej deklaracji atrybut <property ... override="yes" />.

Podczas tworzenia ścieżek lub operacji plikowych pomocny może okazać się dostęp do ścieżki do katalogu projektu (zadeklarowanej w tagu <project ... basedir="/var/www/Projekt"> lub domyśnie ustawianej przez Phing). Ścieżka jest dostępna pod nazwą ${project.basedir}.

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

Autor wpisu: cichy, dodany: 27.11.2013 01:33, tagi: php

Full Path Disclosure (FPD)  w skrócie to podatność aplikacji i/lub konfiguracji serwera polegająca na upublicznieniu pełnej ścieżki dostępu do plików. Z pozoru niegroźna rzecz może być kluczowa dla przeprowadzenia bardziej szkodliwych ataków wymagających znajomości wspomnianej lokalizacji plików. W tym wpisie chciałbym pokazać tą podatność zarówno od strony atakującego jak i od strony osoby zajmującej się serwerem / aplikacją internetową podatną na FPD. Środowisko testowe zostało zbudowane z podatnej aplikacji napisanej w języku PHP na serwerze Apache 2.

1. FPD – jak wykryć podatność

Wśród technik wykorzystania tej podatności najprostszą jest po prostu próba przemycenia innego typu parametrów niż spodziewa się skrypt. Jako przykład może posłużyć nam adres:

http://example.com/index.php?page=Home

widząc taki adres możemy sobie zadać pytanie a co jeżeli skrypt otrzyma dane innego typu ? prowadzeni tą myślą wpisujemy w przeglądarce zmieniony URL:

http://example.com/index.php?page%5B%5D=Home

Jeżeli aplikacja nie sprawdza typu zmiennej $_GET['page'] oraz serwer jest błędnie skonfigurowany możemy zobaczyć coś takiego:

Notice: Array to string conversion in /var/users/janek/www/index.php on line 13

Jak widać niechciany komuniakt o błędzie zawiera pełną ścieżkę do pliku index.php.

Druga metoda, którą chciałbym przedstawić dotyczy zależności w plikach php wyobraźmy sobie sytuację w której mamy 3 pliki:

1.php o treści

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

Autor wpisu: matipl, dodany: 26.11.2013 09:55, tagi: php

Temat co jakiś czas wraca w dyskusjach i przez niektórych uznawany jest za trudny. Nic bardziej mylnego, sprawę można zamknąć w kilku linijkach kodu.

Ostatnio zetknąłem się z integrację aplikacji z API, które oferuje jeden z dostawców „chmur”. Dość specyficznie obsługują upload, oferując tak naprawdę tylko przesył danych (POST), bez zapewnienia dodatkowych możliwości.

Jeśli użyjemy do tego CURL-a, kilka funkcji możemy uzyskać sami. Jedną z takich funkcji jest chociażby stan postępu wgrywania pliku. CURL jest biblioteką napisaną w C, dzięki temu możemy skorzystać np. z wywołania zwrotnego, który wygląda w oryginale tak:

typedef int (*curl_progress_callback)(void *clientp,
                                      double dltotal,
                                      double dlnow,
                                      double ultotal,
                                      double ulnow);

W takim wypadku definiujemy na jego wzór własną funkcję zwrotną. W najprostszej postaci może wyglądać tak:

function progress($clientp, $dltotal, $dlnow, $ultotal, $ulnow) {
    if ($ulnow > 0) {
        echo round($ulnow / $ultotal * 100, 2) . PHP_EOL;
    }
}

Pozostaje już tylko użyć tej funkcji w naszym wywołaniu CURL-a:

$args = array();
$args['SourceFile_1'] = new CurlFile('plik.jpg', 'application/octet-stream', 'plik.jpg');

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $args);
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'progress');
curl_setopt($ch, CURLOPT_NOPROGRESS, false);
$response = curl_exec($ch);

Oczywiście w prawdziwym przypadku musimy jeszcze zaiinicjować $ch, zalogować się lub ustawić odpowiednie nagłówki uwierzytelniające, oraz odpowiednio zdefiniować zwrotkę z funkcji progress, aby móc to odebrać jako np. JSON w przeglądarce. A resztą zajme się już człowiek od frontendu ;)

Autor wpisu: matipl, dodany: 18.11.2013 09:32, tagi: php, mysql, sql

MariaDB - MySQL

W ostatnim czasie kilkukrotnie już zdarzyło się, że osoba z którą rozmawiałem sądziła, że MariaDB to zupełnie nowy silnik bazodanowy niekompatybilny z MySQL.

Nic bardziej mylnego. Sytuacja wygląda bardzo podobnie do tej z OpenOffice sprzed kilku lat. Jak pamiętacie w 1999 roku firma Sun Microsystems przejęła produkty firmy StarDivision i udostępniła pod nazwą StarOffice. Pakiet był darmowy, ale zamknięty ze silnym wsparcie od firmy Sun. W 2002 roku pojawiła się pierwsza wersja OpenOffice, na której bazował StarOffice 6.0. Był to bardzo popularny zabieg w tamtym czasie (patrz OpenSUSE, CentOS). Firma wydawała otwartą, darmową wersję community rozwijaną przez społeczność, następnie markowała swoją marką i rozprowadzała za odpowiednie benefity (często w formie płatnego supportu).

Nie wszystko układało się jednak najlepiej, ale w takim zawieszeniu środowisko współtwórców OO trwało przez wiele lat. W 2010 roku firma Oracle przejęła Sun i wszelkie projekty, w tym OpenOffice/StarOffice. Środowisko open-source było zaniepokojone poczynaniami Oracle (np. pozwy w sprawie korzystania z Javy w Androidzie) i postanowiono zupełnie oddzielić się od korporacyjnych wpływów – powstał LibreOffice.

To tak w sporym skrócie. Co wspólnego ma z tym MySQL? MySQL tworzony był przez szwedzką firmę MySQL AB, która została wykupiona przez Sun w 2008 roku, a ta została przejęta… Zgadza się, przez Oracle w 2010 roku. Ale już w 2004 roku środowisko wolnego oprogramowania zaczęło mieć „problemy” z MySQL, a dokładniej programiści chociażby PHP. Wszystko z powodu zmian w licencji MySQL od wersji 4.1, ponieważ od tego momentu MySQL na darmowej licencji można było używać wyłącznie do zastosowań niekomercyjnych. W momencie przejęcia przez Sun, jeden z twórców MySQL (Monty Widenius) stworzył forka MySQL pod nazwą MariaDB.

MariaDB

MariaDB jest oparta na tym samym kodzie co MySQL, ale rozpowszechniana tylko na licencji GPL. Twórcy starają się utrzymywać ciągłą kompatybilność do pierwowzoru – MySQL. Produkt ma być dostępny zawsze na licencji GPL, czego nie można powiedzieć o przyszłości MySQL od Oracle.

Do wersji 5.5 (aktualna stabilna) MariaDB jest numerowana identycznie do MySQL i kompatybilna w pełni. Natomiast następcą MariaDB 5.5 będzie MariaDB 10 (obecnie w fazie rozwoju, będzie częściowo kompatybilna z MySQL 5.6).

Percona Server

Firma Percona natomiast stworzyła fork MySQL zastępując jej silnik innoDB (względy licencyjne) silnikiem pisanym przez zespół XtraDB. Głównym powodem wprowadzenia własnych zmian była słaba skalowalność bazy MySQL w oryginale.

Percona Server jest w stanie skalować się aż na 48 rdzeni procesora. Podobnie jak MariaDB, również Percona Server od wersji 5.6 nie będzie w pełni kompatybilna z MySQL 5.6. Percona Server wykorzystuje natomiast dobre smaczki z MariaDB, oraz pewne udostępnione fragmenty kodu przez Google (np. SHOW USER/TABLE/INDEX).

Percona Server 5.5 udostępniona jest na wersji CC BY-SA 2.0.

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

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