Centos7、Mysql8.0 load_file函數返回為空的終極解決方法--暨selinux的深入理解

零、問題背景

??????? 最近想換房,為了方便自己對比感興趣的房子,因此決定將目標房源的基本信息放在表里,特別是要一目了然的看到眾多房子的各種圖紙和照片,因此決定要在Mysql8.0.34數據庫中以二進制形式保存圖片(拋開合理性和性能暫且不談,這里只說技術實現),許多帖子說使用load_file函數來實現,但我按照其他人的方法實操時一直返回NULL,還好歷經千辛萬苦終于解決了,現將過程與思路加以總結,存檔留念。

一、準備工作

1.1、服務器與數據庫版本

??????? 我是用 rpm 方式安裝的 MySQL 8.0.23 版本,服務器操作系統是Centos 7.9 虛擬機資源? 2C 4G 40G

1.2、表結構

??????? 下圖是我的表結構,其中有幾個字段是 mediumblob類型,用來存放大小約為200k以內的圖片。

1.3、圖片保存位置

??????? 為了便于后續業務擴展,也出于數據隔離的需要,我用服務器上自定義了 /data/pic/house 路徑作為當前業務存儲圖片的根目錄。并在其下面創建了 housepic 和 roomtype兩個路徑。

二、問題分步展示

2.1、問題展示

??????? 我將一張名為 h_1.jpg 的圖片放到? /data/pic/house/roomtype 下,然后使用如下語句嘗試查看圖片時沒能返回預期圖片內容,而是返回了NULL。

select load_file('/data/pic/house/roomtype/h_1.jpg');

2.2、原因及secure_file_priv介紹

???????? load_file 函數返回為 null 的原因,根源在于 MySQL 配置文件中的 “secure_file_priv” 屬性取值與load_file 函數使用的路徑不一。在具體解決問題之前,應該先了解這一屬性的作用和取值范圍是什么。

2.2.1、secure_file_priv介紹

??????? 該屬性有三類取值,分別為 "NULL"、空值、具體路徑字符串。不同取值的含義如下表所示

取值含義
NULL不允許讀寫任何路徑下的文件
'' 或 沒有值允許讀寫任意路徑下的文件
字符串(如 /tmp)允許讀寫當前路徑(如 /tmp)下的文件
2.2.2、secure_file_priv 查看

??????? 在MySQL任意一種客戶端中輸入如下命令查看。secure_file_priv的默認取值如下圖所示,為 “/var/lib/mysql-files/”。說明當前load_file 函數只能操作 “/var/lib/mysql-files/” 路徑下的文件。

show variables like '%secure%';

??????

2.2.3、secure_file_priv 修改

??????? 通過上面的分析已經知道了問題的原因,下面就是在MySQL的配置文件中修改這一參數的取值。因為我的MySQL是rpm安裝版,所以配置文件的名稱與路徑為: /etc/my.cnf (其他版本操作系統下的MySQL的配置文件位置與名稱請自行確認)。同時我希望 MySQL 不限制文件路徑,因此 secure_file_priv 取值及展示如下所示:

#關閉mysql的文件讀寫路徑限制,取值為空
secure-file-priv= ''

??????? 需要注意的一點就是,配置文件中應寫成 “secure-file-priv” 而非“secure_file_priv”的形式,切切

2.3、效果與終極解決方法

??????? 如果逐位按照上面的方法作了修改,大概率是依然不成功。原因在于沒有關閉selinux 。我之前就在selinux 這個坑中掙扎了好久才爬出來。下面就簡單聊聊 selinux 是啥,以及為什么會對這個參數有這么大的影響。

2.3.1、selinux是什么、能做什么

??????? 它是“安全增強型 Linux(Security-Enhanced Linux)”的簡稱,它是 Linux 的一個安全子系統。

??????? 它能對linux系統中,包括root在內的所有用戶的行為做管制。它能通過一系列的配置實現 “允許 X 目標,對 Z 對象/資源,做 Y行為 ” (May <subject> do <action> to <object/source>)的訪問控制。其中,X多指進程;Y多指X訪問的資源,如端口、文件等;Z多指訪問或操作規則。

??????? 它有三種工作模式,如下表所示:

模式名稱作用
enforcing強制模式。阻止并在日志記錄違反SELinux規則的行為
permissive寬容模式。僅在日志記錄違反SELinux規則的行為
disabled關閉模式。關閉SELinux

??????? selinux 是一套相當復雜的子系統,里面有龐大的配置項需要了解,在此不做進一步的解釋,只需要知道它會對 MySQL 的關鍵行為做校驗與限制即可。除非是專門負責安全和服務器運維的工程師需要深入了解selinux各種規則之外,一般的開發人員在遇到linux 的一些校驗失敗的情況時,可以想到有這樣一個東西存在,并且知道通過關閉selinux可以解決大部分的安全校驗問題即可

2.3.2、selinux 的關閉與開啟

??????? selinux 的關閉分為臨時關閉和永久關閉,下圖為臨時關閉方式(即設為寬容模式)

????????

??????? 下面為永久關閉方法

# 修改 /etc/selinux/config 文件中的  SELINUX=disabled
[root@MySQL01 ~]# vim /etc/selinux/config# 修改 /etc/sysconfig/selinux 文件中的  SELINUX=disabled
[root@MySQL01 ~]# vim /etc/sysconfig/selinux

2.4、最終效果

??????? 在MySQL 的 secure_file_priv參數設置為理想的值,并且關閉了 selinux 之后,發現可以正常讀取到圖片了,如下圖所示

2.5、補充說明

??????? 存放圖片的路徑,建議放到 mysql 屬組,且賦予 對應的權限。如下圖所示

????????

三、說在最后

9.1 如何查看centos 版本

cat /etc/redhat-release

9.2、如何查看MySQL版本

select VERSION(); 

9.3、load_file 函數的作用與效率

??????? 它在 MySQL 中的主要作用是讀取本地或遠程的文件。文件種類涵蓋文本、二進制、圖片、視頻等。因這樣的讀取方式不夠安全,因此建議在受信的環境中使用。

9.4、MySQL 幾種操作圖片的思路和對比

??????? 可以通過load_file 函數將圖片記錄到字段中,也可以將圖片所在的路徑記錄到字段中。前者存在安全隱患,后者無法在MySQL中直接看到圖片內容。因此對圖片的處理方式應根據業務需求等因素綜合考慮后選擇。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/209296.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/209296.shtml
英文地址,請注明出處:http://en.pswp.cn/news/209296.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

喝酒誰先倒

劃拳是古老中國酒文化的一個有趣的組成部分。酒桌上兩人劃拳的方法為&#xff1a;每人口中喊出一個數字&#xff0c;同時用手比劃出一個數字。如果誰比劃出的數字正好等于兩人喊出的數字之和&#xff0c;誰就輸了&#xff0c;輸家罰一杯酒。兩人同贏或兩人同輸則繼續下一輪&…

Vue 2.0源碼分析-update

Vue 的 _update 是實例的一個私有方法&#xff0c;它被調用的時機有 2 個&#xff0c;一個是首次渲染&#xff0c;一個是數據更新的時候&#xff1b;由于我們這一章節只分析首次渲染部分&#xff0c;數據更新部分會在之后分析響應式原理的時候涉及。_update 方法的作用是把 VNo…

思維鏈(CoT)提出者 Jason Wei:關于大語言模型的六個直覺

文章目錄 一、前言二、主要內容三、總結 &#x1f349; CSDN 葉庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 Jason Wei 的主頁&#xff1a;https://www.jasonwei.net/ Jason Wei&#xff0c;一位于 2020 年從達特茅斯學院畢業的杰出青年&#xff0c;隨后加盟了…

大數據安全保障的四種關鍵技術

隨著大數據時代的到來&#xff0c;數據安全保障的重要性日益凸顯。大數據安全保障涉及多種關鍵技術&#xff0c;以下是四種關鍵技術的詳細介紹。 數據加密技術 數據加密技術是大數據安全保障的核心技術之一。它通過將明文數據轉化為密文數據&#xff0c;以保護數據的機密性和完…

CSS中 設置文字下劃線 的幾種方法

在網頁設計和開發中&#xff0c;我們經常需要對文字進行樣式設置&#xff0c;包括字體,顏色&#xff0c;大小等&#xff0c;其中&#xff0c;設置文字下劃線是一種常見需求 一 、CSS種使用 text-decoration 屬性來設置文字的裝飾效果&#xff0c;包括下劃線。 常用的取值&…

Visual Studio 2015 中 FFmpeg 開發環境的搭建

Visual Studio 2015 中 FFmpeg 開發環境的搭建 Visual Studio 2015 中 FFmpeg 開發環境的搭建新建控制臺工程拷貝并配置 FFmpeg 開發文件測試FFmpeg 開發文件的下載鏈接 Visual Studio 2015 中 FFmpeg 開發環境的搭建 新建控制臺工程 新建 Win32 控制臺應用程序。 具體流程&…

炫酷不止一面:探索JavaScript動畫的奇妙世界(下)

&#x1f90d; 前端開發工程師&#xff08;主業&#xff09;、技術博主&#xff08;副業&#xff09;、已過CET6 &#x1f368; 阿珊和她的貓_CSDN個人主頁 &#x1f560; 牛客高級專題作者、在牛客打造高質量專欄《前端面試必備》 &#x1f35a; 藍橋云課簽約作者、已在藍橋云…

proftpd安全加固:限制用戶FTP登錄

其實無所謂安全加固&#xff0c;因為proftp默認就是限制用戶FTP登錄的&#xff0c;這里有點凌亂得研究和實驗了proftpd如何進行限制的&#xff0c;以及可能的放開限制。懂了這些才能更好的進行防護配置。 RootLogin指令其實主要作用就是啟用ROOT訪問。通常&#xff0c;proftpd在…

【Fastadmin】一個完整的輪播圖功能示例

目錄 1.效果展示&#xff1a; 列表 添加及編輯頁面同 2.建表&#xff1a; 3.使用crud一鍵生成并創建控制器 4.html頁面 add.html edit.html index.php 5.js頁面 6.小知識點 1.效果展示&#xff1a; 列表 添加及編輯頁面同 2.建表&#xff1a; 表名&#xff1a;fa_x…

【LabVIEW學習】5.數據通信之TCP協議,控制電腦的一種方式

一。tcp連接以及寫數據&#xff08;登錄&#xff09; 數據通信--》協議--》TCP 1.tcp連接 創建while循環&#xff0c;中間加入事件結構&#xff0c;創建tcp連接&#xff0c;寫入IP地址與端口號 2.寫入tcp數據 登錄服務器除了要知道IP地址以及端口以外&#xff0c;需要用戶名與密…

中通單號查詢,中通快遞物流查,備注需要的單號記錄

批量查詢中通快遞單號的物流信息&#xff0c;并對需要的單號記錄進行備注。 所需工具&#xff1a; 一個【快遞批量查詢高手】軟件 中通快遞單號若干 操作步驟&#xff1a; 步驟1&#xff1a;運行【快遞批量查詢高手】軟件&#xff0c;第一次使用的朋友記得先注冊&#xff0c…

快速冪(C語言)

前言 快速冪算法一般用于高次冪取模的題目中&#xff0c;比如求3的10000次方對7取模。這時候有些同學會說&#xff1a;這還不簡單&#xff1f;我直接調用pow函數然后對結果%7不得了么&#xff1f;可是3的10000次方這么龐大的數字&#xff0c;真的能儲存在計算機里么&#xff1f…

HTML行內元素與塊級元素的區別(超詳細)

目錄 行內元素&#x1f338;常見的行內元素&#x1f338;行內元素&#xff08;內聯元素&#xff09;的特性 塊級元素&#x1f338;常見的塊級元素&#x1f338;塊級元素的特性 相互轉換(display)&#x1f338;行內塊狀元素的特性 行內元素 &#x1f338;常見的行內元素 <s…

c#學習相關系列之as和is的相關用法

一、子類和父類的關系 public class Program{static void Main(string[] args){Animal animal new Dog();// Dog dog (Dog)new Animal(); 編譯成功&#xff0c;運行報錯Dog dog (Dog)animal;Dog dog new Dog();Animal animal dog; //等價于Animal animal new Dog();}}pub…

java多生產者多消費者模擬實現

package com.example.springboottestone.main;import java.util.LinkedList; import java.util.Queue;/*** 多生產者多消費者模型是指多個生產者線程同時向緩沖區中添加數據&#xff0c;同時多個消費者線程從緩沖區中獲取數據的并發模型。這種模型適用于需要高并發處理數據的場…

企業計算機服務器中了eking勒索病毒怎么辦,eking勒索病毒解密數據恢復

隨著計算機網絡技術的不斷發展與應用&#xff0c;企業的生產運營效率得到了極大提升&#xff0c;但網絡安全威脅一直存在&#xff0c;網絡威脅的技術也在不斷更新&#xff0c;給企業的數據安全帶來了嚴重威脅。在本月&#xff0c;云天數據恢復中心陸續接到很多企業的求助&#…

C++ Qt開發:Qt的安裝與配置

Qt是一種C編程框架&#xff0c;用于構建圖形用戶界面&#xff08;GUI&#xff09;應用程序和嵌入式系統。Qt由Qt公司&#xff08;前身為Nokia&#xff09;開發&#xff0c;提供了一套跨平臺的工具和類庫&#xff0c;使開發者能夠輕松地創建高效、美觀、可擴展的應用程序。其被廣…

Python---random庫

目錄 基本隨機數函數(): rand.seed() random() 擴展隨機數函數(): random庫包含兩類函數&#xff1a;基本隨機數函數&#xff0c;擴展隨機數函數 基本隨機數函數:seed(),random() 擴展隨機數函數&#xff1a;randint,getrandbits(),uniform(),randrange(),choice(),shuff…

猴子吃桃問題(for循環)

一只猴子第一天摘下若干個桃子&#xff0c;當即吃了一半&#xff0c;還不過癮&#xff0c;又多吃了一個&#xff1b;第二天早上又將剩下的桃子吃掉一半&#xff0c;又多吃了一個。以后每天早上都吃了前一天剩下的一半加一個。到第N天早上想再吃時&#xff0c;見只剩下一個桃子了…

ECS云主機容量大于2TB,初始化Linux數據盤(parted)

本文為您介紹當容量大于2TB時&#xff0c;如何在Linux環境下適用parted分區工具初始化數據盤。 操作場景 本文以“CentOS 7.6 64位”操作系統為例&#xff0c;介紹當磁盤容量大于2TB時&#xff0c;如何使用parted分區工具在Linux操作系統中為數據盤設置分區&#xff0c;操作回…