Heim > php教程 > php手册 > XSS杀手

XSS杀手

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Freigeben: 2016-06-06 19:35:07
Original
1238 Leute haben es durchsucht

根据白名单对字符串进行过滤。如果字符串包含白名单意外的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
Nach dem Login kopieren
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage