Maison > php教程 > php手册 > le corps du texte

XSS杀手

WBOY
Libérer: 2016-06-06 19:35:07
original
1185 Les gens l'ont consulté

根据白名单对字符串进行过滤。如果字符串包含白名单意外的html标签,或者白名单允许的标签但属性不在白名单内,则这些部分会被过滤掉。 无 ?php/** * Prevent XSS. * * @author liuxd */class XssFilter{ /** * 设置标签和属性的白名单。 * @param array $p_a

根据白名单对字符串进行过滤。如果字符串包含白名单意外的html标签,或者白名单允许的标签但属性不在白名单内,则这些部分会被过滤掉。
<?php
/**
 * Prevent XSS.
 *
 * @author liuxd
 */
class XssFilter
{
    /**
     * 设置标签和属性的白名单。
     * @param array $p_aTags
     * @param array $p_aAttr
     */
    public function __construct($p_aTags, $p_aAttr)
    {
        $this->aTags = $p_aTags;
        $this->aAttr = $p_aAttr;
    }
 
    /**
     * 过滤器。
     * @param string $p_sInput
     * @return string
     */
    public function filter($p_sInput)
    {
        $aMatches = [];
        $sPattern = '/<([a-zA-Z]+).*>.*<\/\1>/';
        preg_match_all($sPattern, $p_sInput, $aMatches);
        $sInput = $p_sInput;
 
        if (empty($aMatches[1])) {
            return $sInput;
        }
 
        list ($aContents, $aTags) = $aMatches;
 
        foreach ($aTags as $iKey => $sTag) {
            if (!in_array($sTag, $this->aTags)) {
                // 标签不合法
                $sInput = str_replace($aContents[$iKey], '', $sInput);
            } else {
                $aTag = [];
                preg_match('/<' . $sTag . '.*?>/', $aContents[$iKey], $aTag);
                $aAttr = explode(' ', $aTag[0]);
 
                if (!$this->checkAttr($aAttr)) {
                    // 标签虽然合法,但是包含了不合法的属性。
                    $sInput = str_replace($aContents[$iKey], '', $sInput);
                }
            }
        }
 
        return trim($sInput);
    }
 
    /**
     * 检查合法标签是否有非法属性。
     * @param array $p_aAttr 标签熟悉列表
     * @return bool
     */
    private function checkAttr($p_aAttr)
    {
        $bResult = true;
 
        foreach ($p_aAttr as $sAttr) {
            $sAttrName = strstr($sAttr, '=', true);
 
            if ($sAttrName === false) {
                continue;
            }
 
            if (!in_array($sAttrName, $this->aAttr)) {
                $bResult = false;
            }
        }
 
        return $bResult;
    }
 
}
 
# end of this file
Copier après la connexion
Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!