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

XSS杀手

WBOY
WBOYOriginal
2016-06-06 19:35:071230Durchsuche

根据白名单对字符串进行过滤。如果字符串包含白名单意外的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
Stellungnahme:
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
Vorheriger Artikel:常用自定义函数Nächster Artikel:gps 搜索附近坐标