Programavimo kalbų saugumas

Perlmonksuose kilo diskusija apie tai kokia kalba yra saugesnė
– PHP ar Perl. Atsakymas bent jau mano nuomone yra vienareikšmis
(ne, atsakymas nėra Perlas) – saugumas priklauso ne nuo
kalbos, o nuo programuotojo. Galima rašyti nesaugias (lygiai taip kaip
ir saugias) web aplikacijas tiek su PHP, tiek su Perlu, tiek su C, tiek
su Pitonu ar Java. Aišku kaip sako amerikonai „the devil is in
the details
“ – kai kurios kalbos saugumo prasme leidžia
užmerkti akis ir pasitikėti pačia kalba (kartais be reikalo), kai
kuriose pats turi pasirinkti kaip užtikrinsi saugumą.

PHP aplikacijas senais laikais buvo gana sudėtinga padaryti saugias
(register_globals=On?), bet jau senokai ši situacija
pasikeitė. Kalba įgavo naujų saugumo galimybių, tik neaišku ar patys
programuotojai pasikeitė nuo tų laikų kai viskas buvo globalu. Vis dar
tenka matyti baisius Dreamweaver‘iu darytus skriptus su
globaliais kintamaisiais ir jokio parametrų tikrinimo. Perlas nuo senų
laikų irgi buvo gana nesaugus, ir vėlgi ne dėl pačios kalbos, o dėl
programuotojų neišmanymo. Perlo bendruomenė iki šiol griežia dantį ant
Matt’s Script Archive, kurio
programose skylių daugiau nei kodo eilučių. Kas blogiausia, daug žmonių
būtent mokėsi Perlo iš tokių kreivų skriptų, nepagalvodami apie saugumą.
Tiesa, Perlas gali ir pagelbėti programuojant saugias aplikacijas: tam
yra taint mode (-T), CPAN yra gerų saugumui padedančių modulių, o Perlo
įpraiškos tokios lengvos (na… reliatyviai lengvos. bet jei
programuotojas negali suprasti paprasčiausių įpraiškų, ta ir negalima
sakyti, kad jis moka Perlą) naudoti, kad jomis labai paprasti išsivalyti
reikiamus duomenis.

Galvoje dabar sukasi mintis „Jei programuotojas
ignoruoja kalbos pateikiamus saugumo įrankius, tai kaltas
programuotojas, o ne kalba.
“ Ir nesvarbu kuo jis
programuoja.

Ilga pertrauka

Ilgokai čia nerašiau. Kaip pasakė kažkoks Amerikos
weblogininkas, internetiniai dienoraščiai dažnai būna pilni
atsiprašymų, jog dėl susikaupusių darbų ar dar ko nors nėra laiko juos
pildyti. Tad štai man dabar yra panašiai ;-).

Pačiame Lietuvos internetinių dienoraščių pasaulyje pradeda jaustis
štilis (mada pradeda praeiti?) – štai Džibas neatnaujina savo dienoraščio jau
20 dienų, aubergine miręs visą
mėnesį (nors gyvybingumu ir taip nepasižymėjo), blondattack ryškiai
sužibo ir greitai perdegė, why2liz primigęs rudens miegu,
Xawiers matyt užsiėmęs šeimyniniais
reikalais, ir t.t. ir panašiai. Įdomu kaip čia viskas toliau vystysis,
ar atgis visi tie dienoraščiai, ar bus užmiršti kaip senos asmeninės
svetainės iš gūdžių 1996 metų su užrašais „Under
construction
“ ir <blink> žymėmis?

Automatiniai CSS generatoriai

Pastaruoju metu labai populiarėja visokie internete pasiekiami
automatiniai CSS dizainų
generatoriai, kurie leidžia vienu formos užpildymu susikurti standartus
atitinkančią svetainę be lentelių. Štai du, kuriuos neseniai atradau: Layout-o-Matic
ir Firdamatic.
Tikėkimės kažkada ir Frontpage generuos standartus atitinkančius
dizainus be lentelių (na, pasvajokim…)

Prie to pačio dar šiandien išsibandžiau Style
Master
programėlę (reiktų kada nors su tais CSS pagaliau susitvarkyt). Atrodo ganėtinai patogus
dalykas. Tik aišku mokamas.

Benchmarkai

LG
sumąstė labai sick idėją – paaukoti kodo komentarus
vardan kodo greičio. Na, nieko čia nuostabaus, kad kodas be komentarų
veikia greičiau – juk greičiau jis nuskaitomas iš disko (Nes
mažiau skaityt. Logiška.) Šiaip pati kodo greitinimo idėja išimant
komentarus yra E V I L
dar išimkit visus tarpus, ir tada bandykit redaguot tą kodą ;-)

Pasibenchmarkinau ir aš. Pagrindinis testavimo skriptas yra paleidžamas iš konsolės. Štai jis
(nenaudoju Benchmark modulio, nes jis skaičiuoja tik realų
procesoriaus laiką, o mums kaip tik reik žinot kiek laiko laukiama
duomenų iš serverio nieko neveikiant):

#!/usr/bin/perl -w
use strict;
use LWP::Simple;
use Time::HiRes qw/tv_interval gettimeofday/;

cmpthese(1000, { 'full_php' => sub { get "http://localhost/full.php"},
                 'nokom_php'=> sub { get "http://localhost/nocom.php"},
                 'full_pl' => sub { get "http://localhost/full.cgi"},
                 'nokom_pl' => sub { get "http://localhost/nocom.cgi"},
                 'full_pasm'  => sub { get "http://localhost/full_pasm.cgi"},
                 'nokom_pasm' => sub { get "http://localhost/nocom_pasm.cgi"},
                 'full_c'    => sub { get "http://localhost/full_c.cgi"}});

sub cmpthese {
        my ($kiek, $ka) = @_;
        my $result = {};
        for my $kuri ( keys %{$ka} ) {
                my $start = [gettimeofday];
                &{$ka->{$kuri}} for (1..$kiek);
                $result->{$kuri} = ($kiek/tv_interval($start, [gettimeofday]));
        }
        my @r = sort { $result->{$a} <=> $result->{$b} }
                keys %{$result};
        printf "%10s %.2f kartu/s\\n", $_, $result->{$_} for @r;
}

O štai patys tikrinami skriptai:

full.php

<?php
# blah blah blah
/* blah blah blah */
// blah blah blah
for ($i = 10; $i <= 1000; $i++) {
print "blah";
}
?>

nocom.php

<?php
for ($i = 10; $i <= 1000; $i++) {
print "blah";
}
?>

full.cgi (Perlas per CGI)

#!/usr/bin/perl
print "Content-type: text/html\n\n";
# blah blah blah
=blah
blah blah blah
=cut
for (my $i = 10; $i <= 1000; $i++) {
print "blah";
}

nocom.cgi

#!/usr/bin/perl
print "Content-type: text/html\n\n";
for (my $i = 10; $i <= 1000; $i++) {
print "blah";
}

full.c (kompiliuotas su gcc -O3 -o full_c.cgi full.c)

int main() {
        int i;
        puts("Content-type: text/html\n\n");
        for(i = 10; i <= 1000; i++) {
                puts("blah");
        }
        return 0;
}

full_pasm.cgi (Parrot v0.0.11 assembly, kompiliuojamas on-the-fly)

#!/usr/bin/parrot -a
# blah blah blah
# blah blah blah
# blah blah blah

        set S0, "Content-type: text/html\n\n"
        print S0
        set I0, 10
        set S1, "blah"
FOO:    print S1
        inc I0
        le I0, 1000, FOO
        end

nocom_pasm.cgi

#!/usr/bin/parrot -a
        set S0, "Content-type: text/html\n\n"
        print S0
        set I0, 10
        set S1, "blah"
FOO:    print S1
        inc I0
        le I0, 1000, FOO
        end

Štai rezultatai:

 full_pasm 92.14 kartu/s
nokom_pasm 92.35 kartu/s
   full_pl 130.01 kartu/s
  nokom_pl 139.57 kartu/s
    full_c 189.88 kartu/s
  full_php 236.95 kartu/s
 nokom_php 278.25 kartu/s

PHP komentarai daro atrodo 17% įtaką kodo greičiui (kas tikrai daugoka),
Perlo CGI kodo su komentarais ir kodo be komentarų skirtumas yra 7% (hmm…
reiktų pasibandyt su kešuojančiu mod_perl – iš vis neturėtų būti skirtumo).
Parrot atrodo tie komentarai nei šilta nei šalta.

Kad ir kaip ten bebūtų, komentarų išėmimas dėl greičio padidinimo yra manau
kvailokas dalykas. Geriau jau kompiliuotis kodą, laikytis jį keše (Zend optimizeriai?).
Na, jei jau labai labai reikia tų kelių procentų grečio padidėjimo (kažkaip abejotina), tai
visada galima pasirašyti perlinį skriptuką, kuris nustripins visus komentarus,
kai jau ruošitės viską dėti į serverį ;-) (ir tai jokiu būdu nereiškia kad galit nekomentuot
savo kodo ;-)