主頁 > 資料庫 > 10年前,我就用 SQL注入漏洞黑了學校網站

10年前,我就用 SQL注入漏洞黑了學校網站

2021-01-08 08:44:30 資料庫

我是風箏,公眾號「古時的風箏」,一個兼具深度與廣度的程式員鼓勵師,一個本打算寫詩卻寫起了代碼的田園碼農!
文章會收錄在 JavaNewBee 中,更有 Java 后端知識圖譜,從小白到大牛要走的路都在里面,

標題有點臭不要臉,有標題黨之嫌了,沒有黑,只是網站安全性做的太差,我一個初學者隨便就搞到了管理員權限,

事情是這樣子的,在10年以前,某個月黑風高夜的夜里,雖然這么說有點暴露年齡了,但無所謂,畢竟我也才18而已,我打開電腦,在瀏覽器中輸入我們高中學校的網址,頁面很熟悉,很簡陋,也沒什么設計感,不過學校的網站從來都是這種風格,直到今天依然是這樣,

這次訪問與以往有些不同,因為我的目的很明確,作為學校的一員,理應為學校做些貢獻的,為學校官網找些安全漏洞也算貢獻的一種吧(強烈的求生欲),

之所以選擇學校的官網,一來是因為熟悉,先從熟悉的東西下手,一定錯不了,二來是因為之前使用網站的時候碰過到一些例外的頁面,直接就是例外堆疊直接拋出來,正好那段時間對網路安全比較有興趣,在研究SQL 注入的時候正好想到在學校官網上碰到的問題好像就存在 SQL 注入的風險,于是,順理成章,我的第一個目標就鎖定了學校官網,

問題就出在一個大概這樣的搜索頁面,真正的網站已經改版過好多次了,以前的頁面找不到了,

當時我在上面隨便輸入了一些內容,里面含有單引號,然后一點擊搜索,頁面就直接出現了例外提示,類似于下面這樣子的,別驚訝,當時很多網站都是這樣的,例外是直接拋出來的,別說以前了,現在也不少,

于是我用那時候剛學會的皮毛知識,加上兩個好用的工具,輕松拿到了資料庫的資料,其中就包括了管理員的賬號、密碼,密碼還是明文的,你說氣人不,
然后通過后臺管理員登錄頁面進入了管理員后臺,當然了,只是進去看了看,什么都沒碰,而且后臺也沒什么重要資料,頂多就是一些通知、新聞等資料,

我是怎么做到的呢,不說具體細節了,也確實沒什么技術含量,而且時間太長也記不清了,后面就說一下 SQL 注入的原理和具體操作,

什么是 SQL 注入

SQL注入,是發生于應用程式與資料庫層的安全漏洞,簡而言之,是在輸入的字串之中注入SQL指令,在設計不良的程式當中忽略了字符檢查,那么這些注入進去的惡意指令就會被資料庫服務器誤認為是正常的SQL指令而運行,因此遭到破壞或是入侵,

SQL 注入一般發生在用戶互動場景中,比如需要用戶自已輸入資訊的輸入框,或者下拉選擇選項的這種,如果不做好輸入內容的過濾,就很可能發生 SQL 注入,

就拿這個登錄界面來說,用戶名和密碼都是你要輸入的內容,點擊登錄按鈕之后,會把你輸入的值傳遞到服務端,服務端再到資料庫進行查詢,

假設后端的查詢陳述句是這樣的,不要在乎這是什么語法,只是舉個例子,

String sql = "select * from `user` where  account={account} and password={password}";

正常的情況,比如 account 輸入的是一個電話號碼 13001980988,密碼是 123456,那拼接出的 SQL 陳述句就是

String sql = "select * from `user` where  account='13001980988' and password='123456'";

然后,服務端通過資料庫連接執行這條陳述句:

select * from `user` where  account='13001980988' and password='123456';

最后,資料庫正常回傳符合條件的記錄,代碼中再根據結果進行判斷,執行后面的邏輯,

不正常的輸入

SQL 注入就是通過不正常的輸入來獲取程式開發者意料之外的結果,

什么是不正常的輸入呢?

比如我在用戶名輸入框中輸入的內容是這樣子的 :13001980988' or 1=1 -- ,密碼輸入框隨便輸入什么都無所謂,然后點擊登錄,傳輸給后端,后端拼接出來的結果就是這樣的:

String sql = "select * from `user` where  account='13001980988' or 1=1 --'  and password='123456'";

然后,服務端通過資料庫連接會執行下面這條陳述句:

select * from `user` where  account='13001980988' or 1=1 --'  and password='123456'

以 MySQL 為例, -- 是 MySQL 中的注釋符號,上面的陳述句中 --后面的相當于是注釋內容了,所以最后實際執行的 SQL 陳述句是這樣的:

select * from `user` where  account='13001980988' or 1=1 

于是,SQL 注入就這么發生了,顯然有了 or 1=1 這個條件,表中所有的記錄都符合條件,如果在用戶名輸入框中輸入的是 adminadministrator 等已知的后臺管理員賬號,那就可以用管理員賬號直接登錄系統了,

上面就是 SQL 注入的基本原理,

SQL 注入遍地都是的年代

在9、10年前,也就是在我小時候(對,這個詞好,小時候),那時候智能手機才剛剛出來,塞班系統還很貴,根本就買不起,用著功能機,30M的流量能用堅持一個月,聊天只靠 QQ 和 短信,微信才剛要問世,更別提什么 APP 了,根本就沒有,那時候,PC Web 才是根正苗紅的網路主宰,如果說要在網上干點兒什么的話,那必須要有一個配套的網站才可以,

互聯網還沒有發展的這么成熟,用的技術也比較原始,絕大多數的網站是用 PHP 寫的,還有很多用 ASP ,可能有些同學都不知道 ASP 是什么,它雖然也是微軟的,但是卻不是 ASP.NET,資料庫很多用的是 MySQL ,還有一部分用的是更原始的 Access,可能又觸到某些同學的盲區了,這不怪你沒見識,只怪你太年輕,

一些小公司啊、學校啊、政府部門網站啊、各種論壇啊等等,各種五花八門的網站,不像現在這樣,無論你用 PHP、Java 還是 Python,都有很多成熟的開發框架供你選擇,成熟的框架必然會減少漏洞和降低被攻擊的風險,但那時候沒有這么多框架供選擇,就比如很多學校會選擇用 ASP + Access 組合的架構來開發自己的學校官網、教務管理系統等,功能上比較簡單,但是全靠手工去寫,就說 SQL 查詢吧,從建立資料庫連接到拼接 SQL 陳述句,再到執行查詢處理查詢結果,全都要自己實作,并沒有什么 ORM 框架、資料庫連接池供選擇,由此就帶來了 SQL 注入的風險,

而且建網站,如果不想開發的話,有很多 CMS 框架,尤其 PHP 的很多,現在依舊使用廣泛的有 WordPress,當時國內的有 Discuz、DEDECMS 等一批傻瓜建站的 CMS 系統,由于代碼都是開源的,而且 WordPress 還支持插件,所以會有很多相關的漏洞爆出來,尤其在多年以前,有了漏洞,想拿下一個網站真是太容易了,即使漏洞已經公布并有了解決方案,但依然有好多網站不及時修補和升級,現在在 Google 中搜索相關的 SQL注入關鍵詞,有很多相關介紹,

說了這么多,這不都是 PHP 的代碼嗎?噓,只是碰巧而已,說明 PHP 市場大呀,畢竟PHP是最好的開發語言,那 Java 中就沒有了嗎,當然有啊,

MyBatis 中的 SQL注入風險

最近在看一些代碼,Spring Boot + MyBatis 的,偶然發現一個模糊查詢的方法的 SQL 陳述句中用到了 like '%${keyword}%'這樣的查詢條件,這一看就有 SQL 注入漏洞,
大家可能都了解,MyBatis 是可以解決 SQL 注入的問題的,一般我們在使用 MyBatis 的時候都會把 SQL 陳述句單獨的放到 xml 檔案中,在 SQL 陳述句中支持兩種格式的引數占位符,一種是 #{parameter},另一種是 ${parameter},在這兩種引數占位符中,#{parameter}是安全的,不存在SQL注入漏洞,而 ${parameter}是存在 SQL 注入漏洞的,

安全的占位符格式

#{parameter} 這種占位符會在 MySQL中進行預編譯,所以你觀察到 MyBatis 列印出來的日志是這樣的:

select * from `user` where  account=? and password=?

其實在框架底層,是 JDBC 中的 PreparedStatement 類在起作用,PreparedStatement 是我們很熟悉的 Statement 的子類,它的物件包含了編譯好的SQL陳述句,這種預編譯的方式不僅能提高安全性,而且在多次執行同一個SQL時,能夠提高效率,原因是SQL已編譯好,再次執行時無需再編譯,

不知道你有沒有寫過直接用 JDBC 操作資料庫的代碼,反正大學老師就告訴我們要用占位符去做資料庫查詢,而不是拼接 SQL 字串,因為用占位符的方式安全,其實,MyBatis 的預編譯模式的底層實作就可以理解為下面這樣的,

Connection conn = getConn();//獲得連接
String sql = "select * from `user` where  account=? and password=?"; //執行sql前會預編譯號該條陳述句
PreparedStatement pstmt = conn.prepareStatement(sql); 
pstmt.setString(1, "13001980988");
pstmt.setString(2, "123456");
ResultSet rs=pstmt.executeUpdate(); 

不安全的占位符格式

${parameter} 這種格式是不進行預編譯的,也就相當于字串的拼接,存在 SQL注入的問題,如果非要用這種方式,那需要在程式中對引數進行安全性校驗,強烈建議在使用 MyBatis 的程序中不要使用 ${parameter}這種格式的占位符,而要使用 #{parameter}這種格式,

來一波SQL注入

我模擬了一個 SQL 注入的場景,很簡單,就是一個模糊查詢的介面,根據用戶輸入的關鍵詞查詢,

資料庫中有兩張表,分別為用戶表(user)和 新聞表(news),

用戶表:

新聞表:

NewsMapper 類:

public interface NewsMapper {
    List<News> selectNewsLikeTitle(@Param("keyword") String keyword);
}

實際的 SQL 陳述句,注意,正是用到了 ${keyword},才有了 SQL 注入的問題,

<select id="selectNewsLikeTitle"  resultType="org.kite.purely.mybatis.entity.News">
    select * from news where title like '%${keyword}%';
</select>

然后我寫了一個控制臺,接收輸入的引數,傳給 selectNewsLikeTitle,以便來嘗試 SQL 注入,

代碼已上傳至 github,鏈接放在了文末,需要的同學自取

正常的輸入

新聞表就三條資料,我以 Docker 作為關鍵詞,正常情況下,應該是這樣的回傳結果:

藍色是我輸入的關鍵詞,后面跟著查詢陳述句,一個標準的模糊查詢陳述句,最后輸出的結果也沒問題,

select * from news where title like '%Docker%'; 

SQL 注入

如果使用者都這么守規矩就好了,但是真實情況往往并不是這樣的,有些人就是喜歡躲在陰暗的角落放著冷箭,大部分情況下是有利可圖,極少部分干脆就只是為了滿足變態心理,

1、查詢所有記錄

有同學已經看出來了,輸入空值不就是查詢所有嗎?對的,沒錯,但真實情況下,前端或者 Controller、Service 層會做攔截,不允許查詢所有,

正常邏輯不允許,但是 SQL 注入就可以,我輸入下面這樣的條件引數,看看會出現什么結果呢?

Docker' or 1=1 or 1='

結果出來了,三條資料全部查詢出來了,

因為構造的 SQL 陳述句已經完全變味兒了,SQL 陳述句是這樣的,由于條件 or 1=1 的加持,導致任何記錄都符合條件,

select * from news where title like '%Docker' or 1=1 or 1='%';

通過添加'來保證條件中字串前后單引號的閉合,

還可以是這樣的條件

Docker' or 1=1 -- 
或者
Docker' or 1=1 #

因為--#都是 MySQL 中的注釋符號,用它們來注釋掉關鍵注入后面的部分,最后構造出來的 SQL 陳述句是:

select * from news where title like '%Docker' or 1=1 -- %';
或
select * from news where title like '%Docker' or 1=1 #%';

所以,最后有效的部分就是注釋符號前面的部分,自然,查詢出來的就是所有的記錄,

select * from news where title like '%Docker' or 1=1

這種情況,其實保密資料沒有什么泄漏,但是,它可能會拖垮資料庫,拋開 Redis 快取什么的不談,假設僅有 MySQL 這一層,假設資料庫中有幾萬條、幾十萬條資料,黑客不斷制造這樣的模糊查詢,你的資料庫服務馬上就會掛掉,

2、聯查其他表,危險行為

把資料庫拖垮已經很不爽了,但是更嚴重的,是獲取資料,

我想要通過這條查詢陳述句把 user表的資料也套出來,你看著是不是就有點兒意思了,怎么辦呢,通過 union就可以,

前提是我已經知道有 user 表的存在了,別問怎么知道的,反正是已經知道了,而且黑客有很多辦法能猜到,

我構造這樣的引數:

Docker' union select * from `user` -- 注釋掉后面的內容

執行一下,出現這樣的提示:

構造出來的 SQL 沒有問題,就是我們想要的,

select * from news where title like '%Docker' union select * from `user` -- 注釋掉后面的內容%';

但是這用戶體驗很好,給出了具體的例外,體驗好是對于攻擊者而言的,如果每次例外都把原始例外資訊拋出,那能給攻擊者省不少事兒,就像下面這個例外,

Cause: java.sql.SQLException: The used SELECT statements have a different number of columns

這是因為 news 表和 user 表的列數不一致導致的,前后列數不一致,那這時候怎么辦呢?

構造出下面這樣的查詢陳述句可以試探出 news 表的列數,其中 select 1,2 from user中的 1,2表示假設 news 表有兩列,可以從 1 到 n,當嘗試到哪一個而不出錯或者正常回傳的時候,表示 news 表就有多少列了,

select * from news where title like '%Docker' union select 1,2 from `user`;

要構造這樣的陳述句,需要輸入的引數是:

Docker' union select 1,2 from user # 

因為 news 表只有兩列,所以上面的引數可以成功執行,

盲注

大多數網站都不會將例外資訊直接回傳的,當攻擊者拿不到即時的例外反饋時,就像是合著眼睛去猜,這種情況就叫做盲注,盲注是需要極大的耐心、高超的技術以及豐富的經驗的,所以說黑客真不是好當的,

當試探出 news 表的列數后,再去配合它篩選 user 表的列就可以了,user 表的列名其實也是靠各種猜測的,比如常規的命名 name、account、phone、mobile、password 等,或者根據你回傳給前端的屬性對應著猜,比如回傳的用戶名是 userName,那你資料庫中的欄位就很有可能是 user_name,

假設我猜 user 表有 phone 這個欄位,那我構造的引數就可以是下面這樣的:

Docker' union all select 1,phone from user # 注釋掉后面的內容 ,來確定news表有兩個欄位

最后執行下來,結果是這樣的,四條 user 記錄全出來了,

或者我還確定 user 表中有 password 列,那就可以直接把 password 再取出來了,如果 password 再是明文的,那就熱鬧了,

有了用戶名和密碼,是不是就有點危險了,

3、更危險的高權限

還有更危險的呢,假設你程式中資料庫連接用到的賬號是高權限的,比如 root 賬號,有好多中小應用都這么用,別驚訝,

發散思維想一想,這時候能干嘛?

由于權限夠高,那意味著可以執行任何合法的 SQL 陳述句了,在 MySQL 中有資料庫 information_schema,它存盤著當前資料庫實體中的很多重要資訊,而且其中的表結構都是公開透明的,那這樣一來呢,我們就可以通過這個資料庫掌握當前資料庫服務的幾乎所有內容了,

不僅如此,高權限用戶還能通過 MySQL 的讀寫檔案功能實作更多的功能,比如配合 webshell 上傳木馬,獲取服務器的控制權,從而實作脫褲(拖庫),

當然了,說的輕松,實作起來就困難了,不過只要有漏洞,就會被利用,

一些工具

俗話說,工欲善其事,必先利其器,漏洞哪兒那么容易挖,很多有價值的漏洞確實是厲害的黑客手工挖出來的,

為了方便的挖掘常見漏洞及利用漏洞,有很多網路安全專家開放出來的工具,可以讓我等小白簡單上手,比如我上學時候用到的「啊D注入工具」,可以用來掃碼注入點、SQL注入檢測、管理入口檢測等,

還有比較專業的 SQL 注入工具「SQLMap」,它是一款命令列工具,SQLMap 提供了豐富的命令來幫我們發現漏洞、利用漏洞,

img

另外,如果你想學習 SQL 注入的一些基礎,可以直接整個靶場來玩玩兒,比如這個 Pikachu 就不錯,

https://github.com/zhuifengshaonianhanlu/pikachu

總結

本文并不是為了教各位如何完成 SQL注入,畢竟,我也沒這個實力,當然,制造漏洞的實力還是有的,

只是想說,在寫代碼的時候一定要注意,稍有不慎就可能寫出有漏洞的 SQL,所以,盡量用成熟框架的標準寫法,不要圖省事自己拼 SQL,

不光是 SQL 這部分,其他的涉及到用戶互動的地方都要注入,比如用戶表單,有時候可能產生 xss 漏洞,還有檔案上傳的部分,別用戶上傳了木馬都不知道怎么回事,

愿你的代碼沒有 bug,雖然這是不可能的,

文中的測驗代碼已放至倉庫:https://github.com/huzhicheng/SQL_Injection,有需要的同學自取,


這位英俊瀟灑的少年,如果覺得還不錯的話,給個推薦可好!

公眾號「古時的風箏」,Java 開發者,全堆疊工程師,bug 殺手,擅長解決問題,
一個兼具深度與廣度的程式員鼓勵師,本打算寫詩卻寫起了代碼的田園碼農!堅持原創干貨輸出,你可選擇現在就關注我,或者看看歷史文章再關注也不遲,長按二維碼關注,跟我一起變優秀!

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/246056.html

標籤:其他

上一篇:SQL Server解惑——為什么ORDER BY改變了變數的字串拼接結果

下一篇:Ambari 學習指南

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more