Waarom zit er een CRC in compiled filenames?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Vriend enzo

vriend enzo

16/11/2011 21:58:02
Quote Anchor link
Ik ben me de afgelopen tijd aan het verdiepen in het maken van een php website, voornamelijk om een CMS te gebruiken. Ik zit er zelfs aan te denken om mijn eigen CMS te ontwikkelen, gewoon omdat het kan!

Ik heb hierdoor verschillende systemen bekeken, maar een vraag die elke keer bij me opkomt is: Waarom zit er een CRC in compiled filenames?
Als voorbeeld neem ik CMS Made Simple, die gebruik maakt van het Smarty template.
De content wordt bij dit systeem opgeslagen in files met een filename, met CRC erin.

De CRC wordt berekend over de filenaam zelf, en meerdere malen (deels) ervoor geplakt.
Voorbeeld:
%%C3^C37^C378FBD0%%tpl_body%3A15.inc
Hierbij is dus:
"C3" de eerste 2 hex van CRC32 berekend over de orginele bestandsnaam ("tpl_body%3A15.inc"),
"C37" de eerste 3 hex van de CRC32,
"C378FBD0" de CRC32,
en als laatste "tpl_body%3A15.inc" de orginele bestandsnaam.

Wat is de toegevoegde waarde van deze CRC?


ps. Een stukje code ter verduidelijking (uit de functie _get_auto_filename van Smarty):
Quote:
if(isset($auto_source)) {
// make source name safe for filename
$_filename = urlencode(basename($auto_source));
$_crc32 = sprintf('%08X', crc32($auto_source));
// prepend %% to avoid name conflicts with
// with $params['auto_id'] names
$_crc32 = substr($_crc32, 0, 2) . $_compile_dir_sep .
substr($_crc32, 0, 3) . $_compile_dir_sep . $_crc32;
$_return .= '%%' . $_crc32 . '%%' . $_filename;
}

return $_return;
Gewijzigd op 16/11/2011 22:01:32 door Vriend enzo
 
PHP hulp

PHP hulp

17/11/2024 17:14:21
 
- Ariën  -
Beheerder

- Ariën -

16/11/2011 22:01:02
Quote Anchor link
Ik denk om conflicten met bestanden van vorige versie te vermijden.
 
Vriend enzo

vriend enzo

16/11/2011 22:09:32
Quote Anchor link
Dan zou je een prefix ervoor kunnen zetten, met bijv. het versienummer, ipv een hele CRC berekenen toch?
 
Jelmer -

Jelmer -

17/11/2011 12:07:23
Quote Anchor link
Versienummers moet je dan gaan bijhouden. Een afgeleide van de inhoud oid is makkelijker.
 
Vriend enzo

vriend enzo

17/11/2011 12:20:44
Quote Anchor link
Dat kan niet kloppen. Een vaste prefix programmeren is vele malen sneller dan een functie schrijven/gebruiken voor het berekenen van een CRC en die als prefix gebruiken.

Bovendien moet dan voor elke versie een nieuwe functie gemaakt worden, omdat de CRC van die filenaam elke keer hetzelfde zal blijven.

Ik geloof dat het meer in de richting van beveiliging zit, maar hoe dit zou moeten werken..?
 
Jacco Brandt

Jacco Brandt

17/11/2011 15:49:45
Quote Anchor link
Er word dan ook een CRC van de INHOUD van het bestand gemaakt. Bij een nieuwe versie verschilt deze, waardoor je eigenlijk alleen nieuwe bestanden hebt. Omdat dit berekenen ongelofelijk snel gaat, kost dit amper extra tijd. Dit is inderdaad gedaan om bestandconflicten te vermijden.
 
Vriend enzo

vriend enzo

17/11/2011 18:15:21
Quote Anchor link
Volgens mij is ook dit niet juist.
Er wordt geen CRC over de inhoud berekend, alleen over de naam.

de crc32() functie berekend de CRC over een string, dit geval de $auto_source.
$auto_source is een string met de volledige bestandsnaam.

crc32() berekend nu alleen de CRC over de bestandsnaam, welke hetzelfde zal blijven.
 
Jacco Brandt

Jacco Brandt

17/11/2011 19:13:46
Quote Anchor link
Dan zal hij wel ergens anders de inhoud meepakken.
 
Vriend enzo

vriend enzo

17/11/2011 19:22:47
Quote Anchor link
Dat is een wilde gok en nergens op gebaseerd.
en nee, hij pakt nergens anders de inhoud mee.
 
Jacco Brandt

Jacco Brandt

17/11/2011 20:34:41
Quote Anchor link
Heb je de complete code anders ergens staan? Ik kan namelijk wel blijven gokken, maar daar schieten we niets mee op.

Verder was die gok gebaseerd op logica.
 
Vriend enzo

vriend enzo

17/11/2011 21:29:21
Quote Anchor link
natuurlijk:
hier is het CMS te downloaden wat ik aan het "ontleden" ben. http://www.cmsmadesimple.org/

Nog wat specifieker is het Smarty template wat gebruikt wordt(de template engine): http://www.smarty.net/.

Heel specifiek is: Smarty/Smarty.class.php line 1741, function _get_auto_filename


Even in het kort hoe/wanneer deze functie gebruikt wordt:
Om de content genereren om te tonen aan de gebruiker, wordt de volgende code gebruikt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
$top  = $smarty->fetch('tpl_top:'.$contentobj->TemplateId());
$body = $smarty->fetch('tpl_body:'.$contentobj->TemplateId());
$head = $smarty->fetch('tpl_head:'.$contentobj->TemplateId());
$html = $top.$head.$body;


De functie fetch() (Smarty/Smarty.class.php line 1117) leest de data uit, en roept o.a. de "rare" functie _get_auto_filename() aan. Deze berekend de gebruikte filename.
Gewijzigd op 17/11/2011 21:30:02 door vriend enzo
 
Jacco Brandt

Jacco Brandt

17/11/2011 22:01:00
Quote Anchor link
Weet je toevallig ook hoe/waar die functie zit?
 
Vriend enzo

vriend enzo

17/11/2011 22:11:52
Quote Anchor link
genereren van content: index.php van het CMS Made Simple ->
functie fetch(): Smarty/Smarty.class.php line 1117 ->
functie _get_auto_filename: Smarty/Smarty.class.php line 1741
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.