[PHP] Bepalen welk bestand een plaatje aanroept

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Binnen mij CMS wil ik bijhouden welke (naar de server geuploade) plaatjes waar binnen de website gebruikt worden. Dit kan zijn op een pagina, in een .js of .css bestand. Hiervoor heb ik de volgende in .htaccess:

code:
1
RewriteRule ^/?image\/(.+)$ modules/image/image.php?q=$1 [L,QSA]


Deze regel herschrijft site.com/image/britney.png naar modules/image/image.php?q=britney.png. Het bestand image.php ziet er als volgt uit:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$image = CMS_IMG_PATH . $_GET['q'];

if (empty($image) || !file_exists($image)) {
  exit;
}

if (isset($_SERVER['HTTP_REFERER'])) {
  db_query("INSERT INTO {images_nodes} (referer, image) VALUES ('%s', '%s')",
    $_SERVER['HTTP_REFERER'], $_GET['q']
  );
}

$fp = fopen($image, 'rb');
header("Content-Type: " . mime_content_type($image));
header("Content-Length: " . filesize($image));
fpassthru($fp);
exit;

Als ik op de pagina site.com/zangeressen/britney de volgende HTML plaats, dan bevat $_SERVER['HTTP_REFERER'] de waarde "http://site.com/zangeressen/britney", dat werkt dus fijn:
HTML:
1
2
Dit is Britney en zij is nu weer best lekker aan het worden:
<img src="image/britney.png">

Maar nu het probleem: dit werkt niet met geinclude css en js bestanden. Als ik bijvoorbeeld een css bestand aanmaak dat ik op site.com/zangeressen/britney aanroep, bevat de HTTP_REFERER ook http://site.com/zangeressen/britney in plaats van http://site.com/style.css:
HTML:
1
2
3
4
5
6
7
8
9
10
// site.com/style.css
#britney {
  background: url(image/britney.png);
}

// site.com/zangeressen/britney
<link rel="stylesheet" href="style.css" type="text/css">
<div id="britney">
  Dit is Britney en zij is nu weer best lekker aan het worden
</div>

Nu kan ik natuurlijk in de css een querystring aan het plaatje plakken en dit dan weer op image.php uitlezen:
Cascading Stylesheet:
1
2
3
#britney {
  background: url(image/britney.png?file=style.css);
}

Maar dat is niet gebruiksvriendelijk. Uiteindelijk moeten gebruikers gewoon image strings kunnen tikken en ik wil niet van hun verwachten dat ze achter elk plaatje een querystring met aanroepend bestand moeten tikken.

Mijn vraag is: hoe kan ik in deze situatie toch uitlezen dat britney.png vanuit style.css wordt aangeroepen? Ik heb alle $_SERVER variabelen geprobeerd, maar geen van ze bevat de info die ik nodig heb. Is er een andere $GLOBAL die ik kan gebruiken of moet er iets gebeuren met unobtrusive javascript? En zo ja, wat dan? En kan ik dan nog wel dat css bestand als losse file aanroepen? Vragen...vragen... :+

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • robbert
  • Registratie: April 2002
  • Nu online
Geen antwoord op je vraag, maar:
Reveller schreef op vrijdag 07 november 2008 @ 16:53:
PHP:
1
2
3
4
5
6
7
8
9
$image = CMS_IMG_PATH . $_GET['q'];

....

$fp = fopen($image, 'rb');
header("Content-Type: " . mime_content_type($image));
header("Content-Length: " . filesize($image));
fpassthru($fp);
exit;
wat als ik nu eens $_GET['q'] = "../config/jouwdatabaseconfig.php" doe? Niet te vergeten die SQL injection, of zorgt db_query ervoor dat zooi wordt geescaped?

[ Voor 14% gewijzigd door robbert op 07-11-2008 17:09 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Wat heeft een gebruiker in godesnaam in jouw CSS-file te zoeken? Daarnaast is een referer uiterst onbetrouwbaar; bij sommige browsers wordt die niet eens meegegeven. Je zal toch echt op een andere manier door moeten geven van waaruit je je file opvraagt. Misschien moet je de mogelijke bronnen een aparte "map" geven? image/css/britney.png, image/html/britney.png, image/js/britney.png, enz. Een andere goeie oplossing lijkt me niet aanwezig.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
robbert schreef op vrijdag 07 november 2008 @ 17:01:
wat als ik nu eens $_GET['q'] = "../config/jouwdatabaseconfig.php" doe? Niet te vergeten die SQL injection, of zorgt db_query ervoor dat zooi wordt geescaped?
Dit is natuurlijk een vereenvoudigde weergave. Ten eerste kijk ik of "q" ueberhaupt een plaatje is, bovendien escaped db_query inderdaad...
-NMe- schreef op vrijdag 07 november 2008 @ 17:08:
Wat heeft een gebruiker in godesnaam in jouw CSS-file te zoeken?
Binnen mijn cms hebben gebruikers de mogelijkheid eigen css bestanden te definieren. Het CMS wordt geleverd met een door mij gemaakte layout (of door een designer), of door de gebruiker zelf...is dan uiteraard ook zelf verantwoordelijk voor fouten.
Daarnaast is een referer uiterst onbetrouwbaar; bij sommige browsers wordt die niet eens meegegeven. Je zal toch echt op een andere manier door moeten geven van waaruit je je file opvraagt. Misschien moet je de mogelijke bronnen een aparte "map" geven? image/css/britney.png, image/html/britney.png, image/js/britney.png, enz.
Dat is inderdaad een optie, maar ik kan zo al wel ook een paar nadelen daarvan verzinnen, bijvoorbeeld fouten door de gebruiker ingetikt.
Een andere goeie oplossing lijkt me niet aanwezig.
Is er geen andere manier, bv. via backtrace, om zo'n bestand te bepalen?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Reveller schreef op vrijdag 07 november 2008 @ 17:29:
Dat is inderdaad een optie, maar ik kan zo al wel ook een paar nadelen daarvan verzinnen, bijvoorbeeld fouten door de gebruiker ingetikt.
Als een gebruiker fouten maakt in images/css/britney.png dan doet hij dat ook wel zonder dat extra submapje. Iemand die dat soort fouten maakt heeft in de eerste instantie al niks te zoeken in die CSS-file.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
-NMe- schreef op vrijdag 07 november 2008 @ 17:47:
[...]

Als een gebruiker fouten maakt in images/css/britney.png dan doet hij dat ook wel zonder dat extra submapje. Iemand die dat soort fouten maakt heeft in de eerste instantie al niks te zoeken in die CSS-file.
Dat klopt opzich wel, maar een beetje website heeft al snel meerdere css bestanden. Je zou dan dus een aantal van dit soort paden krijgen: images/css-global/britney.css, images/css-forum/christina.jpg, image/css-ie7/jessica.gif. Dat kan opzich wel, maar als je dan de .css zou hernoemen, zou je eigenlijk ook alle url img-paden in die css moeten hernoemen. Ik wil echt niet moeilijk doen, en dit is zeker wel een optie, maar ik hoop dat iemand nog een andere manier heeft, bijvoorbeeld door de .htaccess aan te passen? Door gebruik te maken van de logfiles (hoewel dat ws. nogal overkill zal geven)?

[ Voor 6% gewijzigd door Reveller op 07-11-2008 22:17 ]

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
Zomaar een idee, dat ik gebruik voor mijn debugger: Werk met sessies. Geen idee hoe betrouwbaar dat is, maar ik heb er goede ervaringen mee:

Bij het openen van een pagina schrijf je pagina_id of url of whatever weg naar de sessie, alle requests die daarna komen horen bij die pagina en halen de id uit de sessie. Werkt bij mijn debugger iig prima in FF en IE6/7...

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Dan ben je toch nog steeds niks verder? Als je een sessie start in je HTML-bestand, welke een CSS-bestand aanroept die weer verwijst naar een image, dan wil de topicstarter de CSS-file doorkrijgen. Met jouw sessie-idee krijgt hij dan alsnog de HTML-file.

Ik blijf overigens bij mijn idee. Je bent nu gebruikers aan het beschermen tegen iets waar ze niet voor beschermd hoeven worden. Iemand die problemen heeft met het overnemen van een linkje op de goede manier heeft niks te zoeken in wat je ook maakt om die links aan te passen. Ik heb een keer op die manier een website gemaakt, en daar kwam door Word gegenereerde HTML-code in terecht en de linkjes gingen naar C:\Documents and Settings\....\Mijn afbeeldingen. :X Mag je drie keer raden wie dan alsnog mag langskomen om het op te lossen. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • TheDane
  • Registratie: Oktober 2000
  • Laatst online: 16:30

TheDane

1.618

Kun je niet vanuit je CMS de logfiles van je webserver parsen? Daar staat volgens mij toch echt wel ieder opgevraagd bestand in vernoemd, ook diegenen die in je css file staan? Volgens mij kun je overigens best meerdere logfiles gebruiken, afhankelijk zelfs van ingelogde gebruiker, (sub-)domein of virtual host etc. etc. Ben je er dan niet? Zonder al te veel overhead.

Verder zie ik inderdaad net als NMe niet goed wat 't doel van je vraag nou echt is..
Pagina: 1