最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP中HTML標(biāo)簽過濾的5種有效方法

 更新時(shí)間:2025年10月13日 08:50:04   作者:lskblog  
在Web開發(fā)中,跨站腳本攻擊(XSS)是最常見的安全威脅之一,本文將詳細(xì)介紹PHP中5種有效的HTML標(biāo)簽過濾方法,幫助開發(fā)者構(gòu)建更安全的Web應(yīng)用,需要的朋友可以參考下

什么是XSS攻擊?

XSS(Cross-Site Scripting)攻擊是指攻擊者在網(wǎng)頁中插入惡意腳本,當(dāng)其他用戶瀏覽該頁面時(shí),惡意腳本會(huì)被執(zhí)行,從而盜取用戶信息、會(huì)話令牌或進(jìn)行其他惡意操作。

方法一:htmlspecialchars() - 最常用的轉(zhuǎn)義方法

htmlspecialchars() 是PHP中最基本的XSS防護(hù)函數(shù),它將特殊字符轉(zhuǎn)換為HTML實(shí)體:

<?php
$input = '<script>alert("XSS攻擊")</script><p>正常內(nèi)容</p>';
$safe_output = htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
echo $safe_output;
// 輸出:&lt;script&gt;alert(&quot;XSS攻擊&quot;)&lt;/script&gt;&lt;p&gt;正常內(nèi)容&lt;/p&gt;

參數(shù)詳解:

  • ENT_QUOTES:轉(zhuǎn)換雙引號(hào)和單引號(hào)
  • UTF-8:指定字符編碼,防止編碼繞過攻擊

適用場(chǎng)景: 純文本輸出,不需要保留任何HTML格式

方法二:strip_tags() - 徹底移除HTML標(biāo)簽

如果你確定不需要任何HTML標(biāo)簽,使用strip_tags()可以徹底移除它們:

<?php
$input = '<script>alert("XSS")</script><p>正文內(nèi)容</p><b>加粗文本</b>';
$safe_output = strip_tags($input);
echo $safe_output;
// 輸出:alert("XSS")正文內(nèi)容加粗文本

選擇性保留標(biāo)簽:

<?php
$input = '<script>alert("XSS")</script><p>正文</p><b>加粗</b><i>斜體</i>';
$safe_output = strip_tags($input, '<p><b>'); // 只保留<p>和<b>標(biāo)簽
echo $safe_output;
// 輸出:<p>正文</p><b>加粗</b>斜體
  • 優(yōu)點(diǎn): 簡單直接,性能好
  • 缺點(diǎn): 無法過濾標(biāo)簽內(nèi)的屬性

方法三:filter_var() - 使用PHP過濾器擴(kuò)展

PHP過濾器擴(kuò)展提供了更規(guī)范的過濾方式:

<?php
$input = '<script>alert("XSS")</script><p>正常內(nèi)容</p>';
$safe_output = filter_var($input, FILTER_SANITIZE_STRING);
echo $safe_output;
// 輸出:alert("XSS")正常內(nèi)容

// 專門用于過濾HTML
$html_output = filter_var($input, FILTER_SANITIZE_FULL_SPECIAL_CHARS);

方法四:HTMLPurifier - 企業(yè)級(jí)解決方案

對(duì)于需要保留安全HTML內(nèi)容的場(chǎng)景,HTMLPurifier是最佳選擇:

安裝方法:

composer require ezyang/htmlpurifier

使用示例:

<?php
require_once 'vendor/autoload.php';

$config = HTMLPurifier_Config::createDefault();
// 自定義配置
$config->set('HTML.Allowed', 'p,br,strong,em,ul,ol,li,a[href]');
$config->set('AutoFormat.RemoveEmpty', true);

$purifier = new HTMLPurifier($config);

$input = '<script>alert("XSS")</script><p class="test">安全內(nèi)容</p><a  rel="external nofollow"  rel="external nofollow" >鏈接</a>';
$safe_output = $purifier->purify($input);
echo $safe_output;
// 輸出:<p>安全內(nèi)容</p><a  rel="external nofollow"  rel="external nofollow" >鏈接</a>

優(yōu)勢(shì):

  • 遵循HTML標(biāo)準(zhǔn)
  • 支持細(xì)粒度配置
  • 能過濾危險(xiǎn)的標(biāo)簽屬性
  • 社區(qū)活躍,持續(xù)更新

方法五:自定義過濾函數(shù)

針對(duì)特定需求,可以創(chuàng)建自定義過濾函數(shù):

<?php
function advanced_xss_clean($data) {
    if (empty($data)) return '';
    
    // 遞歸處理數(shù)組
    if (is_array($data)) {
        return array_map('advanced_xss_clean', $data);
    }
    
    // 移除NULL字節(jié)
    $data = str_replace(chr(0), '', $data);
    
    // 轉(zhuǎn)換特殊字符
    $data = htmlspecialchars($data, ENT_QUOTES | ENT_HTML5, 'UTF-8', true);
    
    // 移除危險(xiǎn)的JavaScript模式
    $patterns = [
        '/javascript:/i',
        '/vbscript:/i',
        '/on\w+\s*=/i',    // 移除onclick等事件屬性
        '/expression\s*\(/i' // 移除CSS表達(dá)式
    ];
    
    foreach ($patterns as $pattern) {
        $data = preg_replace($pattern, '', $data);
    }
    
    return $data;
}

// 使用示例
$input = '<img src="javascript:alert(1)" onclick="malicious()">';
echo advanced_xss_clean($input);
?>

實(shí)戰(zhàn):根據(jù)不同場(chǎng)景選擇防護(hù)策略

場(chǎng)景1:用戶評(píng)論(允許有限HTML)

<?php
function filter_comment($content) {
    $allowed_tags = '<p><br><strong><em><ul><ol><li><a>';
    $content = strip_tags($content, $allowed_tags);
    
    // 進(jìn)一步使用HTMLPurifier進(jìn)行嚴(yán)格過濾
    require_once 'HTMLPurifier.auto.php';
    $purifier = new HTMLPurifier();
    return $purifier->purify($content);
}
?>

場(chǎng)景2:顯示用戶名(純文本)

<?php
function filter_username($username) {
    return htmlspecialchars(trim($username), ENT_QUOTES, 'UTF-8');
}
?>

場(chǎng)景3:URL參數(shù)

<?php
function filter_url($url) {
    $url = filter_var($url, FILTER_SANITIZE_URL);
    if (filter_var($url, FILTER_VALIDATE_URL)) {
        return htmlspecialchars($url, ENT_QUOTES, 'UTF-8');
    }
    return '';
}
?>

完整的安全防護(hù)示例

<?php
class SecurityHelper {
    
    public static function xss_clean($data, $context = 'text') {
        if (empty($data)) return $data;
        
        if (is_array($data)) {
            return array_map([self::class, 'xss_clean'], $data);
        }
        
        switch ($context) {
            case 'html':
                // 使用HTMLPurifier處理富文本
                return self::purify_html($data);
                
            case 'attribute':
                // 用于HTML屬性
                return self::escape_attribute($data);
                
            case 'text':
            default:
                // 純文本轉(zhuǎn)義
                return htmlspecialchars($data, ENT_QUOTES, 'UTF-8');
        }
    }
    
    private static function purify_html($html) {
        require_once 'HTMLPurifier.auto.php';
        $config = HTMLPurifier_Config::createDefault();
        $config->set('HTML.Allowed', 'p,br,strong,em,ul,ol,li,a[href|title]');
        $purifier = new HTMLPurifier($config);
        return $purifier->purify($html);
    }
    
    private static function escape_attribute($data) {
        return htmlspecialchars($data, ENT_QUOTES, 'UTF-8', false);
    }
}

// 使用示例
$user_input = [
    'username' => '<script>alert("xss")</script>',
    'comment' => '<p>正常評(píng)論</p><script>惡意代碼</script>',
    'website' => 'javascript:alert(1)'
];

$cleaned_data = SecurityHelper::xss_clean($user_input);
print_r($cleaned_data);
?>

防御深度建議

  • 輸入驗(yàn)證:在接收數(shù)據(jù)時(shí)進(jìn)行嚴(yán)格驗(yàn)證
  • 輸出轉(zhuǎn)義:根據(jù)輸出上下文進(jìn)行適當(dāng)?shù)霓D(zhuǎn)義
  • 內(nèi)容安全策略(CSP):設(shè)置HTTP頭
header("Content-Security-Policy: default-src 'self'");
  • HttpOnly Cookie:防止Cookie被JavaScript讀取
  • 框架安全特性:優(yōu)先使用框架提供的安全方法

總結(jié)

XSS防護(hù)是一個(gè)多層次的過程,需要根據(jù)具體場(chǎng)景選擇合適的過濾策略:

  • 純文本輸出:使用 htmlspecialchars()
  • 完全移除HTML:使用 strip_tags()
  • 保留安全HTML:使用 HTMLPurifier
  • 企業(yè)級(jí)應(yīng)用:結(jié)合多種方法,建立完整防護(hù)體系

記?。?strong>永遠(yuǎn)不要信任用戶輸入,在顯示任何用戶提供的數(shù)據(jù)之前,都要進(jìn)行適當(dāng)?shù)倪^濾和轉(zhuǎn)義。

到此這篇關(guān)于PHP中HTML標(biāo)簽過濾的5種有效方法的文章就介紹到這了,更多相關(guān)PHP HTML標(biāo)簽過濾內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • php最簡單的刪除目錄與文件實(shí)現(xiàn)方法

    php最簡單的刪除目錄與文件實(shí)現(xiàn)方法

    這篇文章主要介紹了php最簡單的刪除目錄與文件實(shí)現(xiàn)方法,只需要兩行代碼即可實(shí)現(xiàn)刪除目錄與文件的功能,是非常實(shí)用的技巧,需要的朋友可以參考下
    2014-11-11
  • PHP十六進(jìn)制顏色隨機(jī)生成器功能示例

    PHP十六進(jìn)制顏色隨機(jī)生成器功能示例

    這篇文章主要介紹了PHP十六進(jìn)制顏色隨機(jī)生成器功能,結(jié)合具體實(shí)例形式分析了php隨機(jī)生成十六進(jìn)制數(shù)值表示形式的相關(guān)操作技巧,需要的朋友可以參考下
    2017-07-07
  • PHP后期靜態(tài)綁定之self::限制實(shí)例分析

    PHP后期靜態(tài)綁定之self::限制實(shí)例分析

    這篇文章主要介紹了PHP后期靜態(tài)綁定之self::限制,結(jié)合實(shí)例形式分析了php后期靜態(tài)綁定self::與static相關(guān)使用技巧,需要的朋友可以參考下
    2018-12-12
  • PHP static局部靜態(tài)變量和全局靜態(tài)變量總結(jié)

    PHP static局部靜態(tài)變量和全局靜態(tài)變量總結(jié)

    使用靜態(tài)局部變量的原因是它不能被外部使用,但是它的值依然在沒此使用后保留。雖然使用全局變量可以實(shí)現(xiàn)相同的功能,但是它經(jīng)常會(huì)造成意外
    2014-03-03
  • PHP遍歷數(shù)組最常用的7種方式總結(jié)

    PHP遍歷數(shù)組最常用的7種方式總結(jié)

    在PHP中,遍歷數(shù)組有多種方式可以選擇,本文給大家分享了7種最常用的遍歷方式,文中有詳細(xì)的代碼示例供大家參考,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-10-10
  • PHP實(shí)現(xiàn)的DES加密解密封裝類完整實(shí)例

    PHP實(shí)現(xiàn)的DES加密解密封裝類完整實(shí)例

    這篇文章主要介紹了PHP實(shí)現(xiàn)的DES加密解密封裝類,結(jié)合完整實(shí)例形式分析了php DES加密解密封裝類的定義與使用技巧,需要的朋友可以參考下
    2017-04-04
  • PHP設(shè)計(jì)模式之命令模式示例詳解

    PHP設(shè)計(jì)模式之命令模式示例詳解

    這篇文章主要給大家介紹了關(guān)于PHP設(shè)計(jì)模式之命令模式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 通過php刪除xml文檔內(nèi)容的方法

    通過php刪除xml文檔內(nèi)容的方法

    這篇文章主要介紹了通過php刪除xml文檔內(nèi)容的方法,實(shí)例分析了兩種刪除XML文檔的情況,并配有完整的注釋,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-01-01
  • php natsort內(nèi)核函數(shù)淺析

    php natsort內(nèi)核函數(shù)淺析

    今天發(fā)現(xiàn)了php有個(gè)自然排序的函數(shù)----natsort,第一次聽說了原來還有一種叫做“自然排序”的算法,很好奇
    2009-08-08
  • 什么情況下可以不寫PHP的閉合標(biāo)簽“?>”

    什么情況下可以不寫PHP的閉合標(biāo)簽“?>”

    這篇文章主要介紹了什么情況下可以不寫PHP的閉合標(biāo)簽“?>”,是進(jìn)行PHP程序開發(fā)需要特別注意的地方,需要的朋友可以參考下
    2014-08-08

最新評(píng)論

辽宁省| 泸定县| 田林县| 乌兰察布市| 平泉县| 桐柏县| 平南县| 江陵县| 马山县| 家居| 泾川县| 泉州市| 景德镇市| 喜德县| 龙南县| 聂荣县| 肇庆市| 万年县| 启东市| 抚顺市| 尚志市| 天水市| 普定县| 嘉鱼县| 门源| 陆河县| 红原县| 临泉县| 黔江区| 原阳县| 隆德县| 达日县| 自治县| 儋州市| 马山县| 凤凰县| 从化市| 昌乐县| 太保市| 和顺县| 鹤岗市|