WAP un sesiju persistence
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.
- Ļoti nedaudzas ierīces atbalsta cookies. Līdz ar to šis sesiju identifikatoru glabāšanas mehānisms neder.
- 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ā.
jnk
2004. gada 28. oktobrī, plkst. 16:33
mode_rewrite ir laikam domāts mod_rewrite ?
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
laacz
2004. gada 28. oktobrī, plkst. 16:35
jnk: aga
laacz
2004. gada 28. oktobrī, plkst. 16:37
Lupus: tieši mod_rewrite? http://www.google.com/search?as_q=url+rewriting&as_sitesearch=jakarta.apache.org
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.
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 :)
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?
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
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? :)
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.
laacz
2004. gada 28. oktobrī, plkst. 19:34
Neonz. Skaidrs. Šitā strādā. Arī variants.
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
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.
http://ulvis.gprs.lt (wml 1.2)
2008. gada 21. februārī, plkst. 10:21
:)