Nasza strona używa cookies. Dowiedz się więcej o celu ich używania i zmianie ustawień w przeglądarce. Korzystając ze strony, wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki. Rozumiem

Opowieści s-krypty, czyli przykłady złego kodu

Poznaj 9 przerażających przykładów złego kodu, który sprawia, że włos jeży się na głowie.
Opowieści s-krypty, czyli przykłady złego kodu

Czy kod może wywoływać gęsią skórkę? Jasne, że tak! Zapytaliśmy znajomych programistów i prześledziliśmy różne historie złego kodu. Zebraliśmy to w całość, aby pokazać, ile horroru dzieje się na stronach, które odwiedzamy, czy programach, z których korzystamy na co dzień. Przygotujcie się na chwile grozy! 🎃

Stary system PKP intercity do rezerwowania biletów 🤖

Na początek sławny irez.js. W 134kB JavaScriptu zmieściło się 4780 linijek i... 609 instrukcji if, 134 charAt, 153 &&, 266 ||, 56 pętli for oraz 11 eval. To imponujący wynik, który budzi strach w sercu niejednego programisty.

function tylko_litery(wyraz) {
var OK = 1
var NO = 0

    wyraz = wyraz.toUpperCase();

    var dlugosc = wyraz.length; 

    for(i = 0;  i < dlugosc;  i++){
            if(wyraz.charAt(i) <"A" && wyraz.charAt(i) != "-" && wyraz.charAt(i)  != " " && wyraz.charAt(i) != "." && wyraz.charAt(i) != "&" && wyraz.charAt(i) != "_" ) {
                if(polska_litera(wyraz.charAt(i) ) == 0 ) 
                            return NO; 
            }
            if(wyraz.charAt(i) >"Z" && wyraz.charAt(i) != "-" && wyraz.charAt(i)  != " " && wyraz.charAt(i) != "." && wyraz.charAt(i) != "&" && wyraz.charAt(i) != "_") {  

                if(wyraz.charCodeAt(i) >188) 
                    continue;
                else
                {
                 if(polska_litera(wyraz.charAt(i) ) == 0 ) 
                        return NO;
                else
                   continue;
                }
            }
    }
    var licznik = 0;
    for(i = 0;  i < dlugosc;  i++){
            if(wyraz.charAt(i) == "-" || wyraz.charAt(i)  == " " || wyraz.charAt(i) == "." || wyraz.charAt(i) == "&" || wyraz.charAt(i) == "_") {
                licznik++;
            }
    }
    if (dlugosc > 0)
    if (licznik==dlugosc)
    {
        return NO;
    }
    return OK;
}



Windows 2000 💀

14 lat temu wyciekły źródła Windowsa 2000, a dziś są dostępne na GitHubie. Nie był to szczęśliwy czas w Microsofcie. W kodzie jest mnóstwo komentarzy w stylu "UGLY TERRIBLE HACK", a w jednym z nich także przestroga - tym bardziej groteskowa, że mieszają się tu spacje i taby.

/*
 *      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 *      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 *	!!!!!!!IF YOU CHANGE TABS TO SPACES, YOU WILL BE KILLED!!!!!!!
 *      !!!!!!!!!!!!!!DOING SO FUCKS THE BUILD PROCESS!!!!!!!!!!!!!!!!
 *      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 *      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 */

 

e-puap 🕸️

Kod e-puap straszy dużo mniej niż hit od PKP - mimo, że nie jest to szczyt możliwości technologicznych. Gdyby ktoś nie skumał, co się dzieje, to programista zostawił komentarze po polsku. No i kopię zapasową tej samej funkcji, z tymi samymi komentarzami w innym pliku (common.js). Chyba na wypadek, gdyby piekło pochłonęło pierwszy plik.

styleFileButton = function(el) {
    var $this = $(el);
    // ie8 fix
    $this.addClass('the-file-input');

    //pobieramy tekst dla buttona
    var labeltext = ($this.attr('title')!='' && $this.attr('title')!=undefined)?$(this).attr('title'):'Wybierz plik';

    //ca�o�� okryjemy divem, şeby wszystko stanowi�o ca�o��
    // var $fileContainer = $('<div class="file-container"></div>');

    var $fileContainer = $('<div class="file-container" />');

    //input tekstowy
    var $text_file = $('<input class="file-input-text" type="text" value="" disabled="disabled" />');

    //button "przegl�daj" do którego wstawiamy text labelki pobrany powyşej
    var $uploadbutton = $('<input class="file-input-browse" type="button" value="'+labeltext+'" />');

    //input file okrywamy divem
    $this.wrap($fileContainer);

    //do diva wstawiamy input tekstowy i button
    $this.parent('.file-container').append($uploadbutton).append($text_file);

    //dla naszego ukrytego input file wywo�ujemy akcj�, która wstawi jego warto�� do inputa tekstowego
    $this.bind('change focus click', function() {
       //czemu nie sibling? jeĹźeli uĹźyjemy pluginu do stylowania formularz takiego jak jqtransform,
       //wtedy nasz input text zostanie zmieniony w sito, dlatego musimy go wyszukiwa� w parencie.
       $this.parent().find('.file-input-text').val($this.val().match(/[^\/\\]+$/));
    });
}

 

Czyszczenie wejścia za pomocą SQL 👹

Jedna z ciekawszych metod na czyszczenie inputu, jaką zobaczysz, i to w dodatku w czystym SQL. Bez pomocy bzdurnych bibliotek! Ostrzegamy - gdy doscrollujesz do końca linijki, możesz się przestraszyć.

UPDATE LOW_PRIORITY IGNORE products AS p, catalog AS c
				SET p.url_default = LCASE(TRIM(BOTH '-' FROM REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(p.url_default, '_','777underscore777'), '-','777dash777'), '%ProductId%',p.product_id), '%ProductName%',p.title), '%ProductDbId%',p.pid), '%CategoryName%',c.name), '%CategoryKey%',c.key_name), '%CategoryDbId%',c.cid), '%CategoryPath%',c.category_path), '%CategoryURL%',IF(c.url_custom='', c.url_default, c.url_custom)), '~','-'), '`',''), '!','-'), '@','-'), '#','-'), '$','-'), '%','-'), '^',''), '&','-'), '*',''), '™',''), '®',''), '℠',''), '₤',''), '£',''), '¥',''), '€',''), '(','-'), ')','-'), ' ','-'), '_','-'), '-','-'), '+','-'), '=','-'), '{','-'), '}','-'), '[','-'), ']','-'), ':','-'), ';','-'), '"','-'), '\'',''), '<','-'), '>','-'), ',','-'), '?','-'), '-----','-'), '----','-'), '---','-'), '--','-'), './','/'), '/.','/'), '-/','/'), '/-','/'), '///','/'), '//','/'), '777underscore777','_'), '777dash777','-')))	
				WHERE p.cid = c.cid  AND (p.pid='4711')

 

KYC w pewnym komercyjnym projekcie ⚰️

Wymaganie: musimy wiedzieć, ile klient ma lat. Implementacja? Prosta sztuczka, która bardzo upraszcza logikę - o ile klient zejdzie przed kolejnymi urodzinami.

CREATE TABLE `customers` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  ...
  `age` int(11) NOT NULL,
  ...
)

 


 

Inicjalizacja z metaprogramowaniem 👻

Coś z dziedziny magii. Przykład z języka Ruby. Dużo efektywniejsze niż @key = options[:key] napisane wprost dla spodziewanych kluczy.

def initialize(options)
  options.each do |key, value|
    instance_variable_set("@#{key}", value) if respond_to?(key)
  end
end

 

„Kryptografia" 😈

Encoding, encryption - wszystko jedno. W razie wycieku odszyfrowanie haseł będzie z pewnością równie ciężkie jak znalezienie odpowiedzi na zagadkę Sfinksa.

function EncryptPassword($password)
{
    return base64_encode($password);
}

 

Zmiana wartości 🤡

Lepiej dwa razy sprawdzić, niż sprowadzić na siebie jakieś nieszczęście. Z takiego założenia musiała wyjść osoba, która napisała ten kod. Cieszy używanie precyzyjnego porównania wartości za pomocą ===.

var show = true;

function toggleShow(){
    if(show === true){
        show = false;
        return show;
    }else{
        show = true;
        return show;
    }
}

 

Przeklęty tag HTML 🦇

Może niektórych z Was to zdziwi, ale 15 lat temu to był bardzo popularny tag, którego używały nawet poważne instytucje. Najlepiej prezentował się w połączeniu z modnym układem opartym o 3 iframe'y. Dziś już wiemy, że ten tag szkodzi bardziej niż papierosy... i niejednego UX-owca wpędził do grobu.

<marquee>2spooky4me</marquee>
Zobacz więcej na Bulldogjob

Masz coś do powiedzenia?

Podziel się tym z 80 tysiącami naszych czytelników

Dowiedz się więcej
Rocket dog