PHP beyaz liste tabanlı CSS filtreleme preform nasıl

1 Cevap php

Ben bir site üzerinde çalışıyorum ve ben içine özel CSS girebilecek bir kullanıcı halka teşhir edilecektir yapmak istiyorum.

Ancak, XSS saldırıları iyi bir anlaşma CSS ile önceden edilebilir gibi görerek, ben "temiz" CSS çıktı, HTML Purifier nasıl çalıştığını benzer, CSS ayrıştırma için bir yol bulmak mümkün olmak istiyorum , beyaz liste karşı çözümlenen CSS çalışan ve daha sonra ayrıştırılır ve whitelisted CSS dayalı yeni bir stil çıktısı.

Orada böyle bir kitaplık zaten var mı? Eğer değilse, özel bir uygulama oluşturmak için kullanılabilecek bir CSS ayrıştırma kütüphane var?

1 Cevap

Ben kendi CSS ayrıştırıcı ve filtre yazmak için gidiyoruz sanırım, yani ben böyle bir şey yapmadım, ancak burada, ben düşünün ne:

  • Kullanıcıların kullanabilirsiniz kabul CSS özelliklerinin (beyaz) listesini yapın. Gibi: color, font-family.
  • Ben bunu kolayca değerleri ayrıştırmak böylece, en azından başlangıçta, bu tür background gibi kısa el formları izin vermemek için daha iyi olabilir inanıyoruz. Onlar açıkça yazmak gerektirir background-color, background-image.
  • URL'leri istiyorsanız, sadece göreli URL'ler, izin ve hatta yakından bir URL gibi görünmüyor her şeyi atın. Eğer ayrıştırıcı ve doğrulayıcı geliştirmek, böylece, zaten bu konuları açın.
  • Lütfen ayrıştırma çok sıkı olması, sizin ayrıştırıcı geçerli CSS olacağını bile anlamıyor her şeyi atın. Diğer bir deyişle, kendi CSS alt kümesini yapmak.

Ayrıştırma zaman zor kısmı complex CSS selectors ayrıştırma olacaktır. Ama sen de burada kendi alt kümesini empoze edebilirsiniz.

İşte bazı (sözde) kodu belki bir şekilde size yardımcı olacaktır, var:

<?php

function tokenizeCSS() {
    return array(
        array(
            'selector'   => '#foo .bar',
            'properties' => array(
                'background-color' => 'transparent',
                'color'            => '#fff',
            ),
        );
    );
}

function colorValidator($color)
{}

/**
 * This is basically the white list. Keys are accepted CSS properties
 * and values are the validator callbacks.
 */
$propertyValidators = array(
    'background-color' => 'colorValidator',
    'color'            => 'colorValidator',
);

$filteredRules = array();

foreach (tokenizeCSS() as $rule) {
    if (! validSelector($rule['selector'])) {
        continue;
    }

    foreach ($rule['properties'] as $property => $value) {
        /**
         * Check property is in white list
         */
        if (! isset($propertyValidators[$property]) {
            continue;
        }

        /**
         * Check property is valid
         */
        if (! $propertyValidators[$property]($value)) {
            continue;
        }

        /**
         * Valid rule
         */
        $filteredRules[$rule['selector']][$property] = $value;
    }
}