✉️ Saņem šito visu e-pastā. Tā vietā, lai palaistu garām kaut ko no tā, ko es rakstu savā blogā, tagad vari pierakstīties un saņemt e-pastā visu, ko es te rakstu. Tas nav bieži.

← Uz sākumu

WAP un sesiju persistence

2004. gada 28. oktobrī, 14 komentāri

Atkal jau es stāstīšu par datorlietām :) Ir tāda lieta, ka nepieciešams katram WAP lapas lietotājam unikāls identifikators. Ja tas būtu parasts pārlūks, es ar lielāko prieku izmantotu PHP sesijas. Bet, WAP'ā rodas vairākas problēmas.

  1. Ļoti nedaudzas ierīces atbalsta cookies. Līdz ar to šis sesiju identifikatoru glabāšanas mehānisms neder.
  2. Tā kā daudzām ierīcēm maksimālais WML dokumenta izmērs ir ierobežots (nepilns pusotrs kilobaits), tad katrā linkā iestrādājot sesijas identifikatoru, diezgan spēcīgi palielinās WML dokumenta apjoms. Un paliek dikti maz vietas saturam.

Tad nolēmu darīt makten viltīgi. Pirmais - izmantojot glaunās priekšrocības, kuras iegūstam, izmantojot mod_rewrite iespējas, sesijas identifkators tiek padots, neizmantojot GET metodi.

Ja mums līdz šim hipotētiskā adrese ir bijusi /ad/rese/fails?sid=SESSION_ID, tad tagad mums būs šāda: /SESSION_ID/ad/rese/fails.

Un ko mēs iegūstam? To, ka, ja visi linki WAP lapā ir relatīvi, mums vispār dokumentos vairs nav jānorāda šis identifikators. Teiksim, links uz sākumlapu no /SESSION_ID/ad/rese/fails tiek norādīts kā <a href="../../../"...

Vēl viena lieta. Ja mēs kā sesijas identifikatoru izmantojam teksta rindu, kura sastāv no visiem latīņu alfabeta burtiem un cipariem (a-b, 0-9), iegūstam iespēju šo identifikatora garumu samazināt līdz pat 5 simboliem. Iespējamo kombināciju skaits ir pietiekams (69 343 957), lai nesatrauktos par iespējamo brute force uzbrukumu. It īpaši, piesaistot šo identifikatoru lietotāja IP adresei.

P.S. Whitespace izmešana no WML dokumentiem ir absolūti nevajadzīga padarīšana, jo pārsūtāmo datu apjomu samazina minimāli. Vismaz ne tik daudz, lai sevišķi iespringtu šajā sakarā.

Tu atbildi augstāk redzamajam komentāram. Atcelt

Gravatar jnk

2004. gada 28. oktobrī, plkst. 16:33

mode_rewrite ir laikam domāts mod_rewrite ?

Gravatar Lupus

2004. gada 28. oktobrī, plkst. 16:34

A lūk ja tu man dosi labu padomu kā akurāt tādu pašu ideju realizēt iekš tomcat, dikti priecāšos ;D

Gravatar Neonz

2004. gada 28. oktobrī, plkst. 18:08

Nu ar whitespace izņemšanu ir tā, ka tas ir bezjēdzīgi, jo WML fails no WAP gateway uz mobzu tiek sūtīts saspiestā veidā, cik zinu.

Gravatar Neonz

2004. gada 28. oktobrī, plkst. 18:09

Ak jā, un vispār šo fīču var realizēt arī bez mod_rewrite izmantojot Apache core features :)

Gravatar laacz

2004. gada 28. oktobrī, plkst. 18:14

Neonz: Neba par to es runāju :) Lasi uzmanīgāk :) Mazāks WML fails ir vajadzīgs tāpēc, ka dažādiem telefoniem ir dažādi pieļaujamie maksimālie WML failu izmēri. Par to esmu gluži nesen jau rakstījis - http://laacz.lv/blog/2004/10/21/vel_viens_wap_hints.

Par tām //core features//. Jā, bet čerez žē :) Use right tools for the job. ErrorDocument metode piekakā logfailus. Vai arī ir kāda cita metode, par kuru neesmu iedomājies?

Gravatar Neonz

2004. gada 28. oktobrī, plkst. 18:40

laacz: Nu ForceType metode man liekas gana sakarīga. Skat. http://spectator.ru/technology/php/user_friendly_urls

Gravatar laacz

2004. gada 28. oktobrī, plkst. 18:45

Tas der tikai tad, ja Tev saits atrodas apakšdirektorijā (tb - links ir wap.saits.lv/dir/) Bet ko darīt, ja Tavam saitam ir adrese wap.saits.lv ? Tu katram SID'am taisīsi atsevišķu failu? :)

Gravatar Neonz

2004. gada 28. oktobrī, plkst. 19:27

laacz: īsti neiebraucu, ko tu ar to domāji

iekš .htaccess liekam:

Action throw /index.php

<FilesMatch "^([^.]+)$"> ForceType throw </FilesMatch>

<FilesMatch index.php> ForceType application/x-httpd-php </FilesMatch> -------------------------

Tālāk mums būs fails index.php, kurš no $_SERVER['REQUEST_URI'] dabūs gan sesijas id, gan failu, kas tālāk jāincludo. Piemēram:

index.php

<?php /* Ja URI bez sesijas id, redirekteejam uz taadu ar sesijas id */ # Te vaidzees izdomaat kaadu viltiigu algoritmu, peec kaa noteikt, vai URI satur sesijas id, vai tikai failu, kas jaaincludo. Piemeeram, varam noteikt, ka sesijas id saakas ar ciparu, bet includojamo failu pirmaas pakaapes direktoriju nosaukumi nekad. /* Dabonam sesijas id un failu kas jaaincludo */ $sesijas_id = substr($_SERVER['REQUEST_URI'], 1, strpos('/', $_SERVER['REQUEST_URI'], 1)); $fails = substr($_SERVER['REQUEST_URI'], strpos('/', $_SERVER['REQUEST_URI'], 1)+1); /* Includojam */ include $fails; ?>

Tālāk jau $fails būs mūsu īstais PHP scenārijs, kurš no mainīgā $sesijas_id dabūs sesijas identifikatoru.

Ja ir vajadzība vel padod kaut ko līdzīgu QUERY mainīgajiem, tad jāuzrakstā būs nedaudz viltīgāks kods.

P.S. Rakstīts on-the-fly, var būt kādi gļuki.

Gravatar laacz

2004. gada 28. oktobrī, plkst. 19:34

Neonz. Skaidrs. Šitā strādā. Arī variants.

Gravatar Kirils

2004. gada 29. oktobrī, plkst. 21:31

ip adresei? visiem tak ir viena. btw, LMT pats iedod unikaalu forwarded_for headeros, taa kaa tas prakstiski nav vajadziigs. ja cilveeks aizmirst nospiest logout, tad gan ir ziepes. tele2 protams kaa parasti gulj ziemas miegu

Gravatar laacz

2004. gada 1. novembrī, plkst. 08:17

Kirils: Hederis tiek dots TIKAI tad, ja tiek izmantots LMT proxy. Līdz ar ko, ir lietotāji, kuri šo maģisko iespēju neizmanto.

Gravatar http://ulvis.gprs.lt (wml 1.2)

2008. gada 21. februārī, plkst. 10:21