Unu situ web chena cookie? Eja, fait

Unu situ web chena cookie? Eja, fait

Màgini de kalhh, pigada de Pixabay

In s'incumentzu de sa carriera mia de programadori web mi praxiat a fai a manera chi is situs mius funtzionessint beni finas chena JavaScript e chena cookie. Acuntessiat fatu-fatu difatis chi unus cantu impitadoris ndi-ddus studessint po arraxonis de seguresa. Apustis de s'arribu de sa lei de is cookie (o testimòngius), su pensamentu miu est torrau a balli. S'informu obligatòriu in totu is situs chi bisitaus est dessintotu infadosu e po chini no ndi sciit de chistionis legalis ddoi at sèmpiri s'arriscu de fai is cosas no cunforma a is arrègulas. Balit sa pena, duncas de si domandai si est pretzisu deaberus a installai custus cookie.

Incumentzaus narendi chi, a foras de is trastus de sighidura comenti Google Analytics, s'impreu primàriu de is cookie est su de mantenni una sessioni (is chi ddi narant "cookie tènnicus"), mentris su de amentai is preferèntzias de s'impitadori oramai si fait giai sèmpiri cun sa sessioni etotu e s'archiviatzioni locali po mèdiu de Javascript. Si chistionat giai de acabai cun s'impreu de is cookie in pagus annus e esistint tènnicas de sighidura chi no ddus impreant, ma innoi bollu spricai comenti si podit mantenni una sessioni in seguresa chena impreai custu trastu.

Aplicatzionis de una pàgina

Is aplicatzionis de una pàgina funt cussus situs web innui su navigadori càrrigat in s'incumentzu una pàgina sceti e su cuntènniu suu ddu manìgiat dessintotu JavaScript. Servìtzius chi impreaus dònnia dii funt fatus in custa manera. Facebook est s'esempru prus craru, ma funt de aici fintzas su motori de circa de Google e àterus meda. Teneus trastus vàrius a disponimentu po creai situs de una pàgina, comenti is framework AngularJS e React, ma fait a s'arrangiai fintzas cun sa paja Laravel + Livewire o àteru.
Su bonu de custa tènnica est chi, comenti no tocat a càrrigai prus pàginas, no tocat a si preocupai de arrecuperai sa sessioni de traballu. Fait a traballai a s'aplicatzioni comenti si fessit unu servìtziu web (web service), separendi dessintotu is ladus server e client. Unu servìtziu web bonu est chena stadu, comenti previdit su protocollu HTTP, e depit averiguai is credentzialis de s'impitadori po dònnia pedida. No ddoi at a essi duncas nisciuna sessioni, ma sceti resursas chi s'impitadori at a manigiai impreendi pedidas vàrias (de biri su cuntzetu de serbidori RESTful).
Fitianamenti, eus a tenni unu serbidori de autenticatzioni chi at a creai unu token. Cust'ùrtimu at a essi sarvau in locale (in una variàbili JavaScript o in s'archiviatzioni de su navigadori) e agiuntu a s'intestatzioni (header) de dònnia pedida a su serbidori web, chi dd'at a impreai po identificai a s'impitadori.
No m'apu a lareddiai ni cun is cuntzetus de autenticatzioni e autorizatzioni ni cun comenti si faint in cuncretu. Ddoi at trastus e protocollus medas chi fait a impreai e su sceberu dipendit de cosas medas, comenti su tipu de aplicatzioni de svilupai (un'app po una banca o po unu servìtziu mèigu at a tenni unu livellu de seguresa meda prus artu de s'imbucada a s'àrea de cumentus de unu blog, po esempru).

Aplicatzionis de prus pàginas

In custu atopu seus ainnantis a unu situ web traditzionali, fatu de pàginas vàrias, cun unu stadu sarvau in una sessioni. Me is esemprus mius apu a fai riferimentu a PHP comenti linguàgiu ladu-server, ma is pròpius cuntzetus balint calisisiat linguàgiu impreaus.
De sòlitu, sa sessioni si mantenit sarvendi un'ID comenti a cookie (o testimòngiu). Su navigadori imbiat is cookie cun dònnia pedida, duncas su programadori depit sceti tzerriai session_start dònnia borta chi su script est postu in esecutzioni e is datus ant a essi sarvaus inguni. Fait a no sarvai s'ID comenti a cookie studiendi un'àtera manera po dd'imbiai in seguresa.

Paràmetru GET

Sa manera prus sintzilla po imbiai s'ID de sa sessioni est de dd'agiungi a sa query string de dònnia pedida, chi duncas at a aparri che www.situmiu.com/pagina?PHPSESSID=id-sessioni-miu
S'ID matessi fait a ddu pigai (o impostai) tzerriendi sa funtzioni session_id. PHP at a pigai s'ID de sa pedida e totu at a funtzionai che cun is cookie ativus. Is prus atentus ant a ai giai biu unu scenàriu problemàticu de s'impreu de custa tènnica. Imagineus chi un'impitadori imbuchit a sa pàgina e ddi pàrgiat de interessu. A custu puntu at a copiai s'URL e dd'at a imbiai a un'amigu o, peus, dd'at a cumpartzi in unu social. Chini at a aberri su ligòngiu at a impreai sa pròpiu sessioni de su primu impitadori. Si sa sessioni cuntenit sceti impostatzionis de pagu importu, no at a essi unu problema, ma si ddoi at datus personalis e/o s'ID de s'impitadori chi permitit de imbucai a àreas privadas, custu no ddu podeus permiti. Iaus a podi agiungi càncua medida comenti s'averiguu de unus cantu datus de s'impitadori (indiritzu IP, user agent e àteru) ma nudda de su chi agataus in una pedida normali est ùnicu deaberus: duas personas acapiadas cun sa pròpiu versioni de su navigadori in sa matessi arretza si podint pigai s'unu po s'àteru.

Paràmetru POST

Po no cumpartzi sa sessioni impari cun totu is ligòngius, podeus impreai unu mètodu diferenti, su de impreai pedidas de tipo POST, is pròpius de is formulàrius (form), e agiungi s'ID de sa sessioni comenti campu cuau. De sòlitu no fait a impreai POST po unu ligòngiu sintzillu, ma cun CSS podeus fai unu butoni de imbiu (submit) dessintotu uguali a unu marcadori <a>. Po comodidadi, fait a impreai una libreria chi oferrat custa possibilidadi. Cun bootstrap bastat a agiungi is classis "btn btn-link". In custa manera, dònnia link cumpartziu at a portai a una pàgina cun una sessioni lìmpia. Mancai mellus de sa solutzioni cun su paràmetru GET, custa puru portat unus cantu problemas:

  1. a primu, est un'impreu impròpiu de sa pedida de tipu POST. No ddoi at acòrdiu si POST si depat impreai po creai resursas noas o po ddas modificai, ma po una visualizatzioni est GET su tipu de impreai. Pagu mali, comentisisiat. Est unu prètziu bonu po navigai in trancuillidadi, chena cookie e chena cumparsa de ventaneddas infadosas;
  2. su meri etotu de sa sessioni torrendi a su situ at a agatai una sessioni buida chena atzessu a su profilu suu, a sa pròpiu manera de candu si cancellant is cookie cun su mètodu clàssicu. Si custu est un'efetu disigiau po su contu de sa banca, podit essi infadosu po calisisiat impreu prus pagu crìticu;
  3. s'ID de sa sessioni aparit in su còdixi de orìgini da sa pàgina. Custu bolit nai chi sarvendi sa pàgina comenti a documentu HTML e cumpartzendi-ddu cun àterus, su destinatàriu at a tenni atzessu a sa sessioni nosta cun unu simpri clic asuba de unu ligòngiu, torrendi in parti a su pròpiu problema de su mètodu de su paràmetru GET.

Paràmetru POST bia JavaScript

Podeus lassai perdi su problema n.1 de su puntu passau ca est sceti chistioni de forma, mentris is àterus duus funt prus de importu po s'impitadori mèdiu. Ddus podeus arrangiai impreendi JavaScript, chi ormai totus lassant ativu, giai chi est in sa basi de agiumai totu is prataformas de impreu fitianu.
Po no passai sa sessioni cun su còdixi HTML, creaus un'API chi nd'incumentzit una noa e torrit s'ID suu. Su còdixi JavaScript at a impreai s'API po sarvai s'ID in s'archìviu locali de su navigadori e dd'at a ponni in su campu de sessioni de su formulàriu candu si fait clic asuba de unu ligòngiu. Candu s'ID est giai in s'archìviu, at a essi impreau po torrai a assetiai sa sessioni. 
In custa manera, si impreaus AJAX po amostai informatzionis de profilu (status de atzessu, nomìngiu de impitadori, etc), s'impitadori at a agatai sa sessioni sua chena depi torrai a imbucai e, sendi chi s'ID s'agiungit a sa pedida "a bòlidu", no at a aparri in su còdixi de orìgini. Su còdixi chi sighit amostat custa solutzioni, in una versioni curtza. Po semplicidadi, totu s'agatat in unu documentu ùnicu, ma bosàterus arregordai-sì de creai sèmpiri documentus separaus po PHP, HTML, CSS e JavaScript.

<?php

/* Piga PHPSESSID de is paràmetrus GET e POST 
   Si su seridori no ddu permitit tocat a passai a manu su balori de PHPSESSID a session_id() */
ini_set('session.use_only_cookies', false);
// No creis su cookie PHPSESSID
ini_set('session.use_cookies', false);

if (isset($_POST['PHPSESSID']) || isset($_POST['get_session_id'])) {
  session_start();
}

if (isset($_POST['get_session_id'])) {
  echo session_id();
  exit();
}
?>

<!doctype html>
<html lang="it">
  <head>
    <title>Il mio sito senza cookie</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css">
  </head>
  <body>
    <form action="index.php?pagina=link1" method="post">
      <input type="hidden" name="PHPSESSID" value="">
      <input type="submit" class="btn btn-link" value="Link 1">
    </form>
    <form action="index.php?pagina=link2" method="post">
      <input type="hidden" name="PHPSESSID" value="">
      <input type="submit" class="btn btn-link" value="Link 2">
    </form>
    
    <p>
      Balori de session_id: <span><?php echo session_id() ?: 'NON PRESENTE' ?></span><br>
      Sessioi sarvada in su navigadori: <span id="session_js"></span><br>
      Si is duus baloris ant a essi ugualis bisitendi is ligòngius, totu funtzionat comenti si depit.
    </p>

    <script src="https://code.jquery.com/jquery-3.6.4.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js"></script>
    <script>
      $(document).ready(function () {
        // Circa s'ID de sessioni nell'archiviatzioni de su navigadori
        let session_id = window.localStorage.getItem('user_session');
        if (session_id === null) {
          // L'ID no est sarvau. Si-ndi pedit unu nou
          $.post("index.php", {get_session_id: 1})
          .done(function(data) {
            window.localStorage.setItem('user_session', data);
            $('#session_js').html(data);
          })
          .fail(function() {
            alert("Faddina: impossìbili a creai una sessioni");
          });
        } else {
          $('#session_js').html(session_id);
        }

        $('.btn-link').click(function (e) {
          // Clic apitzus de unu de is ligòngius. Agiungi s'ID de sessioni e imbia.
          e.preventDefault();
          const $form = $(this).parent();
          $form.children('input[name="PHPSESSID"]').val(window.localStorage.getItem('user_session'));
          $form.submit();
        });
      });
    </script>
  </body>
</html>

Cunsiderus de seguridadi

Sarvai s'ID de sa sessioni in s'archiviatzioni de su navigadori no est prus pagu seguru de impreai unu cookie. Forsis nimancu de prus, cunsiderau chi depeus atentzionai a tènnicas medas de hackeràgiu. S'archiviatzioni locali impreat archìvius in su dispositivu de s'impitadori comenti acuntessit po is cookie, e lassat chi ddus lìgiant sceti pàginas chi benint de sa pròpiu orìgini. Calisisiat impitadori acapiau a s'arretza depit pigai totu is medidas possìbilis po evitai atacus de malware a su dispositivu chi ndi podint furai datus de importu, inclùdius is còdixis de sessioni.
Is cookie teniant finas a pagus annus a imoi su problema mannu de essi imbiaus a totu is pedidas a su serbidori, cumprèndias is no seguras, e duncas chini podiat imbucai a s'arretza podiat ligi totu. Is datus sarvaus in livellu locali funt imbiaus a su serbidori sceti candu serbit deaberus, donendi prus cuntrollu a su programadori asuba de su tràficu insoru. Comentisisiat, cun s'impreu sèmpiri prus spainau de HTTPS si depeus orroliai prus pagu chi ddus furint in caminu mentris, comenti eus biu, est ancora pretzisu a evitai de ddus esponni candu no serbit o fait mancai dannu.

Concruida

Is cookie fiant unu trastu de importu po mantenni su stadu intra una pedida e s'àtera a su serbidori web a traessu de unu protocollu, HTTP, chi in sei est chena stadu. In sa simpresa insoru ant amostau de essi poderosus e ddus ant impreaus po punnas lutzas, comenti a sighi totu is passus de s'atividadi de s'impitadori po nd'arregistrai is fainas, is costumàntzias e a bortas fintzas datus sensìbilis. S'Unioni Europea at circau de arrangiai sa situatzioni ma no at sceberau sa mellus manera. Mancai siat de importu a informai a is impitadoris de s'impreu chi si bolit fai de is datus insoru e a ddis domandai su permissu, s'agataus prenus de ventaneddas infadosas a cumparsa po dònnia navigatzioni, cosa peus po chini at cunfigurau su navigadori po ndi cancellai is datus de navigatzioni bessendi. In prus, no podeus essi segurus chi situs malus arrespetint su sceberu nostu, duncas abarrat de importu chi s'impitadori atentzionit a su chi abarrat sarvau in su dispositivu. Iat a essi stètiu forsis mellus a tipisai is cookie e donai a s'impitadori sa manera de cunfigurai una borta po sèmpiri su cumportamentu de su navigadori po dònnia tipu, permitendi ecetzionis in manera prus permitidora o prus severa. Ddoi iat a at a essi unu cuntrollu prus standardisau e una navigatzioni prus lèbia, ma parit chi oramai s'idea siat sa de abandonai is cookie dessintotu mancai, comenti nau, ddoi siant tènnicas de sighidura prus bonas e prus muissas.
Si s'arribat a unu web chena cookie iat a essi mellus a tenni unu campu standard po s'ID de sa sessioni in sa pròssima versioni de HTTP, ma comenti eus biu in custu artìculu est giai possìbili a no impreai cookie, arrangendi-sì cun su chi teneus.

Cumenta

Categorias