Waarom zit er een CRC in compiled filenames?
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;
// 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
Ik denk om conflicten met bestanden van vorige versie te vermijden.
Dan zou je een prefix ervoor kunnen zetten, met bijv. het versienummer, ipv een hele CRC berekenen toch?
Versienummers moet je dan gaan bijhouden. Een afgeleide van de inhoud oid is makkelijker.
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..?
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.
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.
Dan zal hij wel ergens anders de inhoud meepakken.
en nee, hij pakt nergens anders de inhoud mee.
Verder was die gok gebaseerd op logica.
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)
1
2
3
4
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;
$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
Weet je toevallig ook hoe/waar die functie zit?
functie fetch(): Smarty/Smarty.class.php line 1117 ->
functie _get_auto_filename: Smarty/Smarty.class.php line 1741