php HTTP Referer

Programovacie jazyky, rady, poradňa...
LongShot
Amateur
Amateur
Príspevky: 11
Registrovaný: 24 nov 2009, 18:16

php HTTP Referer

Príspevok od používateľa LongShot »

kedze ide o HTTP metodu, je mi jasné že sa dá obísť. ale ja by som potreboval vedieť ako, konkrétny príklad.

dajme tomu ze mame a.php a potrebujeme sa dostat do b.php s tym, ze v b.php presmerujeme inde ak sme nedosli zo stranky a.php -
ja praveze chcem vymysliet co najucinejsi sposob ako toto osetrit, len na to musím vôbec vedieť ako sa to dá obísť.

nevedel by mi niekto poradiť? na nete som hladal, ale ono to chce asi aj blizsie specifikovať a tak.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

najjednoduchšie to obídeš tak, že si nainštaluješ nejaký addon do prehliadača. Ja mám napríklad RefControl vo firefoxe, kde si môžem nastaviť stránku ktorú má vždy posielať ako referera, prípadne blokovať referera a pod..

a ako to ošetriť: možno by si do session mohol ukladať poslednú stránku (toto ukladanie ale budeš musieť dať na všetky svoje podstránky) a danej stránke zkontrolovať nie referera z http hlavičky, ale toho svojho zo session
LongShot
Amateur
Amateur
Príspevky: 11
Registrovaný: 24 nov 2009, 18:16

Príspevok od používateľa LongShot »

inak ten RefControl je zaujímavá vec, ale akosi mi nefunguje. Dá sa nastaviť aj na localhost? dal som globálne blokovanie refereru na localhoste a nič, stále to ide.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

na localhost som to nikdy neskúšal, ale dajú sa definovať vlastné stránky. SKús (ak teda má ten istý refcontrol ako ja)
Prílohy
plocha.gif
(90.62 KiB) 129 stiahnutí
LongShot
Amateur
Amateur
Príspevky: 11
Registrovaný: 24 nov 2009, 18:16

Príspevok od používateľa LongShot »

Inak je to uz ok, spravil som to teda tak ze ziadny referer nakoniec netreba a fakci to:) takze dik.
ale inak na localhost sa to pouzit dá, skusal som.

//autoeditácia príspevku ( 25 Dec 2009, 13:25 )
ale stejne mal by som tento problém, ktorý už naozaj neviem riešiť.

ako som povedal mame tie 1.php a 2.php,
na subore 1.php je ajax kod ktory posle nahodne vygenerovane data do suboru 2.php, ten ich spracuje a zapíše do nejakého txt.

už som si aj ošetril v 2.php tie POST data ktore prisli aby boli v ramci v norme, tyhc ktore sa mozu vygenerovat. toto by pomohlo ale len vted keby si tam dotycny mohol hadzat hodnoty ake chce, to by bolo lahsie pre mna ale takto je to na nic...

lebo on má nieco taketo:

<form action="/data.php/" method=post>
<input type=hidden name=a value=400>
<input type=submit>
</form>

no a kedze je to nahodne, tak mi to prepíše na iný záznam proste...
a ja uz naozaj neviem ako sa voci tomuto obrániť. už som skusal rozne veci, HTTP referer nebude fungovať, skusal som aj tokeny no tie tu stracaju zmysel a ja si uz neviem rady.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

rovnako ako v predchádzajúcom prípade, zase môžeš využiť session. Pri generovaní hodnoty (ak je to cez php) si tú hodnotu ulož do session a pri poslaní si na 2.php overíš či sedia. Ak tú hodnotu generuješ cez javascript, tak to bude komplikovanejšie ale nie nereálne
LongShot
Amateur
Amateur
Príspevky: 11
Registrovaný: 24 nov 2009, 18:16

Príspevok od používateľa LongShot »

lenže ja to zapisujem v 2.php, teda určenie tych sessions by som musel opat tam, a tym padom to straca ucinnost.
už som aj uvazoval ze to dat do toho jedneho suboru teda 1.php ale je tam velke monzstvo dat ktore spracovavam takze to by som sa s toho zblaznil potom.

nemohol by si mi dat priklad na to? proste 1.php a 2.php a nejak tak to spravit jak tvrdíš, potom by som azda pochopil lepšie.
lebo už som s tohto problému na ktorom stojím už tyzden unavený.
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Aj keď to budeš mať v jednom súbore, problém budeš mať úplne rovnaký.

Netuším, čo presne chceš robiť, takže neviem, ako to vyriešiť, každopádne nie je problém si to, čo máš v tom form ako skrytý prvok nie je problém dať do session (ale vhodné riešenie môže byť úplne iné, záleží to od toho, čo presne robíš).
LongShot
Amateur
Amateur
Príspevky: 11
Registrovaný: 24 nov 2009, 18:16

Príspevok od používateľa LongShot »

potrebujem zabranit tomu aby form action z ineho suboru zmenil nahodne data generovane v tom 2.php. a to tak, aby bol k nemu ale pristup z 1.php
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

HTTP je bezstavový protokol, takže či už to bude v jednom php súbore, alebo v dvoch nehrá žiadnu rolu (aj keby si to dal do jedného súboru, mal by si úplne rovnaké problémy, ako keď to máš v dvoch súboroch).

Ak chceš, aby používateľ nemohol zmeniť nejaké údaje, tak ich nedávaj do toho formulára.
LongShot
Amateur
Amateur
Príspevky: 11
Registrovaný: 24 nov 2009, 18:16

Príspevok od používateľa LongShot »

čo sa týka použitia tokenov, dal som to takto:


1.php

Kód: Vybrať všetko

<!DOCTYPE html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
<link rel="stylesheet" href="style.css">

</head>

<title>
</title>

<body>

<?php

session_start();

$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = $token;

echo "<input type='button' onclick='aktivuj_request();' value='Start Ajax' name='send'><br>";
echo "<span id='nieco'></span>";

?>

</body>

</html>

<script type="text/javascript">

var udaj = document.getElementById("nieco");

function aktivuj_request()
{

var xhr = new XMLHttpRequest();
xhr.open('POST','2.php?id=<?php echo $token ?>',true);
xhr.onreadystatechange = function()
{
    if (xhr.readyState == 4){      
      var vysledok = xhr.responseText;
      udaj.innerHTML = vysledok;
    }

}

if (xhr.overrideMimeType) xhr.setRequestHeader('Connection', 'close');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

xhr.send('a='+encodeURIComponent(udaj.innerHTML));

}

</script>
2.php

Kód: Vybrať všetko

<?php

session_start();

if(empty($_POST)){

Header("Location: inde.php");

}
else{

if($_SESSION['token'] == $_GET['id']){

$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = $token;

$random_cars = array(
"Audi R8",
"Ford GT",
"Porsche Carrera GT",
"Lamborghini Gallardo",
"Ferrari Enzo"
);

$cislo = rand(0,4);

 $subor = "subor.txt";
 $fh = fopen($subor, 'w');
 fwrite($fh, $random_cars[$cislo]);
 fclose($fh);

echo $random_cars[$cislo];

}

}

?>
Všetci mi radia tokeny...ale ja nechápem ich využitie v tomto smere, pretože napr. ked otvoríte vo Firebugu javascript časť kodu, tak vidíte ten vygenerovaný token a viete čo zadať do form actionu.
to by chcelo možno nejak tu adresu zamaskovať, ja neviem už...

tie dva kody tak stracaju účinnosť, kedze v tom čo robím nesmie byť refresh nemôžem tam nejak zvlásť posielať veci...a tak
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

A nie je jedno, či sa to odošle "normálne" cez formulár, alebo nejakou úpravou cez Firebug? (všetku činnosť robí server, takže v prehliadači sa to len zobrazí a iba raz po tom, ako sa zobrazí ten index, keďže potom už je ten token neplatný).
LongShot
Amateur
Amateur
Príspevky: 11
Registrovaný: 24 nov 2009, 18:16

Príspevok od používateľa LongShot »

chrono napísal:A nie je jedno, či sa to odošle "normálne" cez formulár, alebo nejakou úpravou cez Firebug? (všetku činnosť robí server, takže v prehliadači sa to len zobrazí a iba raz po tom, ako sa zobrazí ten index, keďže potom už je ten token neplatný).
no ano, ale co by si teda radil? zostať pri tých tokenoch, iné riešenie, alebo to celé nejak prepísať inak (ešte dobre povedať ako)?
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

kľudne to môže byť tak ako máš. To že užívateľ vidí token je úplne jedno, lebo ten token má platnosť iba na jedno vykonanie. Prípadne to môžeš ešte obmedziť časovo, že bude mať platnosť iba určitú dobu
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

LongShot napísal:no ano, ale co by si teda radil? zostať pri tých tokenoch, iné riešenie, alebo to celé nejak prepísať inak (ešte dobre povedať ako)?
Neviem, čo by som ti poradil, keďže stále netuším, čo presne chceš dosiahnuť (pretože v tom, čo si poslal tie tokeny budú stačiť a stačila by tam aj obyčajná session bez tokenov). :)
Napísať odpoveď