91亚洲精品久久久蜜桃网站 _96av麻豆蜜桃一区二区_97人妻精品一区二区三区免费_亚洲国产午夜_伊人影院在线观看视频_欧美aa在线视频_日韩中文字幕电影_亚洲国产高清一区_亚洲36d大奶网_精品国内亚洲2022精品成人

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

源碼網_提供網站源碼、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.www9463.cn/xinwendongtai/2119.html

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

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

下一篇:沒有了

聯系客服
網站客服 業務合作 在線客服QQ
294169012
微信號
微信號
微信號
返回頂部
999久久狠狠免费精品| 黄视频网站在线看| 久久99中文字幕久久| 日本特黄特黄aaaaa大片| 二级特黄绝大片免费视频大片| 久久成人性色生活片| 亚欧视频在线| 亚洲 激情| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 日韩av成人| 久久国产精品自由自在| 国产美女在线一区二区三区| 免费一级片在线| 九九九网站| 国产网站免费| 国产精品12| 欧美激情一区二区三区在线| 国产网站免费| 精品国产一区二区三区久久久狼| 日韩一级黄色| 久草免费在线观看| 黄色免费三级| 韩国毛片 免费| 日韩专区亚洲综合久久| 精品久久久久久影院免费| 国产麻豆精品免费密入口| 国产网站免费| 成人影视在线播放| 午夜欧美成人香蕉剧场| 国产不卡在线观看视频| 91麻豆精品国产自产在线 | 亚洲天堂免费| 国产国语在线播放视频| 亚洲 激情| 国产一区二区精品尤物| 国产一区二区精品久久91| 国产伦精品一区三区视频| 毛片高清| 国产视频在线免费观看| 日本伦理黄色大片在线观看网站| 欧美a级片免费看| 成人av在线播放| 韩国三级视频网站| 精品视频一区二区| 精品视频在线观看一区二区三区| 中文字幕一区二区三区 精品| 亚欧成人毛片一区二区三区四区| 青青青草影院| 国产91精品系列在线观看| 99热视热频这里只有精品| 99色吧| 国产91丝袜高跟系列| 日本特黄一级| 午夜在线亚洲| 麻豆污视频| 亚久久伊人精品青青草原2020| 99色视频在线观看| 国产精品免费精品自在线观看| 国产精品1024在线永久免费 | 国产一区二区精品| 色综合久久天天综线观看| 国产a免费观看| 亚欧成人毛片一区二区三区四区| 九九免费高清在线观看视频| 成人av在线播放| 欧美另类videosbestsex久久 | 99久久视频| 亚洲精品永久一区| 黄视频网站在线观看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 午夜家庭影院| 国产成人精品综合久久久| 国产视频一区二区三区四区| 日韩在线观看视频网站| 高清一级毛片一本到免费观看| 亚洲 欧美 成人日韩| 国产国语对白一级毛片| 国产精品自拍一区| 久久久成人网| 日本免费区| 精品视频在线观看一区二区三区| 亚洲精品影院一区二区| 精品视频免费看| 日本在线www| 国产综合91天堂亚洲国产| 天天做人人爱夜夜爽2020| 亚久久伊人精品青青草原2020| 欧美国产日韩精品| 精品国产一区二区三区久久久狼| 精品国产一区二区三区久久久狼| 91麻豆精品国产自产在线 | 成人免费网站久久久| 国产网站免费在线观看| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产伦精品一区三区视频| 美国一区二区三区| 日韩男人天堂| 99久久精品国产免费| 99热精品在线| 二级特黄绝大片免费视频大片| 国产福利免费观看| 四虎影视久久久免费| 国产伦精品一区二区三区无广告| 久久精品大片| 99久久精品国产片| 天天色成人| 天天做日日爱| 天天做日日爱| 一级女性全黄生活片免费| 精品国产一区二区三区国产馆| 91麻豆精品国产片在线观看| 可以免费在线看黄的网站| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 亚欧成人乱码一区二区| 国产精品免费精品自在线观看| 国产不卡高清| 久久国产精品自线拍免费| 亚飞与亚基在线观看| 美国一区二区三区| 韩国三级视频网站| 日韩在线观看视频黄| 国产视频一区二区在线观看| 久久成人性色生活片| 九九久久国产精品大片| 亚洲精品中文一区不卡| 日本特黄一级| 成人影视在线播放| 国产网站免费视频| 九九九国产| 日日日夜夜操| 久久99这里只有精品国产| 韩国毛片免费| 日韩专区亚洲综合久久| 韩国三级视频网站| 九九九网站| 免费国产一级特黄aa大片在线| 国产一区二区福利久久| 韩国毛片 免费| 国产成人精品综合| 日本在线播放一区| 亚洲女人国产香蕉久久精品| 色综合久久天天综合绕观看| 欧美激情一区二区三区在线| 亚飞与亚基在线观看| 欧美a免费| 尤物视频网站在线| 国产麻豆精品hdvideoss| 精品国产一级毛片| 中文字幕一区二区三区精彩视频| 午夜欧美成人香蕉剧场| 午夜家庭影院| 欧美激情影院| 亚洲第一视频在线播放| a级毛片免费全部播放| 国产综合91天堂亚洲国产| 成人影院一区二区三区| 欧美爱爱动态| 四虎久久精品国产| 亚洲精品中文字幕久久久久久| 亚洲精品久久久中文字| 久久久久久久免费视频| 亚洲不卡一区二区三区在线| 国产不卡在线观看视频| 国产亚洲精品aaa大片| 午夜激情视频在线观看| 国产伦精品一区二区三区无广告 | 精品视频在线看 | 国产国语对白一级毛片| 亚洲 国产精品 日韩| 欧美a免费| 成人在激情在线视频| 日日爽天天| 精品视频在线观看免费| 四虎影视久久久| 日本在线www| 成人影院久久久久久影院| 免费一级生活片| 精品视频一区二区三区| 九九久久国产精品| 国产伦久视频免费观看 视频| 国产视频一区二区在线观看| 欧美激情伊人| 亚洲精品影院久久久久久| 欧美a免费| 欧美一级视频高清片| 一级片免费在线观看视频| 黄视频网站在线观看| 成人影院一区二区三区| 尤物视频网站在线观看| 日韩中文字幕在线观看视频| 黄视频网站在线免费观看| 国产网站在线| 国产91丝袜在线播放0| 九九精品久久久久久久久| 亚飞与亚基在线观看| 欧美爱爱动态| 成人免费一级纶理片 | 精品国产一级毛片| 色综合久久天天综合| 久久福利影视|