Przejdź do głównej zawartości

Posty

Wyświetlam posty z etykietą programowanie

Java - jak uruchomić JVM w innym języku

Ostatnio musiałem uruchomić JVM w innym języku niż domyślny język systemowy. Aby to osiągnąć należy do linii poleceń dodać dodatkowy parametr: -Duser.language=XX Tak więc cała linia polecenia powinna wyglądać np. następująco: java -jar -Duser.language=en jChess.jar Artykuł udostępniany na licencji CC-BY-SA-3.0

WordPress Form Maker 1.6.5 - Stored XSS

W ostatnim czasie bawiłem się wtyczką do WordPressa o nazwie Form Maker (v1.6.5). Postanowiłem przejrzeć kod tej wtyczki i sprawdzić jego jakość oraz poziom zabezpieczenia danych przychodzących od użytkowników. Jak się okazuje poziom zabezpieczeń tego dodatku pozostawia wiele do życzenia (zresztą poziom jakości kodu źródłowego również). Wygenerowałem przy użyciu panelu zarządzania FormMaker'a formularz z jednym polem typu "select: oraz przyciski "submit" i "reset". Następnie dodałem widget do prawej kolumny bloga, efekt jest następujący:   W zasadzie pole to nie jest zabezpieczone w żaden sposób przed doklejeniem do wartości skryptu JS. Wartości te wpadają do tabelki wp_formmaker_submits do kolumny element_value. Użytkownik zarządzający (domyślnie administrator) może przeglądać w panelu WP statystyki utworzone na podstawie przesłanych przez użytkowników danych, oto przykład ( http://localhost/wordpress/wp-admin/admin.php?page=Form_maker_Submits ): ...

Walidacja haseł przy użyciu wyrażeń regularnych

Jeśli jesteś web-developerem to na pewno w swojej karierze piasłeś różnego rodzaju panele logowania (być może nawet oparte na implementacjach OpenID). Najprawdopodobniej również używałeś różnego rodzaju wyrażeń regularnych do sprawdzania poprawności wprowadzanych danych. Ciekawym sposobem na walidację wprowadzanych haseł podczas rejestracji użytkowników może być zastosowanie właśnie wyrażeń regularnych. Generalnie typy wyrażeń możemy podzielić na POSIXowe oraz PERLowe. Do realizacji tego zadania musimy użyć wyrażeń typu PERLowego, gdyż te drugie nie obsługują wzorców "Lookingahead" i "Lookingbehind". Inaczej można je nazwać asercjami o zerowej długości. Co to oznacza? To, że możemy przy ich pomocy spasować jakiś wzorzec bez włączania wyników tej części wyrażenia do jego wyniku. Dla przykładu podam tutaj wyrażenie, które wpasowuje wzorzec tekstu zawierające w treści słowo "parapet", w taki sposób, że do wyniku działania wyrażenia zostanie zwrócony jedynie...

DeliveryServer - DynaMents - Pobranie ścieżki węzła/liścia

Ostatnio zmagałem się z problemem pobrania ścieżki węzła/liścia w języku DynaMents, który używany jest po stronie DeliveryServer'a. W XSLT można tego dokonać stosując: <xsl:value-of select= "name()" /> Po długich bojach, udało mi się to osiągnąć przy pomocy DynaMent'u attribute działającego w trybie read . W DynaMencie tym można podać atrybut value . W atrybucie tym można podać 3 różne wartości, są to: value - pobierana jest wartość węzła/liścia, path - pobierana jest ścieżka węzła/liścia, name - pobierana jest nazwa węzła/liścia.  Listing poniżej przedstawia kod, który wypisuje wszystkie ścieżki węzłów z globalnej zmiennej REQUEST wraz z wartościami znajdującymi się w węzłach. Linia 3 tego listingu odpowiada za wypisanie ścieżki węzła. 1. <rde-dm:attribute type= "children" mode= "for-each" alias= "reqAttr" source= "request" > 2. <rde-dm:attribute attribute= ...

XSLT 1.0 - lowercase i uppercase

 XSLT 2.0 udostępnia dużo więcej wbudowanych funkcji niż wersja 1.0 tego standardu. Są to między innymi funkcje lower-case() i upper-case(): <xsl:variable name= "var" > ŚmIeSzNy NaPiS </xsl:variable> <xsl:value-of select= "upper-case($var)" /> Czasem jednak pojawia się konieczność poprawienia kodu, który napisany został w specyfikacji XSLT 1.0 i nie ma możliwości jej zmiany na nowszą. W takim wypadku część funkcji dostępnych w XSLT 2.0 trzeba będzie zaimplementować samemu. Niestety tutaj pojawia się kolejny problem - w starej XSLT nie ma możliwości tworzenia własnych funkcji. Całe szczęście możemy osiągnąć efekt jaki udostępniają lower-case() i upper-case() poprzez użycie funkcji translate() . Oto jak można to zrobić: <xsl:variable name= "lowerCase" > abcdefghijklmnopqrstuvwxyz </xsl:variable> <xsl:variable name= "upperCase" > ABCDEFGHIJKLMOPQERTUVWZYZ </xsl:variable> ...

Poko Rocket - czyli Chu Chu Rocket w przeglądarce

Dla frajdy, w ramach wolnego czasu postanowiłem zaimplementować swoją pierwszą grę, która będzie dostępna w każdej przeglądarce pod każdym systemem operacyjnym. Z powodu, iż wspomnianego wolnego czasu nie mam zbyt wiele oraz dlatego, że do dziś łezka mi się kręci, gdy przypomnę sobie prostą, ale wspaniałą grę "Chu Chu Rocket" stworzoną na platformę Sega Dreamcast (oraz później GameBoy Advance) doszedłem do wniosku, iż to właśnie ten oryginalny i kultowy tytuł stanie się moją inspiracją. Moim celem nie jest jednak zaimplementowanie dokładnie takiej samej gry, z dokładnie takimi samymi zasadmi. Już w obecnym stadium (a jest to jeszcze BETA) dodałem jeden element, który nie był dostępny w oryginalnej wersji. Tym elementem jest strzałka zmieniająca domyślny kierunek poruszania się kotów i myszek (z prawej w lewo, a przy ponownym kontakcie z lewej na prawo itp). Pomysłów na rozwój mam zdecydowanie więcej, jednakże postanowiłem już teraz podzielić się z potencjalnymi odbiorcami t...

Dlaczego nie PHP - $this w metodach statycznych (odc. 4)

W języku PHP widziałem już kilka dziwnych zjawisk. Jednak to na co natknąłem się niedawno, powaliło mnie zupełnie na kolana. PHP w momencie gdy nie ma ustawionego poziomu raportowania błędów na "strict" pozwala na wywoływanie metod, które nie są zadeklarowane jako statyczne przy użyciu operatora :: oraz odwrotnie - metody statyczne można wywoływać w kontekście obiektu poprzez $this. Dla przykładu przedstawię kod. <?php class A { public function test () { return B :: test (); } } class B { public function test () { return get_class ( $this ); } } $obj = new A (); echo $obj -> test (); ?>   Zazwyczaj takie działania w innych językach powodują błędy. W PHP, które nie jest ustawione na "strict" wykona powyższy kod. Co ciekawe wynik będzie dosyć zaskakujący. Na logikę w kontekście statycz...

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

Dlaczego nie PHP - Tablice (odc. 1)

Po wielu nerwowych godzinach spędzonych przy PHP postanowiłem podzielić się z innymi użytkownikami internetu na temat moich spostrzeżeń odnośnie do języka i platformy PHP - zarówno tych negatywnych jak i pozytywnych (choć tych będzie chyba trochę mniej). Język ten rozwija się stosunkowo powoli, a twórcy późno dochodzą do wniosków, do których doszli twórcy takich języków jak Python już w fazie projektowania. W pierwszych artykułach doczepię się gramatyki języka, której w mojej ocenie brakuje kilku "drobiazgów". Na pierwszy ogień niech pójdą tablice i praca z nimi. <?php $element_trzeci = $obiekt -> pobierz_tablice ()[ 2 ]; ?> Konstrukcja znana z wielu języków programowania (chociażby Python, Java, JavaScript itp, itd). Niestety w PHP 5.3  kod ten się nie wykona - zobaczymy piękny komunikat "syntax error". Konstrukcja ta została wprowadzona stosunkowo niedawno w wersji 5.4 (programiści PHP musieli czekać do drugiej dekady XXI wieku na coś, co w ...

Konkatenacja w zapytaniach SQL a bindowanie przez "?"

Ostatnio w kodzie pewnego programisty znalazłem dosyć ciekawy błąd. Wynikał on z różnego sposobu podpinania parametrów do zapytania UPDATE (SQL). Wartości pól po "SET" były bowiem konkatenowane, natomiast część po słowie kluczowym "WHERE" bindowana przez znaki zapytania. Mniej więcej wyglądało to tak (pół-pseudokod): <?php $set = ' user_id =' . escape ( $user_id ) . ' ' ; ( ... ) if ( isset ( $_POST [ 'comment' ])) { $set .= ', comment="' . escape ( $_POST [ 'comment' ]) . '"' ; } query ( 'UPDATE `tabela` SET ' . $set . ' WHERE id=? ' , $id ); ?> Cały szkopuł polegał na tym, że w momencie, kiedy w którejkolwiek wartości podpiętej w zmiennej $set pojawił się znak zapytania (bo użytkownik np. chciał zadać pytanie), to do tego znaku zapytania została zbindowana zmienna $id i finalne zapytanie wyglądało np. tak : UPDATE ` tabela ` SET ` user_id `= 5 , ...

Bisekcja: Wyznaczanie miejsc zerowych

Wprowadzenie Wyznaczanie miejsc zerowych funkcji może być pomocne np. przy rozwiązywaniu równań kwadratowych lub innych wielomianów. Jednorazowe uruchomienie metody bisekcji (połowienia przedziałów) może posłużyć do wyznaczenia jednego miejsca zerowego (i tylko jednego) danej funkcji. Zastosowanie tej metody nie gwarantuje jednak wyszukania jakiegokolwiek miejsca zerowego (pomimo tego, że takie występują). Taka sytuacja może mieć miejsce gdy wybierzemy x0 , x1 tak, że dla obu tych punktów wartość funkcji będzie miała ten sam znak. Dokładność tej funkcji zależy tylko i wyłącznie od ilości wykonanych iteracji - im więcej ich wykonamy (połowień przedziałów) tym dokładniejszy wynik uzyskamy. Jedną z zalet tej metody jest błąd maksymalny, którym obarczony jest wynik - nigdy nie przekroczy on połowy odległości między badanymi punktami. Na przykład przy badaniu funkcji w przedziale 4-8 przy jednej iteracji maksymalnym błędem będzie 2. Podzielimy bowiem przedział ten na 4-6-8 i przesuniem...

Całkowanie numeryczne

Wprowadzenie Całkowanie numeryczne można porównać do podziału powierzchni całkowanej funkcji na przedziały (im dokładniejszy wynik chcemy uzyskać, tym więcej przedziałów). W zależności od wybranej metody całkowania będziemy liczyć pole w przedziałach dla prostokąta, trapezu lub paraboli. Do wyboru pozostaje nam również wybór czy ewentualny będziemy całkować pole figury pod całkowaną funkcją (z niedomiarem - wtedy uzyskany wynik może być mniejszy niż oczekiwany) lub nad funkcją (z nadmiarem - wtedy oczekiwany wynik może być większy niż oczekiwany). Pod koniec działania programu musimy zsumować pola wszystkich figur z pod przedziałów, które policzyliśmy tak, by uzyskać wynik. Graficzne przedstawienie problemu Całkowanie tak prostej funkcji jakmetodą prostokątów może dać duży błąd. Parametry wielkości przedziałów (ich liczność w całkowanym przedziale) należy dobrać odpowiednio tak, by błąd był jak najmniejszy. Całkowanie funkcji w przedziale od 0 do 8 z podziałem na 4 pod przedziały...