69久久夜色精品国产69乱青草_国产高清日韩_亚洲一二三四区不卡_亚洲国产成人av网

  • 您好!歡迎來到金點子源碼網!
  • 登錄 注冊

源碼網_提供網站源碼、discuz、wordpress主題與插件和站長教程等資源的下載服務

易優站內搜索特殊字符報錯如何解決

在使用易優CMS(YouZhanCMS)進行站內搜索時,如果用戶輸入包含**特殊字符**(如:`+`、`-`、`*`、`%`、`'`、`"`、`(`、`)` 等),可能會導致SQL查詢報錯或返回異常結果。這是因為這些字符可能被誤解析為SQL語法的一部分,從而引發SQL注入防護機制攔截或語法錯誤。以下是常見的解決方案:


image.png

一、問題根源分析

常見報錯場景

  1. 單引號(')You have an error in your SQL syntax

  2. 雙引號("):導致JSON解析錯誤

  3. 反斜杠(\):轉義錯誤

  4. 百分號(%):SQL LIKE查詢異常

  5. 尖括號(<>):XSS過濾沖突

  6. 特殊符號:&AMP;、#、+ 等URL編碼問題

二、快速解決方案

方案1:修改易優核心文件(推薦)

<PRe class="ybc-pre-component ybc-pre-component_not-math">// 文件位置:application/common/model/Search.php // 修改 search 方法中的關鍵詞處理 public function search($keyword){     // 原始代碼可能有問題,修改為:          // 1. 過濾特殊字符但保留中文、英文、數字     $keyword = preg_replace('/[^\x{4e00}-\x{9fa5}a-zA-Z0-9\s]/u', ' ', $keyword);          // 2. 或者僅移除危險字符     $danger_chars = ["'", '"', '\\', '%', '_', ';', '=', '>', '<', '&', '#', '(', ')'];     $keyword = str_replace($danger_chars, ' ', $keyword);          // 3. 去除多余空格     $keyword = trim(preg_replace('/\s+/', ' ', $keyword));          // 4. 如果關鍵詞為空,返回空結果     if(empty($keyword)){         return ['list' => [], 'total' => 0];     }          // 5. 安全轉義(ThinkPHP的查詢構造器已處理,但雙重保障)     $keyword = addslashes(strip_tags($keyword));          // 6. 對LIKE查詢的特殊字符處理     $keyword = str_replace(         ['%', '_'],         ['\%', '\_'],         $keyword     );          // 原有搜索邏輯... }

方案2:修改前端輸入處理

// 在搜索框提交前過濾
function filterSearchKeyword(keyword){
    // 移除危險字符
    var danger = /['"\\%;&=<>()#]/g;
    keyword = keyword.replace(danger, '');
    
    // 保留中英文數字和常用標點
    keyword = keyword.replace(/[^\u4e00-\u9fa5a-zA-Z0-9\s,。!?、:;()《》]/g, '');
    
    // 限制長度
    if(keyword.length > 50) keyword = keyword.substr(0, 50);
    
    return keyword.trim();
}

// 表單提交時調用
$('#search-form').submit(function(e){
    var keyword = $('#search-input').val();
    $('#search-input').val(filterSearchKeyword(keyword));
});

三、多層防御方案

1. 修改控制器層(優先級最高)

// 文件:application/index/controller/Search.php
public function index(){
    $keyword = input('keyword/s', '', 'trim');
    
    // 方法1:嚴格過濾
    $keyword = $this->filterKeyword($keyword);
    
    // 方法2:URL解碼后過濾
    $keyword = urldecode($keyword);
    $keyword = Htmlspecialchars($keyword, ENT_QUOTES, 'UTF-8');
    
    // 方法3:正則保留安全字符
    $keyword = preg_replace('/[^a-zA-Z0-9\x{4e00}-\x{9fa5}\-\_\s]/u', '', $keyword);
    
    // 傳遞給模型
    $result = model('app\common\model\Search')->search($keyword);
    
    return json($result);
}

// 關鍵詞過濾方法
private function filterKeyword($str){
    if(empty($str)) return '';
    
    // 移除SQL注入風險字符
    $str = str_ireplace(
        ['select ', 'insert ', 'update ', 'delete ', 'drop ', 'union ', 'or ', 'and '],
        '',
        $str
    );
    
    // 轉義特殊字符
    $str = addslashes($str);
    
    // 限制長度
    if(mb_strlen($str, 'utf-8') > 100){
        $str = mb_substr($str, 0, 100, 'utf-8');
    }
    
    return $str;
}

2. 修改模板搜索表單

<!-- 在搜索表單模板中增加防護 -->
<!-- 原位置:template/你的模板/search.htm -->
<form action="{:url('/search')}" method="get" onsubmit="return validateSearch()">
    <input type="text" name="keyword" id="keyword" 
           placeholder="請輸入關鍵詞" 
           maxlength="50"
           oninput="filterInput(this)">
    <button type="submit">搜索</button>
</form>

<script>
function filterInput(input){
    // 實時過濾
    input.value = input.value.replace(/[<>'"\\&;#]/g, '');
}

function validateSearch(){
    var keyword = document.getElementById('keyword').value;
    if(!keyword.trim()){
        alert('請輸入搜索關鍵詞');
        return false;
    }
    if(keyword.length > 50){
        alert('關鍵詞過長');
        return false;
    }
    return true;
}
</script>

四、數據庫查詢層防護

修改查詢構造器

// 擴展ThinkPHP查詢類
// 創建:application/common/Query.php
namespace app\common;

use think\db\Query;

class SafeQuery extends Query
{
    /**
     * LIKE查詢安全處理
     */
    public function whereLike($field, $value, $logic = 'AND')
    {
        // 轉義LIKE特殊字符
        $value = $this->escapeLike($value);
        return parent::whereLike($field, $value, $logic);
    }
    
    /**
     * 轉義LIKE特殊字符
     */
    protected function escapeLike($str)
    {
        if(is_string($str)){
            $str = str_replace(
                ['\\', '%', '_'],
                ['\\\\', '\%', '\_'],
                $str
            );
        }
        return $str;
    }
    
    /**
     * 安全條件查詢
     */
    public function whereSafe($field, $value, $logic = 'AND')
    {
        // 過濾危險值
        if(is_string($value)){
            $value = $this->filterValue($value);
        }
        return $this->where($field, $value, $logic);
    }
    
    protected function filterValue($value)
    {
        // 移除SQL關鍵字
        $keywords = [
            'select', 'insert', 'update', 'delete',
            'drop', 'truncate', 'create', 'alter',
            'union', 'or ', 'and ', 'xor',
            ';', '--', '/*', '*/', '#'
        ];
        
        foreach($keywords as $keyword){
            $value = str_ireplace($keyword, '', $value);
        }
        
        return trim($value);
    }
}

五、全局解決方案

創建搜索中間件

// 創建:application/http/middleware/SearchFilter.php
namespace app\http\middleware;

class SearchFilter
{
    public function handle($request, \Closure $next)
    {
        // 只處理搜索請求
        if($request->isGet() && strpos($request->pathinfo(), 'search') !== false){
            $keyword = $request->param('keyword');
            if($keyword){
                // 安全過濾
                $safeKeyword = $this->safeFilter($keyword);
                $request->withParam(['keyword' => $safeKeyword]);
            }
        }
        
        return $next($request);
    }
    
    protected function safeFilter($str)
    {
        // 1. URL解碼
        $str = urldecode($str);
        
        // 2. HTML實體轉義
        $str = htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
        
        // 3. 移除危險字符
        $danger = [
            "'", '"', '\\', ';', '=', '<', '>',
            '(', ')', '&', '#', '%', '*', '+',
            '!', '?', '~', '`', '|', '^'
        ];
        $str = str_replace($danger, ' ', $str);
        
        // 4. 移除多余空格
        $str = trim(preg_replace('/\s+/', ' ', $str));
        
        // 5. 長度限制
        if(mb_strlen($str, 'utf-8') > 100){
            $str = mb_substr($str, 0, 100, 'utf-8');
        }
        
        return $str;
    }
}

// 注冊中間件:config/middleware.php
return [
    // 搜索過濾中間件
    \app\http\middleware\SearchFilter::class
];

六、Nginx層防護

配置Nginx過濾規則

# 在server配置中添加
server {
    # 搜索URL特殊字符過濾
    if ($request_uri ~* "/search"){
        # 檢查危險字符
        if ($arg_keyword ~* "([';\\\"%=<>\(\)])"){
            return 400;
        }
        
        # 限制關鍵詞長度
        if ($arg_keyword ~ "^.{101,}$"){
            return 413;
        }
    }
    
    # 或者使用rewrite重寫
    location ~* ^/search {
        # 對關鍵詞進行URL重寫
        if ($args ~* "(keyword=.*[<>'].*)"){
            rewrite ^ /search?keyword= break;
        }
        
        # 正常處理
        try_files $uri $uri/ /index.php?s=$uri&$args;
    }
}

七、錯誤處理增強

修改異常處理

// 文件:app.php
'exception_handle' => 'app\common\exception\Handler',

// 創建異常處理類
namespace app\common\exception;

class Handler extends \think\exception\Handle
{
    public function render($request, \Throwable $e)
    {
        // 數據庫錯誤(通常是SQL注入導致)
        if($e instanceof \think\db\exception\DbException){
            // 記錄日志
            \think\facade\Log::error('搜索異常: ' . $e->getMessage());
            
            // 對搜索請求返回友好錯誤
            if(strpos($request->url(), 'search') !== false){
                return json([
                    'code' => 0,
                    'msg' => '搜索關鍵詞包含特殊字符,請重新輸入',
                    'data' => [],
                    'total' => 0
                ]);
            }
        }
        
        return parent::render($request, $e);
    }
}

八、測試驗證方案

1. 創建測試腳本

// test_search.php
$testKeywords = [
    "正常關鍵詞",
    "測試'單引號",
    '測試"雙引號',
    "測試\\反斜杠",
    "測試%百分號",
    "測試_下劃線",
    "測試<尖括號>",
    "測試&符號",
    "測試;分號",
    "測試=等號",
    "測試(括號)",
    "測試#井號",
    "測試--注釋",
    "測試/*注釋*/",
    "測試 or 1=1",
    "測試' and '1'='1",
    "測試 union select",
    "測試<script>alert(1)</script>",
    "混合測試'\"\\%<>"
];

foreach($testKeywords as $keyword){
    $url = "http://你的域名/search?keyword=" . urlencode($keyword);
    $result = file_get_contents($url);
    
    if(strpos($result, 'SQL syntax') !== false){
        echo "? 失敗: " . $keyword . "\n";
    } else {
        echo "? 通過: " . $keyword . "\n";
    }
}

2. 壓力測試

# 使用ab測試
ab -n 1000 -c 10 "http://域名/search?keyword=測試'特殊字符"

# 使用siege測試
siege -c 100 -r 10 "http://域名/search?keyword=測試<script>alert(1)</script>"

九、完整修復方案(推薦)

步驟1:創建全局過濾函數

// 文件:application/common.php
/**
 * 安全過濾搜索關鍵詞
 */
function safe_search_keyword($keyword){
    if(empty($keyword)) return '';
    
    // 1. URL解碼
    $keyword = urldecode($keyword);
    
    // 2. 基礎過濾
    $keyword = strip_tags($keyword);
    $keyword = htmlspecialchars($keyword, ENT_QUOTES, 'UTF-8');
    
    // 3. 移除SQL危險字符
    $keyword = str_replace(
        ["'", '"', '\\', ';', '=', '--', '/*', '*/', '#'],
        '',
        $keyword
    );
    
    // 4. 移除SQL關鍵字
    $sql_keywords = [
        '/\bselect\b/i', '/\binsert\b/i', '/\bupdate\b/i', '/\bdelete\b/i',
        '/\bdrop\b/i', '/\btruncate\b/i', '/\bcreate\b/i', '/\balter\b/i',
        '/\bunion\b/i', '/\bor\b/i', '/\band\b/i'
    ];
    $keyword = preg_replace($sql_keywords, '', $keyword);
    
    // 5. 對LIKE查詢轉義
    $keyword = str_replace(['%', '_'], ['\%', '\_'], $keyword);
    
    // 6. 長度限制
    if(mb_strlen($keyword, 'utf-8') > 100){
        $keyword = mb_substr($keyword, 0, 100, 'utf-8');
    }
    
    return trim($keyword);
}

步驟2:修改搜索控制器

// 所有搜索相關控制器添加
public function search(){
    $keyword = input('keyword/s', '');
    
    // 使用全局過濾函數
    $safeKeyword = safe_search_keyword($keyword);
    
    if(empty($safeKeyword)){
        return $this->error('請輸入有效的搜索關鍵詞');
    }
    
    // 記錄原始關鍵詞(用于顯示)
    $this->assign('original_keyword', $keyword);
    
    // 使用安全關鍵詞搜索
    $result = model('app\common\model\Search')->search($safeKeyword);
    
    return $this->fetch('search', $result);
}

步驟3:修改前端顯示

<!-- 顯示時使用原始關鍵詞,搜索時使用過濾后關鍵詞 -->
<script>
// 顯示原始關鍵詞
var originalKeyword = "{$original_keyword|raw}";
$('.search-result-title').text('搜索結果:' + originalKeyword);

// 搜索時過濾
$('#search-btn').click(function(){
    var keyword = $('#keyword').val();
    var safeKeyword = keyword.replace(/[<>'"\\%;&=#()]/g, '');
    
    if(safeKeyword.length < 1){
        alert('請輸入有效關鍵詞');
        return false;
    }
    
    location.href = '/search?keyword=' + encodeURIComponent(safeKeyword);
});
</script>

十、預防措施

  1. 定期更新

    • 保持易優CMS最新版本

    • 關注官方安全更新

  2. 監控日志

    # 監控搜索異常
    tail -f runtime/log/*.log | grep -i "sql.*error\|exception"
    
    # 監控惡意搜索
    awk '/search/ && /['\''";<>]/' access.log
  3. WAF防護

    • 配置Web應用防火墻規則

    • 設置SQL注入防護

    • 啟用XSS防護

  4. 數據備份

    • 定期備份數據庫

    • 備份修改的文件

緊急修復命令

# 如果問題緊急,可先臨時屏蔽特殊字符搜索
cd /網站根目錄
sed -i "s/\$keyword = input('keyword'/\/\/ 臨時修復:禁止特殊字符\n        \$keyword = input('keyword'/g" application/index/controller/Search.php
echo "修復完成,請刷新緩存"

通過上述方案,可徹底解決易優站內搜索特殊字符報錯問題。推薦使用全局過濾函數方案,既能保證安全性,又能提供良好的用戶體驗。

本文鏈接:http://www.373753.com/xinwendongtai/2119.html

版權聲明:站內所有文章皆來自網絡轉載,只供模板演示使用,并無任何其它意義!

上一篇: 易優cdn閱讀量不變的緩存規則

下一篇:沒有了

聯系客服
網站客服 業務合作 在線客服QQ
294169012
微信號
微信號
微信號
返回頂部
69久久夜色精品国产69乱青草_国产高清日韩_亚洲一二三四区不卡_亚洲国产成人av网
久久精品亚洲乱码伦伦中文| 青青国产91久久久久久| 欧美系列亚洲系列| 午夜av区久久| 亚洲视频一区二区免费在线观看| 欧美一级欧美三级在线观看| 欧美日韩免费观看一区二区三区 | 婷婷一区二区三区| 五月婷婷激情综合| 国内精品第一页| 欧洲一区二区三区免费视频| 欧美日韩亚州综合| 精品动漫一区二区三区在线观看| 欧美精品一区二区三区蜜桃视频| 久久久久久麻豆| 午夜视频在线观看一区二区三区| 国产一区在线看| 91麻豆蜜桃一区二区三区| 欧美久久久久久久久久| 国产丝袜在线精品| 日日夜夜一区二区| 一本色道久久综合亚洲aⅴ蜜桃| 色婷婷久久一区二区三区麻豆| 欧美日韩一区二区三区四区五区 | 国产精品久久久久久户外露出 | 精品国产乱码久久久久久夜甘婷婷| 日本一区二区三区四区| 亚洲成人自拍偷拍| 色婷婷久久久综合中文字幕| 欧美一区二区国产| 国产亚洲精品免费| 国产一区二区电影| 日韩女优电影在线观看| 婷婷开心久久网| 69久久99精品久久久久婷婷| 中文字幕乱码久久午夜不卡 | 国内精品视频一区二区三区八戒| 欧美日韩一区三区四区| 亚洲一区精品在线| 国产曰批免费观看久久久| 精品国产亚洲在线| 国产综合色精品一区二区三区| 日韩欧美视频在线| 国产黑丝在线一区二区三区| 日韩欧美国产综合在线一区二区三区| 亚洲综合小说图片| 婷婷一区二区三区| 欧美性猛交xxxx乱大交退制版 | 国产一区二区三区在线观看免费| 久久久久久电影| 国产一区二区三区综合| 国产喂奶挤奶一区二区三区| 老司机一区二区| 国产亚洲一二三区| 成人中文字幕在线| 亚洲丝袜美腿综合| 色美美综合视频| 亚洲人成人一区二区在线观看| 欧美日韩亚洲另类| 视频一区免费在线观看| 日本一区二区三区四区在线视频| 91国产免费看| a在线播放不卡| 蜜臀av在线播放一区二区三区| 亚洲欧美在线高清| 91亚洲精品一区二区乱码| 精品无人区卡一卡二卡三乱码免费卡| 国产精品91一区二区| 91国在线观看| 色综合久久久久久久久| 国产精品免费aⅴ片在线观看| 日韩在线一区二区| 欧美综合在线视频| 国产99久久久国产精品免费看| 成人免费毛片片v| 国产一区二区在线观看视频| 日本欧美加勒比视频| 国产一区二区三区| 国产自产v一区二区三区c| 香蕉久久一区二区不卡无毒影院| 欧美国产精品中文字幕| 国产精品家庭影院| 久久精品亚洲一区二区三区浴池| 成人国产视频在线观看| 99精品久久久久久| 丁香婷婷深情五月亚洲| 99在线精品一区二区三区| 成人动漫精品一区二区| 色网综合在线观看| 日韩欧美国产综合一区 | 国产成人无遮挡在线视频| 亚洲人成影院在线观看| 青青草91视频| 国产精品综合二区| 欧洲生活片亚洲生活在线观看| jlzzjlzz亚洲日本少妇| 日韩视频一区在线观看| 欧美日韩国产123区| 亚洲三级在线观看| 粉嫩高潮美女一区二区三区| 成人精品免费网站| 国产精品黄色在线观看| 成人99免费视频| 国产精品免费免费| 国内精品国产成人国产三级粉色| 精彩视频一区二区三区| 国产乱码精品一区二区三区五月婷| 欧美在线不卡一区| 中文字幕精品一区二区精品绿巨人 | 97se亚洲国产综合自在线| 欧美不卡激情三级在线观看| 午夜精品久久久久久久 | 亚洲国产精品自拍| 成人免费毛片a| 欧美极品美女视频| 蜜臀av一区二区在线观看| 在线观看91视频| 亚洲裸体xxx| 欧美精品日韩综合在线| 亚洲第一福利视频在线| 欧美理论片在线| 美腿丝袜亚洲一区| 国产欧美日韩另类视频免费观看| 国产成人啪免费观看软件 | 蜜桃视频在线观看一区二区| 精品少妇一区二区三区日产乱码 | 欧美色男人天堂| 美腿丝袜亚洲综合| 国产婷婷色一区二区三区在线| 波多野结衣在线aⅴ中文字幕不卡| 成人欧美一区二区三区| 欧美中文字幕亚洲一区二区va在线| 亚洲第一二三四区| 国产亲近乱来精品视频| 欧美专区在线观看一区| 韩国中文字幕2020精品| 亚洲专区一二三| 中文字幕在线观看一区二区| 日韩欧美亚洲一区二区| 色噜噜狠狠色综合中国| 国产精品99久久久久久久女警| 亚洲主播在线观看| 国产精品福利在线播放| 色哟哟欧美精品| 国产传媒一区在线| 亚洲国产精品欧美一二99| 午夜婷婷国产麻豆精品| 免费人成黄页网站在线一区二区| 亚洲成人av福利| 久88久久88久久久| 成人动漫一区二区在线| 色综合久久综合网| 日本高清免费不卡视频| 欧美日本韩国一区| 国产精品伦一区| 天天综合色天天综合| 久久99深爱久久99精品| 成人avav影音| 日韩三级视频中文字幕| 国产调教视频一区| 午夜精品久久久久久久蜜桃app| 毛片av一区二区| 99国产麻豆精品| 日韩欧美中文字幕精品| 国产精品蜜臀av| 美女mm1313爽爽久久久蜜臀| 99久久99久久综合| 欧美va天堂va视频va在线| 有码一区二区三区| 丰满白嫩尤物一区二区| 制服视频三区第一页精品| 国产精品国产馆在线真实露脸| 男女激情视频一区| 日韩三级免费观看| 亚洲午夜电影在线观看| 色噜噜狠狠色综合欧洲selulu| 国产精品女上位| 99精品视频在线播放观看| 中文字幕成人在线观看| 国产精品一级黄| 国产亚洲精品中文字幕| 成人精品电影在线观看| 国产日产欧美精品一区二区三区| 日本欧美肥老太交大片| 3d动漫精品啪啪| 国内一区二区在线| 日本一区二区综合亚洲| 99久久国产免费看| 亚洲国产欧美在线人成| 欧美一区二区三区公司| 激情综合网av| 亚洲嫩草精品久久| 69久久99精品久久久久婷婷| 久久精品国产澳门| 国产精品伦理一区二区| 欧美精品一级二级三级| 国产成人精品在线看| 亚洲综合一区二区精品导航| 日韩欧美色综合| 色哟哟欧美精品|