27 martie 2012

Form Spoofing in HTML

  Form spoofing este o metoda prin care un script poate primi o cerere falsificata, trimisa printr-un formular strain, din afara aplicatiei noastre, cu elemente diferite fata de cele presupuse initial, dar care au aceeasi denumire.

  De exemplu: presupunand ca intr-un formular avem un select, care la randul lui are cateva optiuni predefinite - daca se afla numele acestui select atunci cineva poate simula acest formular punand in el un input text cu acelasi nume ca si select-ul si cu orice valoare. Rezultatul este inconsistenta datelor.

  Solutie: atasarea la formular a unui input type hidden cu o valoare generata dinamic iar aceasta valoare sa fie, in plus, inclusa si in array-ul global $_SESSION , ca variabila ce tine de sesiunea curenta.

-----------------------  index.php


<?php
session_start();
$_SESSION['secret'] = md5(uniqid(mt_rand(), true));

// formularul corect
echo '    <form action="destinatie.php" method="POST">
    <select name="color">
        <option value="red">red</option>
        <option value="green">green</option>
        <option value="blue">blue</option>
    </select>
<input type="hidden" name="secret" value="'. $_SESSION['secret'] .'"/>
    <input type="submit" />
    </form> <p/><p/>';

// formularul falsificat
echo '<form action="destinatie.php" method="POST">
    <input type="text" name="color" />
    <input type="submit" />
<input type="hidden" name="secret" value="100"/>
      </form>';
?>

-------------------- destinatie.php


<?php
session_start();

if (isset($_POST['secret']) == false || $_POST['secret']!=$_SESSION['secret']) {
echo "form spoofing";
return ;
}

?>

  La destinatie se verifica daca in formular exista un element cu denumirea 'secret'. Acesta trebuie, in plus sa aiba aceeasi valoare cu $_SESSION['secret'], ceea ce inseamna ca sesiunea din care vine formularul este aceeasi cu cea a utilizatorului curent care a ajuns la destinatie. Pentru a evita orice fel de coincidenta, valoarea "secreta" care verifica egalitatea este un md5 al unui identificator unic bazat pe timpul curent in microsecunde, si prefixat cu  un numar random....

Porti elementare si implementarea lor in Icarus Verilog

1. Inversorul CMOS

module inversor(intrare, iesire);

    input intrare;
    output iesire;

    supply1 vdd;
    supply0 gnd;

    pmos p1(iesire, vdd, intrare);
    nmos n1(iesire, gnd, intrare);

endmodule

module test_inv;

    reg in1;
    wire out1;

    inversor inst1(in1, out1);

    initial begin
        in1 = 1'b0;
        #5   in1 = 1'b1;
        #10  in1  = 1'b0;
    end

    initial $monitor ($time, " out1=%b in1=%b",  out1, in1);

endmodule




2. CMOS AND gate

module and_cmos (in1, in2, out);

    input in1;
    input in2;
    output out;

    supply1 vdd;
    supply0 gnd;

    wire w1, w2;
   
    // stanga sus, au output in acelasi loc
    pmos pmos1(w1, vdd, in1);
    pmos pmos2(w1, vdd, in2);
   
    // stanga jos
    nmos nmos1(w2, gnd, in2);
    nmos nmos2(w1, w2, in1);
   
    // rezulta output
    pmos pmos3(out, vdd, w1);
    nmos nmos3(out, gnd, w1);
   
endmodule


module test_and;

    reg in1 = 0;
    reg in2 = 0;
    wire out;
   
    initial begin
        #5  in1 = 1'b1;
        #5 in2 = 1'b1;
        #5 in1 = 1'b0;
        #5 in2 = 1'b0;
    end
   
    and_cmos and1(in1, in2, out);
   
    initial
    $monitor($time," AND(in1, in2, out) = (%b, %b, %b)", in1, in2, out);

endmodule




3. CMOS OR gate

module or_cmos (in1, in2, out);

    input in1;
    input in2;
    output out;

    supply1 vdd;
    supply0 gnd;

    wire w1, w2;

    // stg sus
    pmos pmos1(w1, vdd, in1);
    pmos pmos2(w2, w1, in2);

    // stg jos
    nmos nmos1(w2, gnd, in1);
    nmos nmos2(w2, gnd, in2);

    // output
    pmos pmos3(out, vdd, w2);
    nmos nmos3(out, gnd, w2);

endmodule

module test_or;

    reg in1 = 0;
    reg in2 = 0;
    wire out;
   
    initial begin
        #5 in1 = 1'b1;
        #5 in2 = 1'b1;
        #5 in1 = 1'b0;
        #5 in2 = 1'b0;
    end
   
    or_cmos or1(in1, in2, out);
   
    initial
    $monitor($time," OR(in1, in2, out) = (%b, %b, %b)", in1, in2, out);

endmodule




4. CMOS XOR gate



module xor_cmos (in1, in2, out);

    input in1;
    input in2;
    output out;

    supply1 vdd;
    supply0 gnd;

    wire w1, w2;

    // dreapta
    pmos pmos1 (w1, vdd, in1);
    nmos nmos1 (w1, gnd, in1);

    // stanga
    pmos pmos3 (out, in1, in2);
    nmos nmos3 (out, w1, in2);

    // centru
    pmos pmos2 (out, in2, in1);
    nmos nmos2 (out, in2, w1);

endmodule

module test_xor;

    reg in1 = 0;
    reg in2 = 0;
    wire out;
  
    initial begin
        #5 in1 = 1'b1;
        #5 in2 = 1'b1;
        #5 in1 = 1'b0;
        #5 in2 = 1'b0;
    end
  
    xor_cmos xor1(in1, in2, out);
  
    initial
    $monitor($time," XOR(in1, in2, out) = (%b, %b, %b)", in1, in2, out);

endmodule


5. Poarta T-gate (Transmission Gate)

module tgate_cmos (in, A, out);

    input in;
    input A;
    output out;

    pmos pmos1 (out, in, ~A);
    nmos nmos1 (out, in, A);

endmodule

module test_tgate;

    reg in = 0;
    reg A = 0;
    wire out;
   
    initial begin
        #5 in = 1'b1;
        #5 A = 1'b1;
        #5 in = 1'b0;
    end
   
    tgate_cmos tgate(in, A, out);
   
    initial
    $monitor($time," TGATE(in, A, out) = (%b, %b, %b)", in, A, out);

endmodule


Semnificatie T-gate: compus dintr-un un tranzistor nmos si unul pmos,  cu A semnal de enable, aceasta poarta lasa sa treaca mai departe valoarea lui In, numai atunci cand A este activat, si blocheaza iesirea, in caz contrar.
  Cand A este 1, in pmos intra ~A adica 0, deci pmos-ul este inchis (conduce pe 0). La fel, in nmos intra 1 si acesta conduce. La In = 1, conduce pmos si out = 1, iar la In = 0, conduce nmos si out = 0.
  Cand A este 0, in pmos intra 1 si se deschide (nu mai conduce), iar in nmos intra 0 - idem. Rezulta ca la out va fi impedanta marita = z oricare ar fi intrarea In.

surse foto: http://www.allaboutcircuits.com/vol_4/chpt_3/7.html

25 martie 2012

Jeem: limbaj de programare in limba araba

Super super tare:

متغير
صحيح: رقم, ل, المجموع;  
صحيح: ب, ت;
حقيقي: رقم حقيقي;
بداية
إمسح;
إطبع("اهلا و سهلا", سطر, سطر,سطر);  # ش
إطبع("أدخل أي عدد صحيح بين 0 و 10 الحساب المجموع من 1 لذلك الرقم");  # ش 
إطبع(سطر);  # ش
   إطبع  ("و تحديد زوجي أو فردي, أو اي رقم غير ذلك للخروج من  البرنامج" , سطر); # ش
إطبع (سطر, "أدخل الرقم :") ;
إقرأ (رقم);

طالما ((رقم >= 0) و (رقم <=10));
بداية
تكرار ل من 1 إلى (رقم-1);
 المجموع = المجموع + ل;
إطبع (ل, "+");
نهاية;

 إطبع (ل, "=", المجموع+ رقم))
إذا ((رقم مود 2) == 0)
إطبع (سطر, "الرقم زوجي", سطر) # ش
وإلا
إطبع ("الرقم فردي", سطر)
# ......

نهاية.

In traducere proprie:

variabile
intregi:  raqam, L, almajmua;
intregi: B, T;
reale: raqam_haqiqi;

inceput
permite;
afiseaza ("bine ati venit", linie, linie, linie);
afiseaza ("introduceti orice numar intreg intre 0 si 10 .....");
afiseaza (linie);
afiseaza ("si determinati daca este par sau impar, sau altceva pentru a iesi din program", linie);
afiseaza (linie, "introduceti numarul");
citeste (raqam);

cat timp (raqam>=0 si raqam<=10);
inceput
pentru L de la 1 la raqam-1;
    almajmua = almajmua + L; 
    afiseaza (L, "+");
sfarsit;

afiseaza (L, "=" , almajmua + raqam);
daca (raqam modulo 2 == 0)
    afiseaza (linie, "numar par", linie);
altfel
    afiseaza ("numar impar" , linie)

sfarsit


P.S. Programul este incomplet.
Link de descarcare programul Jeem: http://www.jeemlang.com/index.php?page=downloads

22 martie 2012

La ce foloseste TS (Teoria Sistemelor)

  Unul dintre locurile unde îți poți aminti de ”TS” este în robotică, în control theory . De exemplu, având o mașinuță care se presupune că ar merge drept, de fapt, din cauza erorilor, traiectoria este mai mult sau mai puțin deviată (cross-track error - CTE). Pentru a o încadra cât de cât aproape de ceea ce se aștepta, se introduc celebrele compensatoare din capitolul de sinteza SRA, cum ar fi compensatorul P, PI, PD, PID, PDD, etc.

  Compensatorul de tip P - proportional control. A conduce proporțional cu eroarea CTE - deviația scade dar au loc frecvente depășiri - deci nu foarte exact.
  Compensatorul de tip PD - proportional derivative control. A conduce proporțional cu eroarea CTE plus adăugarea derivatei în timp a CTE (diferența a oricăror 2 erori consecutive între 2 momente de timp) înmulțită cu un parametru ales. Ca rezultat, eroarea devine mai mică cu trecerea timpului, fără depășiri (oscilații în jurul axei), o convergență mai bună.
  Compensatorul de tip PID - proportional, integral, derivative. La fel ca PD, plus adăugarea integralei CTE privită ca suma a tuturor valorilor CTE anterioare, înmulțită cu un parametru. PID rezolvă o problemă neadresată de PD și anume atunci când roțile mașinuței nu sunt perfect alineate și e nevoie de o ”forță mai mare” în conducere.

  Din punct de vedere euristic, valorile proporționale, integrale și derivative pot fi interpretate temporal. Astfel, P depinde de eroarea curentă, la momentul prezent, I depinde de acumularea erorilor trecute, iar D depinde de o predicție a viitorilor erori pe baza ratei de schimbare curentă. Foarte importantă este alegerea corectă a parametrilor.

graficul răspunsului unui sistem cu regulatoare P, PI și PID
PID-ul pare a fi cel mai bun stabilizator (cu deviații minime față de y=1 și convergență rapidă)

21 martie 2012

PHP: Transmiterea datelor

În formularele HTML se poate specifica ca atribut method - POST sau GET.

În GET: browserul direcționează către pagina specificată în atributul action, la care adaugă niște perechi de tip cheie-valoare. De exemplu:  script.php?id=1440&post=14. Transmiterea se face prin URL, vizibilă pentru utilizator. Accesul la date se face prin interogarea: $_GET ['nume_variabile'] (ex. $_GET['id'] )
În POST: browserul direcționează către pagina specificată în atributul action, dar nu adaugă perechile la URL (utilizatorul nu le mai vede), totuși acestea aflându-se în cererea HTTP în clar. Accesul la date: $_POST['nume_variabila'].
În plus, fără a folosi una din cele 2 metode, putem pune link la o pagină: script.php?id=1440

Sesiuni PHP  - mecanism pentru păstrarea informațiilor despre starea clientului.
session_start () este metoda care trebuie apelată în fiecare script, la început. Sesiunea se închide cu session_destroy(). Pentru transmiterea variabilelor se încarcă/descarcă super array-ul $_SESSION.

Cookies în PHP - un fișier trimis de server și salvat în calc. personal în care se pot stoca mai multe informații.
setcookie() este metoda care definește cookie-ul, care va fi trimis împreună cu antetele HTTP. Cookies trebuie trimise înainte de orice output (inclusiv etichete HTML). Variabilele vor fi descărcate prin $_COOKIE['nume_var'] sau $_REQUEST['nume_var']. 

20 martie 2012

PHP: Metoda magică __call

În PHP, metoda magică __call permite polimorfismul (= aceeași metodă definită în mai multe feluri).
Semnătură:
public function __call ($name, $parameters) {

}
Unde:
$name este numele metodei care se suprascrie
$parameters este un array de parametri ai funcției

Diferența între metode se face în funcție de nume și de numărul de parametri (count ($parameters)).

Exemplu: într-o clasă oarecare numită User dorim să avem o metodă numită getPermissions care dacă ia un singur parametru, returnează True/False (dacă userul respectiv are acces la un articol sau nu), și dacă nu ia niciun parametru returnează un array de id-uri de articole la care userul are acces.

class User {


    // alte metode


     public function __call ($name,$param) {
if ($name== "getPermissions" && count($param) == 0) {
// returneaza un array
}
if ($name== "getPermissions" && count ($param) == 1) {
// returneaza true sau false in fct de $param
}
}
  }

$user = new User ("guest", "parola");
// apelare metodă magică
print ( $user->getPermissions("3") );
print_r ( $user->getPermissions() );  

12 martie 2012

Filtru de particule

 Filtrul de particule este o metoda de localizare folosita in robotica. Presupunand ca avem un robot, in starea initiala el stie ca se afla intr-un spatiu predefinit, dar nu stie unde anume. Dispune de o harta (care sa presupunem ca are un numar de puncte de reper/remarcabile), dar este incapabil sa distinga pozitia in care s-ar afla pe acea harta. De aceea, isi creeaza ("in imaginatia lui") un set de particule ce reprezinta "copii in miniatura" ale sale si le plaseaza in diverse locuri. Pot fi 10, 100, 1000 sau oricate particule raspandite la random in intreg spatiul. Se presupune ca particulele au fost raspandite cat de cat uniform, astfel incat in fiecare pozitie sa se gaseasca o particula ceea ce inseamna ca exista o sansa ca robotul sa se afle chiar acolo. Robotul nu stie efectiv unde se afla, dar este capabil sa detecteze distante pana la anumite puncte de reper cu o anumita acuratete, folosind laseri.


 Apoi se intampla urmatoarele: robotul doreste sa se miste si o data cu el se misca si particulele. Dupa ce robotul s-a miscat, coordonatele lui s-au schimbat si robotul doreste sa verifice (sa masoare) distantele de la locul unde se afla pana la punctele de reper ale hartii. Si obtine un set de distante. Particulele, la randul lor, fiind niste robotei fictivi, isi vor modifica pozitia _reala_ si vor si ele sa masoare distantele pana la aceste puncte remarcabile ale hartii. Particulele calculeaza aceste distante "de mana" pentru ca dispun atat de coordonatele in care se afla cat si de coordonatele punctelor de reper. In schimb, robotul nu isi stie coordonatele proprii dar poate afla distantele pana la punctele de reper (toate, sau doar o parte) folosind laseri.
 Compararea acestor distante obtinute poate oferi un indiciu despre cat de apropiat e robotul fata de particule (adica cat de reale sunt ipotezele oferite de particule). De aceea, fiecarei particule i se va atribui ulterior o greutate/probabilitate ca EA sa indice pozitia corecta. 


 Apoi, cele 10, 100, 1000, etc particule vor fi filtrate (sampling with replacement). Unele dintre ele se dovedesc a returna distante prea aberante fata de punctele de reper, comparativ cu masuratorile robotului (care in continuare nu stie unde se afla), acelea cu siguranta vor avea greutati mici si _probabil_ vor muri. Din cele N particule initiale se vor alege, la intamplare, tot N, cu posibilitatea ca dintr-o singura particula initiala sa rezulte 1,2 sau mai multe particule noi. In final va fi acelasi numar de particule, dar unele probabil se vor repeta, ceea ce va indica faptul ca pozitia exprimata de acea particula este mai probabila decat altele. Alegerea noilor particule se face la intamplare, dar o particula cu greutate mare are o sansa mai mare sa fie aleasa (si o sansa destul de mica, dar existenta, de a "muri"). 


 Cand robotul se misca din nou, procesul se repeta si dupa mai multi pasi vom vedea in jurul lui mai multe particule aglomerate care il vor insoti oriunde acesta se plimba. Poate, intr-un final, va rezulta o singura particula, care va spune cu o probabilitate mare (dar nu cu certitudine) ca robotul se afla la pozitia indicata de aceasta.


 Ce se intampla cand avem de la inceput un filtru de particule cu o singura particula? Aceasta va fi asezata intr-un loc, la intamplare, care poate fi atat locul "cel bun" cat si foarte departe de locul real. Si cum posibilitatile de asezare sunt numeroase, cel mai probabil particula nu va oferi o localizare buna. Masuratorile robotului nu vor afecta durata de viata a particulei, deoarece suntem siguri ca la urmatorul resampling noua particula este chiar cea anterioara (care are probabilitate 1 sa fie realeasa). Deci, masuratorile nu vor afecta in niciun fel localizarea oferita de particula. In schimb, miscarea robotului influenteaza miscarea particulei pentru ca cei doi se misca la fel (aceleasi translatii, rotatii, etc).

08 martie 2012

HTML5


  reprezinta cea de-a cincea mare revizuire a standardului HTML, care este in curs de dezvoltare (draft). Reprezinta un limbaj unic care poate fi scris atat in sintaxa HTML cat si in XML, ideal atat pentru browsere cat si pentru parsere. De asemenea, s-a luat in calcul si posibilitatea rularii noilor aplicatii web pe platforme mobile, smartphone-uri si tablete.

  Organizatia care a infiintat noul standard in 2004 este WHATWG (Web Hypertext Application Technology Working Group). Dintre organizatiile care sustin standardul se regasesc producatorii de browsere Firefox, Opera, dar si gigantii Google, Apple, Adobe sau Facebook.  Cu toate ca este sustinut de multe organizatii, HTML5 nu se grabeste sa fie definitivat, termenul preconizat fiind in iulie 2014.

  HTML5 contine o serie de elemente de sintaxa in plus fata de versiunea anterioara, dintre care cele mai remarcabile par a fi <audio> si <video>. Acestea ar putea inlocui plugin-urile dedicate (Flash, Silverlight, etc) si astfel ar putea imbunatati performantele (mai putine resurse consumate, securitate mai buna). De asemenea, elementul <canvas> va permite ca motorul browser-ului sa randeze grafica in timp real, pentru integrarea jocurilor fara a mai fi nevoie de Flash.

  In total, HTML5 are in jur de 100 de specificatii noi si este compatibil cu documentele HTML4 si XHTML1 publicate pe internet, dar necompatibil cu functiile SGML  are HTML4. In schimb, suporta elemente de MathML si SVG.

  Dintre elementele noi (tag-uri) cele mai importante par a fi section, article, aside, header, footer, figure, video/audio, track, embed, mark, progress, meter, time, ruby, canvas, command, details, datalist, keygen, output si altele. De exemplu, noul element numit <article> specifica un continut independent de restul paginii care va putea fi distribuit independent de restul sitului, iar <ruby> specifica o adnotare ruby, folosite pentru tipografia tarilor din Asia de Est pentru a le arata pronuntarea.

  Pe langa elemente noi, s-au adaugat si atribute noi unor elemente deja existente. De exemplu, pentru <input> exista in plus atributele autocomplete, min, max, multiple, pattern, iar pentru <textarea> apar maxlength, wrap sau dirname.  <html> va putea lua ca atribut nou manifest, ceea ce inseamna specificarea locatiei unde se afla o lista a resurselor pe care browser-ul le va cache-ui pentru accese offline ulterioare – acest atribut trebuie specificat in fiecare pagina html a aplicatiei web care se doreste a fi pastrata in cache.

  Unele atribute de elemente pot avea acum si alte valori, cum este cazul lui <input> care primeste pentru atributul type valorile: search, tell, url, email, datetime, date, month, week, time, datetime-local, number, range sau color.

  Pe langa adaugiri de sintaxa, s-au efectuat si modificari (un exemplu ar fi ca <img> nu poate primi ca valori ale atributelor width si height procente) dar si eliminari de sintaxa. S-a considerat ca unele dintre elementele absente au un efect pur de imagine (prezentare) si astfel ele pot fi setate prin CSS: basefont, big, center, font, strike, etc. Alte elemente nu apar deoarece se crede ca ar ameninta uzabilitatea si accesibilitatea: frame, frameset, noframes, iar altele au fost folosite prea putin de-a lungul timpului: <acronym> (creeaza confuzii), <applet> (inlocuit cu object),  <dir> (invechit, se foloseste <ul>). Dintre atributele des folosite, surprinzator, unele au fost eliminate deoarece functionalitatea poate fi realizata direct din CSS: align, background (<body>), bgcolor, border, cellpadding, cellspacing, frame (<table>), scrolling (<iframe>) si altele.


  Pe langa specificarea elementelor de markup noi, HTML5 specifica si API-uri de scripting. API-uri noi care apar sunt: aplicatii web offline, drag and drop, editarea documentelor, managementul istoricului web, elemental canvas pentru desenare 2D, stocare web (web storage – un framework de stocare de perechi cheie-valoare cu un comportament similar cu cookies, dar cu o capacitate mai mare de stocare si API imbunatatit), etc. GeoLocation este o interfata prin care un site poate identifica locatia calculatorului, fara ajutorul altui plugin.

  Web workers este un alt concept nou introdus de HTML5 care este o functie de procesare in fundal ce se va ocupa simulan de scripturile sitului si de aplicatiile web in thread-uri separate. In mod normal, in browsere opera un singur thread care executa tot codul Javascript, dar prin web workers, viteza si timpul de raspuns vor fi imbunatatiti prin separarea partilor CPU-intensive de  codul pentru interfata utilizatorului.
  Noua versiune HTML5 pare sa aduca imbunatatiri pe partea de securitate, prin adaugarea unui sandbox la iframe si permiterea in mod limitat a executarii scripturilor sau a cookie-urilor.

  Personal, sunt foarte atrasa de ideea de HTML5 si cred, conform specificatiilor, ca noul standard va aduce imbunatatiri substantiale atat la nivel vizual, cat si din punct de vedere al performantei. Mi se pare excelenta ideea separarii pe thread-uri a interfetei cu utilizatorul si a  “activitatii din spate” deoarece in viata de zi cu zi, multe aplicatii web crapa sau produc intarzieri deoarece toate task-urile sunt procesate laolalta, in acelasi thread. De asemenea, unui utilizator ii va fi mult mai usor cu HTML5 decat sa fie nevoit sa instaleze plugin-uri pentru orice fel de continut multimedia (Flash, Silverlight, ActiveX, etc). Cu toate acestea, se pare ca Flash nu va fi uitat prea curand deoarece HTML5 nu poate reda continut HD. Nu vad o neaparata nevoie de un API pentru accesarea aplicatiilor web offline, in conditiile in care aproape toti utilizatorii au acces la internet non-stop, dar poate ca pentru rapiditate este mai convenabil ca pagina sa fie incarcata de pe statia locala.

Referinte:

02 martie 2012

PHP: arrays, magic arrays

  Cerință: fiind dat un tabel users, ce conține câmpurile (id, firstName, lastName, email) și câteva înregistrări, să se scrie o clasa UserCollection pentru parcurgerea si afisarea utilizatorilor dintr-un tabel folosind un vector de obiecte de tip User
Facilități:
* sortarea crescator/descrescator dupa un camp specificat (Trebuie folosit un mecanism de sortare vectori)
* introducerea de restrictii; un set de restrictii poate fi reprezentat de un array (cheie ⇒ valoare), avand urmatoarea semnificatie: Selecteaza din tabel doar inregistrarile unde coloana “cheie” are valorile “valoare”. Exemplu: daca array-ul de restrictii este de forma (“email” ⇒ “test@email.com”) atunci lista va contine doar utilizatorii care au campul email egal cu valoarea “test@email.com”;
informatiile legate de sortare si de restrictii pot fi trimise in constructorul clasei, si retinute ca membri ai clasei;
* metode suplimentare:
getNextUser(): intoarce un obiect de tip User, sau false (daca nu mai sunt utilizatori in colectie);
_ _toString (): afiseaza intr-un format intuitiv colectia;
* un mecanism prin care parametrii de sortare/restrictii sa poata fi modificati fara a fi necesara re-instantierea clasei UserCollection;

Rezolvările se găsesc aici.