Необходимо добавить новую строку между include () ed css файлами - PullRequest
0 голосов
/ 03 апреля 2011

У меня есть куча CSS-файлов, которые загружаются на каждую страницу (верхний колонтитул, глобальный, главная страница, нижний колонтитул и т. Д.).

Я написал простой PHP-скрипт, который компилирует их в одну строку и затем выводит эту строку.

<?php
    set_include_path('../');
    header('Content-Type: text/css');

    $q = $_GET['q'];

    $patterns = array(
                        '/.*[\.]{2,}.*/',
                        '/,\//',
                        '/^\//'
                    );

    $replacements = array(
                        '',
                        ',',
                        ''
                    );

    $q = preg_replace($patterns, $replacements, $q);

    $css = explode(",", $q);

    $output = '';

    foreach( $css as $link )
    {
        $output .= include($link);
    }

    print $output;
?>

это можно назвать (и как я я называю это) так:

<?php
$cssLinks = array(
                    "/global/global.css",
                    "/styles/local.css",
                    $tmpl->headerContent['css']['link'],
                    $tmpl->appContent['css']['link'],
                    "/styles/css3buttons.css"
             );
$css = implode(",", $cssLinks);
?>
<link rel="stylesheet" href="/components/CSS.php?q=<?= $css; ?>" type="text/css" />

Что приводит к такой строке:

<link rel="stylesheet" href="/components/CSS.php?q=/global/global.css,/styles/local.css,/styles/header.css,/styles/index.css,/styles/css3buttons.css" type="text/css" />

Это нормально, и, что более важно, работает .

Тогда какой у меня вопрос, спросите вы?

Это два участника:

  1. Какие уязвимости безопасности я пропускаю в скрипте?
    • Я удалил все возможности обхода каталогов, но что еще?
    • Мне нужно уметь изменять ссылки, поэтому я не могу жестко закодировать их в этот скрипт. Например, $tmpl->appContent['css']['link'] - это динамическая таблица стилей для каждой страницы, которых будет много.
  2. Как добавить разрывы строк между включенными файлами?
    • Я добавил $output .= '\n\n'; в цикл foreach(), но он не работает.
    • Я все еще застрял с выводом вроде:

#footer, #push {
height: 3em;
padding-top: 1em;
}#header{

CSS в списке работает , но я бы предпочел, чтобы блок #header был на две строки ниже, например:

#footer, #push {
height: 3em;
padding-top: 1em;
}

#header{

(я извиняюсь за странный блок кода, Markdown ужасно сломался на этих хешах, и я не мог понять, как это исправить).

Обратите внимание, что отсутствие разрывов строк происходит только на стыке двух разных файлов. Код внутри каждого CSS-файла форматируется так, как и должно быть.

Ответы [ 2 ]

0 голосов
/ 03 апреля 2011

Вы должны предпочесть передавать только базовые имена в скрипт слияния CSS.php:

<link rel="stylesheet" href="CSS.php?q=global,local,header,index,css3buttons" type="text/css" >

Тогда становится безопаснее реализовать в CSS.php всего с:

preg_match_all('#\w+#', $_GET["q"], $files);

foreach ($files[0] as $fn) {

     foreach (array("global/$fn.css", "local/$fn.css") as $fn)
         if (file_exists($fn)) 
            $content .= file_get_contents($fn);

     $content .= "\n\n";

}

Единственное отличие состоит в том, что этот скрипт теперь обладает небольшим интеллектом и знает, где искать таблицы стилей. Таким образом, вы не потеряете гибкость склеивания различных частей таблицы стилей.

0 голосов
/ 03 апреля 2011

В отношении уязвимостей безопасности:

  • Любое включение несколько опасно.Он будет выполнять любые файлы, указанные в виде скрипта PHP.Если он содержит не-PHP-код, такой как CSS, гораздо безопаснее просто использовать readfile ().
  • Очень сложно гарантировать отсутствие обратного хода в каталогах.У вас все еще есть возможность показать любой файл в системе, к которому у веб-сервера есть доступ для чтения.
  • Как насчет серверов Windows, которые используют \ в пути включения?

ВЧто касается второго вопроса, отправьте точный код, который не работает.Вы говорите, что пытались. = '\ N \ n', который должен был вводить буквальные символы \ n \ n (в отличие от "\ n \ n").Если вы использовали двойные кавычки, то это должно сработать.Если вы не просматривали файл в редакторе, который хочет \ r \ n.В любом случае, трудно сказать, не увидев конкретный неработающий код.

Лично вам лучше просто генерировать множество тегов ссылок, чем пытаться объединить эти сценарии вместе.Полагаю, у тебя есть причина.

...