Przejdź do głównej zawartości

Dlaczego nie PHP - Rzutowanie łańcuchów znakowych (odc. 2)

Ostatnio natknąłem się w pracy na niemiłą niespodziankę. Okazało się, że PHP ma trochę odmienne podejście do konwersji łańcuchów tekstowych do zmiennych typu logicznego (boolean). Różnica polega na tym, że większość języków niepuste ciągi znaków rzutują do boolean na logiczną prawdę (TRUE).

 Weźmy na przykład tutaj Pythona:
matis@linux-xcbr:~> python
Python 2.6.5 (r265:79063, May  6 2011, 17:25:59)
[GCC 4.5.0 20100604 [gcc-4_5-branch revision 160292]] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> bool("0")
True
>>>
Jednak jak wiadomo Python pomimo dynamicznego typowania jest zaliczany do języków silnie typowanych, dlatego postanowiłem zweryfikować dla spokoju swojego sumienia jak to się odbywa w JavaScript, który tak jak PHP jest językiem słabo typowanym.

Poniżej komenda wpisana do konsoli Firebuga wraz z rezultatem:

>>> Boolean("0")
true


W PHP jest troszkę inaczej, a konkretniej odwrotnie: 
matis@linux-xcbr:~> php -r 'echo var_export( (bool)"0", true )."\n";'
false
matis@linux-xcbr:~> php -r 'echo ( (bool)"0") ? 1 : 0;'
0
Fakt ten miałem ochotę zgłosić jako błąd jednak w dokumentacji PHP fakt ten jest opisany jako prawidłowe działanie. Przypuszczałem, że wynika to z kolejności rzutowania - możliwe, że najpierw "0" rzutowane jest na integer, a dopiero potem na boolean, co w konsekwencji daje logiczny fałsz.

Jednak moje przypuszczenia rozwiały próby z "0" oraz "0.0":

matis@linux-xcbr:~> hp -r 'echo var_export( (bool)"00", true )."\n";'
true
matis@linux-xcbr:~> php -r 'echo var_export( (bool)"0.0", true )."\n";'
true
 Również jestem zdania, że znając kilka języków programowania nowego możemy się nauczyć stosunkowo szybko, jednak powyższy przykład pokazuje, że do osiągnięcia perfekcji potrzeba trochę czasu.


Artykuł udostępniany na licencji CC-BY-SA-3.0

Komentarze

Popularne posty z tego bloga

WordPress -> SQL Injection poprzez plugin Webdorado SpiderCalendar

W zeszłym roku sprawdziłem jakość kodu oraz poprawność przetwarzania danych wejściowych przez plugin „Form Maker” przygotowany przez wydawcę Webdorado. Tym razem postanowiłem sprawdzić czy autor poprawił jakoś kodu swoich produktów. Należy tutaj nadmienić, że poza wersjami darmowymi opartymi na licencji GNU/GPLv2 oferuje on również wersję płatne z dodatkowymi szablonami. Tym razem postaram się opisać wszelkie przeszkody, które musiałem pokonać aby n apisać działającego exploita. Zacząłem zabawę tak, że program był dla mnie black-boxem, ale niestety skończyło się na przejrzeniu kodu. Zapraszam do lektury. Poniżej można zobaczyć jeden z widoków częściowych kalendarza, który domyślnie jest wywoływany z JavaScriptu jako XHR, można jednak go z powodzeniem otworzyć w przeglądarce jako widok główny: http://localhost:8888/wp/wp-admin/admin-ajax.php?action=spiderbigcalendar_month&theme_id=13&calendar=1&select=month,list,week,day,&date=2015-02&many_sp_calend

Inkscape - Ikona koperty

Podstawą naszej pracy będzie oczywiście narysowanie koperty. Lepszy efekt uzyskamy, jeśli narysujemy ją pod pewnym kątem. Musimy jednak oczywiście pamiętać, że konieczne będzie zachowanie proporcji oraz prawidłowe użycie rzutu. Rysujemy najpierw zewnętrzne kontury, potem wewnętrzne elementy, do momentu uzyskania podobnych efektów jak na poniższym zrzucie szkieletowym. By uzyskać widok szkieletowy włączamy opcję Widok -> Tryb Wyświetlania -> Szkieletowy . Z powyginanych trójkątów postaramy się zrobić coś w rodzaju cieni. Grubość linii koperty, które należy narysować u siebie ustawiłem na 4 - tak,by przy mniejszym rozmiarze ikony koperta była bardziej widoczna. Zresztą porównajcie to z oczekiwanym efektem końcowym. Po narysowaniu koperty przejdźmy do tworzenia tła pod kopertę. Jak widać na powyższym załączniku, będzie ono okrągłe. Korzystając z narzędzia "owal" by uzyskać idealne koło przytrzymujemy Ctrl+Shift, podczas gdy rysujemy. Wykorzystany gradient to gradient typu

Przydatne skrypty w MS SQL Server dla platformy Azure

 Jak przygotować skrypt, który wyłączy "Constrainty" w MS SQL Azure:     SELECT 'ALTER TABLE [' + s.name + '].[' + o.name + '] NOCHECK CONSTRAINT ' + i.name AS a     FROM sys.foreign_keys i     INNER JOIN sys.objects o ON i.parent_object_id = o.OBJECT_ID     INNER JOIN sys.schemas s ON o.schema_id = s.schema_id Jak przygotować skrypt, który wycziści wszystkie tabele, po tym jak wyłączysz "Constrainty" w MS SQL Azure:     SELECT DISTINCT 'DELETE FROM  [' + t.name + '] ' AS a     FROM sys.tables t     WHERE t.name <> 'appusers' AND t.name <> 'flyway_schema_history'; Jak przygotować skrypt, który włączy "Constrainty" w MS SQL Azure:     SELECT 'ALTER TABLE [' + s.name + '].[' + o.name + '] CHECK CONSTRAINT ' + i.name AS a     FROM sys.foreign_keys i     INNER JOIN sys.objects o ON i.parent_object_id = o.OBJECT_ID     INNER JOIN sys.schemas s ON o.schema_id = s.schema_i