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://m.373753.com/xinwendongtai/2119.html

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

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

下一篇:沒有了

聯系客服
網站客服 業務合作 在線客服QQ
294169012
微信號
微信號
微信號
返回頂部
69久久夜色精品国产69乱青草_国产高清日韩_亚洲一二三四区不卡_亚洲国产成人av网
日欧美一区二区| 欧美亚男人的天堂| 欧美专区在线观看一区| 欧美电影免费观看高清完整版| 久久午夜国产精品| 天天综合日日夜夜精品| 99re66热这里只有精品3直播| 91精品国产一区二区三区| 亚洲婷婷综合久久一本伊一区 | 久99久精品视频免费观看| 97精品超碰一区二区三区| 欧美zozozo| 亚洲国产精品久久不卡毛片| 91蜜桃在线免费视频| 国产午夜精品福利| 久久精品国产精品青草| 欧美日韩第一区日日骚| 一区二区三区四区国产精品| 成人综合在线观看| 久久久亚洲高清| 国产一区二区三区在线观看精品 | 色哟哟在线观看一区二区三区| 日韩你懂的电影在线观看| 天天色天天爱天天射综合| 欧美天天综合网| 亚洲视频免费观看| 91日韩精品一区| 国产精品久久久久久亚洲伦 | 午夜亚洲国产au精品一区二区| 9i看片成人免费高清| 国产精品沙发午睡系列990531| 精品一区二区免费| 久久久久久久久久久99999| 久久99国产精品麻豆| 久久综合一区二区| 国产精品99久久久久久似苏梦涵 | 欧美日韩高清在线| 亚洲福利视频三区| 91精品国产乱码久久蜜臀| 亚洲电影欧美电影有声小说| 91.麻豆视频| 三级成人在线视频| 日韩欧美一级二级| 国产成人在线免费| 亚洲欧美经典视频| 欧洲在线/亚洲| 香蕉成人啪国产精品视频综合网| 欧美精品电影在线播放| 精品一区二区久久久| 国产欧美日韩在线视频| 91丨九色丨蝌蚪富婆spa| 亚洲综合在线观看视频| 欧美日韩mp4| 韩国成人精品a∨在线观看| 日本一区二区三级电影在线观看 | 91麻豆精品国产91久久久使用方法| 性感美女久久精品| 久久嫩草精品久久久久| av电影在线观看一区| 天天色天天操综合| 国产欧美一区二区在线观看| 色呦呦网站一区| 蜜桃久久久久久久| 国产精品日韩成人| 69堂亚洲精品首页| 风间由美一区二区三区在线观看 | 日本在线不卡视频一二三区| 久久精品人人做人人爽97| 大尺度一区二区| 成人免费一区二区三区视频| 欧美日本免费一区二区三区| 精品一区二区三区在线观看国产| 一区视频在线播放| 欧美一区二区人人喊爽| 成人动漫一区二区在线| 亚洲一区二区精品3399| 久久综合国产精品| 欧美亚男人的天堂| 国产91精品欧美| 五月天激情综合| 国产精品三级视频| 日韩一区二区在线观看视频播放| 成人avav影音| 国产在线播放一区三区四| 亚洲国产精品一区二区www在线| 久久久一区二区| 欧美一级在线观看| 欧美三级资源在线| 99精品国产热久久91蜜凸| 久久成人免费网站| 日韩中文字幕一区二区三区| 亚洲三级理论片| 国产亚洲va综合人人澡精品| 欧美伊人久久大香线蕉综合69 | 日本欧洲一区二区| 椎名由奈av一区二区三区| 久久精品亚洲麻豆av一区二区| 欧美日韩国产一区二区三区地区| www.亚洲精品| 国产福利一区二区三区视频| 精品一区二区综合| 日产国产欧美视频一区精品| 一区二区三区丝袜| 亚洲欧洲综合另类| 亚洲日本青草视频在线怡红院 | 99热精品国产| 成人综合日日夜夜| 国产成人精品三级| 国产精品白丝jk白祙喷水网站 | 91网站最新网址| 97se亚洲国产综合自在线不卡| 国产精品影视网| 国产麻豆一精品一av一免费 | 亚洲国产中文字幕在线视频综合| 亚洲欧美日韩系列| 国产精品丝袜久久久久久app| 精品国产1区2区3区| 精品国产一二三| 精品国产不卡一区二区三区| 精品久久久久久久久久久院品网| 日韩一级片在线观看| 精品国产一区二区亚洲人成毛片| 日韩一区二区三区精品视频| 日韩一区二区免费在线电影| 欧美一级黄色片| 久久亚洲免费视频| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 国产一区中文字幕| 懂色av一区二区三区免费观看| 国产成人鲁色资源国产91色综| 成人听书哪个软件好| 91尤物视频在线观看| 在线日韩国产精品| 91精品国产黑色紧身裤美女| 亚洲精品乱码久久久久久日本蜜臀 | 欧美三级资源在线| 337p亚洲精品色噜噜噜| 欧美一卡二卡在线| 久久综合狠狠综合| 亚洲欧洲日本在线| 一区二区三区电影在线播| 视频在线在亚洲| 国产麻豆视频精品| 91捆绑美女网站| 日韩一级片网址| 91视频精品在这里| 欧美绝品在线观看成人午夜影视| 精品久久久久久久久久久久久久久 | 亚洲午夜精品在线| 首页综合国产亚洲丝袜| 激情久久五月天| 一本色道久久综合亚洲精品按摩| 777a∨成人精品桃花网| 国产精品嫩草99a| 日韩国产在线一| 成人小视频在线| 欧美一级在线观看| 成人欧美一区二区三区视频网页 | 国产精品成人午夜| 日韩精品久久理论片| 波多野结衣一区二区三区| 3d动漫精品啪啪一区二区竹菊| 国产欧美一区二区三区鸳鸯浴| 亚洲成人av一区二区| 国产·精品毛片| 69堂成人精品免费视频| 国产精品久久一级| 美腿丝袜亚洲三区| 在线看国产一区二区| 欧美韩日一区二区三区四区| 丝袜美腿一区二区三区| 一本一道久久a久久精品| 国产视频一区二区在线| 日韩av一级电影| 欧美性大战久久久久久久蜜臀 | 欧美一区二区三区在| 亚洲人成精品久久久久久| 国产精品一区二区在线播放| 欧美男男青年gay1069videost | www.66久久| 久久精品人人爽人人爽| 奇米888四色在线精品| 91国产丝袜在线播放| 国产精品家庭影院| 国产乱码精品一品二品| 91精品国产色综合久久不卡电影| 亚洲一区影音先锋| 粉嫩aⅴ一区二区三区四区| 26uuu国产电影一区二区| 调教+趴+乳夹+国产+精品| 精品视频全国免费看| 亚洲精品v日韩精品| 色狠狠av一区二区三区| 亚洲精品视频在线| 91国产免费看| 亚洲va韩国va欧美va| 欧美亚洲一区三区| 亚洲国产一区二区三区青草影视| 99久久国产综合精品女不卡| 亚洲欧洲成人精品av97|