initiator php script achterhalen
Ik bedoel: stel, er is een index.html. In deze html zit een link naar mijnscript.php. Is het dan mogelijk om in mijnscript.php te achterhalen dat deze gestart is door index.html
Ik wil er namelijk zeker van zijn dat de script aangeroepen is door index.html en niet dat iemand in een browser de script aan kan roepen.
De beste oplossing is in dat dat geval om index.php buiten de webroot te plaatsen. Dan kan het bestand niet via de browser worden aangeroepen.
Hoe ga je trouwens vanuit index.html een .php bestand aanroepen?
Wat ik heb gedaan is natuurlijk ook slechts een voorbeeld. Het gaat voor mij om het principe: is het mogelijk om de script/html te achterhalen in een php script, die het script gestart heeft. Je hebt ook __FILE__ die de scriptnaam teruggeeft. Dus zoiets, maar dan de aanroepende file. Ik ben al een hele tijd aan het zoeken op internet, maar nog niets gevonden. Ook met $_SERVER kan je veel opvragen, maar niet de aanroeper. En als het niet kan, dan is dat maar zo.
En bestudeer de resultaten ;-)
Paul van der Kroon op 08/09/2020 23:48:59:
Kan toch met een <a href="mijnscript.php">klik hier</a> (bijvoorbeeld?)
oké, maar dit is in feite ook gewoon een rechtstreekse aanroep, en als ik je goed begrijp wat dat nu net niet de bedoeling.
Wat wil je precies bereiken? Als je even uitlegt wat je wil, en waarom, dan kunnen we je een passende oplossing geven.
Dit is slechts een snelkoppeling. Hiermee wordt je pagina nog niet opgevraagd.
Even terug naar het begin...
> Je typt een URL in in je browser, bijvoorbeeld http://mijndomijn.nl/mijnscript.php
> De browser doet een aanvraag (request) aan de webserver
> De webserver ontdekt dat je een URL opvraagt met een .php extensie en zal OP DE SERVER het script starten.
> Als het script beëindigd is (250 milliseconden later) wordt HET RESULTAAT (of de output) van het script teruggestuurd naar de browser.
> De browser bestudeerd dit resultaat en kijkt of het HTML is of een andere data type en als het HTML is dan zal de browser deze HTML parsen ..
PHP werkt en bestaat dus enkel op de webserver. Een client heeft dus eigenlijk geen enkele invloed op een PHP script behalve dan de publiekelijk toegankelijke scripts te kiezen door de juiste URL aan te roepen.
In PHP worden daarvoor meestal sessies gebruikt, totdat je iets ingewikkelders of iets groters met een database nodig hebt.
In bestand mijnscript.html
In bestand mijnscript.php
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
if ( $_SERVER['HTTP_REFERER'] == '' )
{
echo '<p>Geen referer</p>';
}
if ( $_SERVER['HTTP_REFERER'] <> '' )
{
echo '<p>Komt van <b>' . $_SERVER['HTTP_REFERER'] . '</b></p>';
}
?>
<p>Ga terug naar <a href="mijnscript.html">mijnscript.html</a>.</p>
<p><a href="mijnscript.php">Toon de pagina</a></p>
<p>Of klik in het adresveld van de browser en doe return.</p>
if ( $_SERVER['HTTP_REFERER'] == '' )
{
echo '<p>Geen referer</p>';
}
if ( $_SERVER['HTTP_REFERER'] <> '' )
{
echo '<p>Komt van <b>' . $_SERVER['HTTP_REFERER'] . '</b></p>';
}
?>
<p>Ga terug naar <a href="mijnscript.html">mijnscript.html</a>.</p>
<p><a href="mijnscript.php">Toon de pagina</a></p>
<p>Of klik in het adresveld van de browser en doe return.</p>
Let wel op dat HTTP_REFERER gemanipuleerd kan worden, en onbetrouwbaar kan zijn. Doe er dus geen belangrijke dingen mee.
Ik kreeg altijd van mijn provider een statistiek opgestuurd, met ook vanwaar de website geopend was (dus bijv via Google of een link van een andere pagina). Daarom had ik het vermoeden dat dat ook wordt meegegeven aan het http request en dat het op te vragen is. Blijkbaar is dat niet zo.
Item kan wat mij betreft gesloten worden.
Uit het bovenstaande verhaal wordt niet echt duidelijk wat er aan de hand is. Je zou altijd de access- en wellicht ook je errorlogs kunnen raadplegen om te kijken welke pagina's / bestanden worden opgevraagd en welke statussen worden teruggegeven (zie hieronder).
Een bezoeker of bot kan altijd een niet-bestaande pagina opvragen. Hoe jouw website hier op reageert hangt af van hoe deze geprogrammeerd is. Als je bijvoorbeeld niet expliciet een 404 (pagina niet gevonden) HTTP status code teruggeeft dan zou dit zoekmachines kunnen verwarren omdat jouw site net doet alsof deze pagina "bestaat".
NB alle HTTP-directives worden volgens mij gevuld door je browser. Zoals aangegeven zijn deze niet echt betrouwbaar, noch is het gegarandeerd dat deze altijd ingevuld zijn. Je zou dus altijd eerst moeten controleren of een index bestaat met isset().
Gewijzigd op 09/09/2020 13:03:54 door Thomas van den Heuvel
Maar nogmaals mijn vraag ... wat wil je nu precies bereiken? Wil je iets beveiligen?
Ik wil inderdaad tegenhouden (beveiligen) dat iemand direct via een url de actie kan uitvoeren die eigenlijk vanuit een andere pagina geïnitieerd moet worden. Dus in eerste instantie wordt er een pagina opgebouwd, die een knop heeft om een andere pagina te starten. Dat wordt gedaan met een <a href=""> gedaan. Het is niet de bedoeling dat iemand die url in een browser gaat intypen en uitvoeren. Als ik dat op de een of andere manier kan tegenhouden...
Dan zou ik aan een sessie denken.
PHP-sessie.
1. In de eerste pagina plant je een vlaggetje in de sessie.
2. In de tweede pagina controleer je of dat vlaggetje bestaat. Bestaat het vlaggetje, dan is de eerste pagina inderdaad al bezocht. Bestaat het niet, dan is de eerste pagina nog niet bezocht tijdens de huidige sessie.
Dat kan, zoals gezegd, met een 1. In de eerste pagina plant je een vlaggetje in de sessie.
2. In de tweede pagina controleer je of dat vlaggetje bestaat. Bestaat het vlaggetje, dan is de eerste pagina inderdaad al bezocht. Bestaat het niet, dan is de eerste pagina nog niet bezocht tijdens de huidige sessie.
Kijk, ik had al zo'n vermoeden. Nu komen we ergens.
In de eerste (PHP) pagina:
In de tweede (PHP) pagina:
Op deze manier hoef je niet met sessies te werken.
Een andere oplossing die ik je zou aanraden is om al je PHP-bestanden buiten de webroot te plaatsen, dan kunnen ze nooit via de browser worden aangeroepen. Maar als dat om een of andere reden niet kan, dan is bovenstaande code de oplossing.
Toevoeging op 09/09/2020 16:08:29:
Ik lees nu je antwoord nogmaals. Als je van pagina "wisselt" via <a href=""> dan zul je wel een cookie of sesie moeten gebruiken. Ik ging er vanuit dat je van de ene naar de andere PHP-pagina gaat. In dat geval werkt mijn oplossing. Maar als je de gebruiker laat klikken op een link, zul je het anders moeten oplossen.
Het helpt ook om concreet te beschrijven wat je probeert te bereiken, anders moeten we naar oplossingen blijven gissen.
Sorry Thomas. Dit was niet mijn bedoeling. Ik heb vanaf het indienen van de vraag, het zo duidelijk mogelijk proberen neer te zetten. Ik probeerde al steeds met voorbeelden mijn vraag te verduidelijken. Blijkbaar ben ik daar niet in geslaagd. Ik zal er de volgende keren beter op letten.
Ik denk dat Thomas vraagt of je het nog een keer wat duidelijker wil uitleggen, zodat hij je beter kan helpen :-)
In andere woorden: het is zeer lastig om een soort van concreet voorstel te doen voor een redelijk abstracte probleemstelling.
Ook is het niet helemaal duidelijk waarom het uberhaupt een probleem is dat deze pagina ("mijnscript.php") rechtstreeks aangeroepen kan worden. Indien dit PHP-bestand in de webdirectory staat dan zou dit gewoon moeten kunnen, en is dit normaal gesproken gewoon mogelijk - het bestand is zonder extra toeters en bellen direct opvraagbaar. Anders, als dit toch niet de bedoeling is, is het misschien een kwestie van het bestand verplaatsen naar een niet-rechtstreeks-aanroepbare locatie. Maar voordat iemand zo'n voorstel doet hebben we meer informatie nodig over de aard van het probleem.
Ik mis op dit moment een (analyse van een) concrete situatieschets die leidt tot een probleem, die vervolgens kan leiden tot een oplossing.
Vergelijk het met een doktersbezoek. Indien een patiënt op gesprek komt met vage niet uitgesproken klachten dan kan een arts geen symptomen aanstippen die een mogelijke oorzaak aanwijzen, en kan dan dus ook met geen fatsoen een remedie voorschrijven.
Gewijzigd op 09/09/2020 22:37:43 door Thomas van den Heuvel