Diskuze: Jak zašifrovat data v URL
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 18 zpráv z 18.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Budeš skôr musieť napísať čo konkrétne chceš dosiahnúť, akú informáciu posielaš v tej url a za akým účelom, lebo zatiaľ to znie nezmyselne a zbytočne. Napíš o čo Ti ide a odpíšem Ti aký princíp sa na to používa.
A co to vůbec nedešifrofat ale zašifrovat kod z url a poměřit ho s
jedním schovaným v databázi.
Něco jako:
$code = $_GET["code"];
$sifra = $code . "dedertbnbvfntr@[fgrmfuxdercu##efnrf";
$baseCode = $db->prepare("SELECT * FROM tabulka WHERE code=SHA1(:code)");
$baseCode->bindParam(":code", $sifra);
$baseCode->execute();
$baseCodeStatus = $baseCode->fetch()
if (!$baseCodeStatus){
echo("Nespravny kod");
}
else {
//Pokracovani kodu
}
Upresním radšej, prečo je to nezmysel... Pokiaľ ideš nad protokolom https, nie je dôvod túto informáciu šifrovať. Pretože tá požiadavka na server už šifrovaná je, cestou ju nikto neodchytí. A že je na koncových bodoch nešifrovaná, to je v poriadku. Lebo na serveri ju aspoň netreba dešifrovať, ušetríš čas a výpočtový výkon, a že ju vidí klient v adresnom riadku nešifrovanú je tiež jedno, lebo on beztak vie, že do danej časti stránky prístup má. No a ak by tú informáciu videl niekto poza chrbát autorizovaného klienta, tomu to tiež bude na nič, lebo do danej časti nebude prihlásený, takže sa tam aj tak nedostane bez mena a hesla. Preto mi Tvoja otázka pripadá nelogická a najjednoduchším riešením zatiaľ vyzerá byť použitie https protokolu, čo je dnes beztak skôr povinnosť, ako voľba.
Potřebuji zašifrovat tohle a předat metodou GET.
"{"typ": "add_group", "group_id":"8238599;8238600;8238602"}"
Informaci si rád uložím v JSON, abych s tím pak mohl lépe pracovat, lze do budoucna počítat, že by tam bylo více informací. A jde jen o to, aby nějaký šikula neprovedl base64_decode a v případě znalosti jiných ID, aby nedošlo k modifikaci. Na víc jde o redakční systém a tak mám možnosti z důvodu rozsahu zásahu omezené.
A tak to co jsem uvedl potřebuji zašifrovat, ale i zpětně dešifrovat.
Ještě jinak řečeno. Ty dostaneš URL s kodem, který se rovnou propíše do reg.formuláře. Případně dostaneš jenom ten kod. Ten kod bude ukrývat informaci, který řekne kam s registrovaným uživatelem.
SHA1 je pouze jednosměrné šifrování a já ty informace neznám, které se budou šifrovat. Potřebuji ale znát algoritmus na dešifrování.
Nie je podstatné, či tú informáciu prenesieš cez get, či post. Celá tá požiadavka bude predsa nad https šifrovaná automaticky.
Děláš to špatně. Nesmíš dovolit, aby mohl uživatel pomocí
podvržení URL obejít zabezpečení. Prostě musíš počítat s tím, že ti
může HTTP parametrech (jak POST, tak GET) přistát absolutně cokoliv. Tohle
musíš řešit na straně serveru.
V momentě kdy zpracováváš ten požadavek musíš ošetřit, jestli taková
akce může nastat a až potom ji vykonat.
Pokud do nepotřebuješ skrýt před klientem, ale kýmkoliv jiným, použij
HTTPS. Mnoho hostingů už nabízí Let's encrypt certifikát zdarma.
Proč řešit věci, které s tím nesouvisí? To je logické že to přes https je automaticky šifrované, ale řešíš věc až od konce. Na víc ten kod nemusí vůbec jít přes https, nebo jakýkoliv jiný protokol. Ten kod může být předán jakoukoliv formou a to např. emailem. Já pokuď si ten kod vezmu a dešifruji si ho, upravím hodnoty, zašifruju, zaregistruju se tak již https projde modifikovaný kod a to mi je již k ničemu.
Proto píšu, že potřebuji něco čím dokážu zašifrovat nějaký string a zpětně ho dešifrovat.
Ale já potřebuji zašifrovat string, který předám za pomocí URL metodou GET. Nějaké šifrování, nebo zabezpečení na HTTP/HTTPS je pozdě. Potřebuji jen minimalizovat možnost dešifrovat předané údaje. Ono se sice zas tak moc neděje, protože spolu s tím hraje xx dalších faktorů, ale bude to lepší vůči šťouralům.
Ten kod, nemusí být poslán v URL, ale i emailem, nebo jakoukoliv jinou metodou. Když si to budou tisknout a pak opisovat to je už na koncové firmě.
Pro ještě lepší upřesnění...
Předání kodu za pomocí URL je jen uživatelské zjednodušení, aby ten kod
nemuseli vyplňovat do políčka "ověřovací kod".
Tak můžeš to prohnat nějakým symetrickým algoritmem (třeba AES) a
šifrovat klíčem, který bude u tebe na serveru.
Ale není to vůbec standardní řešení. Tvůj web musí za každých
okolností odolat podvržené URL, tedy jak ty říkáš šťouralům,
kteří si prostě vymění ty parametry.
Nevím přesně, co chceš dělat, proto to je možná mimo mísu, ale také se
často používají jednorázové tokeny- nepředáváš samotná data, protože
jsou třeba velká nebo je právě nechceš prozradit. Proto si ten objekt
uložíš v DB a uživateli dáš token, pomocí kterého si může samotný
objekt zobrazit.
PS: hodně by pomohlo, kdybys nám sdělil, co se to vlastně snažíš, ale
konkrétněji.
Nerobíš dobre, ideš na to príliš neštandardne. Ale OK. V prehliadačoch od IE 11 máš Web Crypto API, môžeš šifrovať. Ale varujem Ťa, že je to netriviálna tématika a je veľmi ľahké nesprávne ho použiť, čo Ti v princípe anuluje celú bezpečnosť. Plus, toto API nemá protistranu näv PHP, musíš si sám nájsť a správne použiť kryptovacie funkcie v PHP za účelom následného dešifrovania správy. Jednoduchšie bude ak vygoogliš knižnicu, ktorá je aj pre JS, aj pre PHP - menšia šanca, že to zmrvíš... Ale opakovane Ťa varujem, vyhni sa tomuto ak je to čo len trochu možné, lebo musíš fakt vedieť čo robíš. A na stackoveflow rovno zabudni, ten je práve kvôli radám o zabezpečení považovaný za nebezpečný - stačí pogoogliť článok "stackoverflow considered harmful". Hoci za takúto radu body za riešenie nezískam, musím si za tým stáť - nerob to...
Kdybych mohl, napsal bych to úplně konkrétně, ale jsou některé informace které nemohu sdělit. Ale zkusím to.
Jedná se o web na který budou mít přístup jen zaměstnanci firem. Každý zaměstnanec na webu uvidí jen něco podle přiřazené skupiny oprávnění. Řekněme, že budou 3 skupiny a každá skupina má jiné oprávnění. Firma pro každou tu skupinu dostane kod, který tady řeším. Tedy dostane 3 kody a ten kod si rozešlou svým zaměstnancům. Oni ten kod vloží do registrace, nebo eventuálně vyfasují url s GET který provede automatické propsání do inputu. Uživatel se zaregistruje, já na straně serveru získám ten kod, který dešifruji a získám informaci od jaké firmy uživatel je a do jaké skupiny má být zařazen. Jakmile podle ID tohle dohledám, tak se provede registrace a admin firmy již v administraci uvidí uživatele, který čeká na schválení. Bez schválení se uživatel stejně nezaregistruje.
Jde jen o to, aby mohli hromadně rozeslat registraci a měli s tím co nejméně práce. A tím, že na tom hodně závisí lidský faktor, rád bych tomu dopomohl lepším zabezpečením. I kdyby to dešifrovali musí znát IDčka, kterých je několik a vytváří jistou stromovou strukturu a tak určitě nestačí jen změnit jedno ID, aby např. byl v jiné firmě a na víc uživatele musí potvrdit admin/správce. A tak by sice zakodování do base64 mohlo stačit, ale rád bych tomu přidal něco na víc.
Já si spíše myslím, že jsi úplně nepochopil můj dotaz Zkus si ještě přečíst co jsem teď napsal Petrovi).
Prečítal som si to a naprosto nechápem prečo chceš nejaké id šifrovať, keď ho chceš následne niekomu dať. Veď z tých rozdaných ID nemusí byť vôbec jasné do ktorej časti webu bude mať následne prístup.
To máš pravdu, ale oni se ty ID už moc nezmění, pro tu konkrétní firmu a tak bych rád tomu přidal jen něco co není tak dobře čitelné a že to dokáže dešifrovat po přečtení jednoho návodu. V opačném případě raději udělám to, že každé skupině přiřadím ještě speciální klíč, ale v rámci technologie na redakčním systému je celkem sranda ty informace kombinovaně získávat a tak bych se rád tomu vyhnul. Ale i za tohoto předpokladu ten kod pro tu skupinu bude stejný dokuď si třeba firma nevyžádá nový kod.
Proto se snažím vysvětlit, že není potřeba v tom hledat bůhví jakou bezpečnost a že jen potřebuji nějakým chytrým způsobem schovat konkrétní informace.
Např. bych si mohl udělat funkci, že čísla 1 až 9 převedu na písměna A až J a následně převedu do ASCI a pak to hodím do base64 . A tak spíše zda je nějaká funkce od PHP do které bych vložil jen právě nějaké slovo, které dopomůže to zašifrovat, ale potřebuji při tom slovu to i zpětně dešifrovat.
Ahoj ak už máš db_tabulku vyplnenu a id potrebujes iba ako validaciu ( niečo podobné ako bývajú registračné emaily) tak by som si vytvoril na tvojom mieste ešte stĺpec token_id ktorý bude unique a namiesto id posli jeho.
skript napr: nahodne číslo, ktore preženieš cez md5.
Zobrazeno 18 zpráv z 18.