coding習慣 + Bug記錄整理

📖 清單

  • 1、包裝類型導致的NPE
  • 2、xxApiWrapper命名
  • 3、@see注釋
  • 4、MySQL模糊匹配特殊字符bug

整理些平時不好的coding習慣導致的bug📝

1、包裝類型導致的NPE

處理項目的一個bug,看日志是發生了空指針,相關代碼如下:

@Data
public class Dto {private Integer offset;private Integer limit;}
if (dto.getLimit() < 0 || dto.getLimit() > 100) {throw new RuntimeException("參數非法");
}

這里對外API文檔寫的offset和limit有默認值0和20,但實際代碼里并未賦值,這里用的是int的包裝類,不傳時,默認值為null,而下面 < 0 的比較,會觸發自動拆箱,調用Integer對象的intValue()方法,因此,空指針

2、xxApiWrapper命名

發現一個類命名的單詞,wrapper,用它結尾命名一個封裝📦類,很不錯

在這里插入圖片描述

/*** 封裝調用xx系統的API*/
public class ServiceApiWrapper {}

3、@see注釋

有時候,一些字段是枚舉類型,但Dto類中我們更想用String,此時,可以@see 跟一個全類名,方便點擊跳轉到對應的類上:

/*** @see com.llg.common.SourceTypeEnum*/
private String sourceType;

4、MySQL模糊匹配特殊字符bug

用戶反饋有個模糊查詢,輸入_下劃線,返回的有帶-中劃線的結果,debug到對應位置的代碼:

criteria.andCondition("upper(group_id) like upper('%" + searchKey + "%')");

這里很明顯是用戶輸入的下劃線被當成通配符了,作用是匹配單個字符,對于這種情況,要考慮兩個點:

  • SQL注入
  • 特殊字符
字符類型含義
%通配符匹配任意數量字符(包括0個)
_通配符匹配單個字符
\轉義符取消后續字符的特殊含義

永遠不要直接拼接用戶輸入到你的SQL中,對于特殊字符,用這個工具類處理一下,加轉義符,取消后面字符的特殊含義:

public class SqlUtil {// https://dev.mysql.com/doc/refman/5.7/en/string-comparison-functions.html#operator_likepublic static String escapeLikeValue(String value) {if (value == null) {return null;}return value.replace("\\", "\\\\").replace("%", "\\%").replace("_", "\\_");}
}

對于SQL注入,其實最好的就是預處理,SQL模板化,讓SQL和傳入的值分開,但這里項目用了tk mybatis框架,考慮加個正則表達式攔一下,能解決一部分,但并不是最優解:

private static final Pattern RISK_SQL = Pattern.compile("[\\s#/*'\"]");
if (RISK_SQL.matcher(searchKey).find()) {throw new RuntimeException("輸入非法");
}

但這么改其實漏洞🕳?也不少,比如union 或者結束; 搭配Drop table等等:

SELECT * FROM users WHERE id = 1 UNION SELECT password FROM users
'); DROP TABLE x; --

總之,這種拼接SQL的,要特別注意SQL注入導致數據泄漏或者數據被刪的問題。

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

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

相關文章

機器學習項目微服務離線移植

機器學習項目微服務離線移植 引言&#xff1a;為什么需要Docker化機器學習項目&#xff1f; 在當今的機器學習工程實踐中&#xff0c;項目部署與移植是一個常見但極具挑戰性的任務。傳統部署方式面臨著"在我機器上能運行"的困境——開發環境與生產環境的不一致導致…

JS紅寶書筆記 8.4 類

與函數類型相似&#xff0c;定義類也有兩種主要方式&#xff1a;類聲明和類表達式&#xff0c;這兩種方式都使用class關鍵字加大括號 與函數表達式類似&#xff0c;類表達式在它們被求值前也不能引用&#xff0c;不過與函數定義不同的是&#xff0c;雖然函數聲明可以提升&…

專題:2025游戲科技與市場趨勢報告|附130+份報告PDF匯總下載

原文鏈接&#xff1a;https://tecdat.cn/?p42733 2024年全球游戲市場規模突破1877億美元&#xff0c;中國以37.5%的全球占比成為核心增長引擎。生成式AI以52%的企業采用率重塑開發流程&#xff0c;混合休閑游戲實現37%的收入增長&#xff0c;跨端互通產品貢獻42%增量。玩家行為…

【沉浸式解決問題】Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required

目錄 一、問題描述二、場景還原1. 測試mapper2. 測試service 三、原因分析四、解決方案1. DemoApplicationTests2. DemoApplication 后記 一、問題描述 在Application文件中加了ComponentScan注解&#xff0c;此后運行任何測試方法均報錯 java.lang.IllegalStateException: Fa…

Ubuntu 和 CentOS 中配置靜態 IP

在 Ubuntu 和 CentOS 中配置靜態 IP 的方法有所不同&#xff0c;主要因為兩者使用的網絡管理工具不同。以下是詳細步驟&#xff1a; Ubuntu&#xff08;18.04 及更新版本&#xff0c;使用 netplan&#xff09; 1. 查看網卡名稱 ip a記錄網卡名稱&#xff08;如 ens33、eth0&a…

4、做中學 | 二年級下期 Golang整型和浮點型

上篇介紹了哪些數據類型&#xff0c;如何進行聲明常量和變量&#xff0c;那么接下來進行詳細學習下各個數據類型的使用&#xff01; 一、整數 在go中&#xff0c;整數分為倆類&#xff0c;一個是無符號整數&#xff0c;即0以上數值&#xff1b;另一個是有符號數值&#xff0c;…

C++11 GC Interface:從入門到精通

文章目錄 一、引言二、C11簡介2.1 C11發展歷史2.2 C11新特性概述 三、C11中的垃圾收集支持和基于可達性的泄漏檢測3.1 背景與原理3.2 相關標準與接口3.3 示例代碼 四、C11 GC interface的使用場景4.1 簡化內存管理4.2 提高代碼可靠性 五、C23中移除垃圾收集支持和基于可達性的泄…

《高并發系統性能優化三板斧:緩存 + 異步 + 限流》

高并發系統性能優化三板斧&#xff1a;緩存 異步 限流 引言 在互聯網應用的高并發場景下&#xff0c;系統性能面臨巨大挑戰。以某電商平臺會員活動為例&#xff0c;活動期間瞬時QPS可達10萬&#xff0c;若未進行有效優化&#xff0c;服務器將迅速崩潰。本文從緩存、異步、限…

JVM(4)——引用類型

痛點引入&#xff1a; 為什么需要不同的引用類型&#xff1f;直接只用強引用不行嗎&#xff1f;&#xff08;內存泄漏風險、緩存管理粗粒度、對象生命周期監聽需求&#xff09; 核心作用&#xff1a; 解釋引用類型如何讓程序員與垃圾收集器&#xff08;GC&#xff09;協作&…

ONLYOFFICE 文檔 9.0 版本已發布:新界面、圖表查看器、.md 文件支持、AI 表格與宏等更新

ONLYOFFICE 文檔 9.0 版本已正式發布。此次更新包含 20 多項新功能和約 500 項修復&#xff0c;全面提升您的辦公效率。從全新界面、突破性的 AI 工具到更廣泛的文件格式兼容性&#xff0c;本次發布將帶來更加流暢的使用體驗。閱讀本文&#xff0c;了解詳情。 更新全部編輯器的…

關于python-socket服務的問題記錄

概述 在使用pythonwebsocket部署socket服務&#xff0c;前端使用小程序來連接&#xff0c;過程中存在以下可能出現的問題&#xff1a; 1&#xff0c;代碼里socket端口問題2&#xff0c;服務器配置問題&#xff08;域名解析&#xff1f;Nginx配置是否正確處理了WebSocket升級頭…

typescript vs go vs rust

typescript 后端選型&#xff1a; Express &Typescript &trpc 廣泛使用&#xff0c;靈活&#xff0c;快速&#xff0c;穩定 Nestjs 企業級&#xff0c;標準化&#xff0c;像java &#xff0c;依賴注入&#xff0c; Hono , web standards framework. Support for any J…

OpenGL和OpenGL ES區別

OpenGL&#xff08;Open Graphics Library&#xff09;和OpenGL ES&#xff08;OpenGL for Embedded Systems&#xff09;都是用于圖形渲染的API&#xff0c;但它們的目標平臺和設計定位有所不同。 1. 目標平臺 OpenGL 主要用于桌面平臺&#xff08;如Windows、macOS、Linux&a…

PyTorch 入門之官方文檔學習筆記(一)

目錄 1 張量 1&#xff09;張量的初始化和屬性 2&#xff09;張量操作 3&#xff09;使用 NumPy 進行橋接 2 torch.autograd 1&#xff09;背景 2&#xff09;在 PyTorch 中的使用 3&#xff09;Autograd 的微分機制 4&#xff09;計算圖原理 5&#xff09;從計算圖中…

King’s LIMS 系統引領汽車檢測實驗室數字化轉型

隨著汽車保有量的持續攀升和車齡的增長&#xff0c;消費者對汽車的需求已悄然轉變&#xff0c;從最初對外觀和性能的追求&#xff0c;逐漸深化為對安全性、可靠性、耐久性、性能與舒適性以及智能化功能的全方位關注。這無疑讓汽車檢測行業在保障車輛質量、滿足市場需求方面肩負…

Neo4j常見語句-merge

merge用法&#xff1a;MERGE 是 Neo4j 中一個強大的操作符&#xff0c;用于確保圖中存在特定的節點或關系。它的核心邏輯是&#xff1a;如果目標存在則匹配&#xff0c;不存在則創建 基本語法與邏輯&#xff1a; MERGE <pattern> [ON CREATE <create_clause>] //…

Mem0多級記憶實現機制詳解

在人工智能交互場景中,記憶能力是實現個性化服務與智能決策的關鍵。Mem0 通過設計分層記憶架構,實現了對用戶、會話和智能體狀態的多級管理。各層級記憶既相互獨立存儲,又通過精密的關聯機制協同運作,確保在不同場景下都能提供精準的上下文支持,顯著提升 AI 交互的智能性與…

Python 爬蟲入門 Day 5 - 使用 XPath 進行網頁解析(lxml + XPath)

Python 第二階段 - 爬蟲入門 &#x1f3af; 今日目標 掌握 XPath 的基本語法使用 lxml.etree 解析 HTML&#xff0c;提取數據與 BeautifulSoup 比較&#xff1a;誰更強&#xff1f; &#x1f4d8; 學習內容詳解 ? 安裝依賴 pip install lxml&#x1f9e9; XPath 簡介 XPa…

變幻莫測:CoreData 中 Transformable 類型面面俱到(六)

概述 各位似禿似不禿小碼農們都知道&#xff0c;在蘋果眾多開發平臺中 CoreData 無疑是那個最簡潔、擁有“官方認證”且最具兼容性的數據庫框架。使用它可以讓我們非常方便的搭建出 App 所需要的持久存儲體系。 不過&#xff0c;大家是否知道在 CoreData 中還存在一個 Transfo…

Vuex(一) —— 集中式的狀態管理倉庫

目錄 Vue組件間通信方式回顧 組件內的狀態管理流程組件間通信方式 父組件給子組件傳值 (最簡單的一種方式)子組件給父組件傳值不相關組件之間傳值其他常見方式($ref) 簡易的狀態管理方案 上面組件間通信方式的問題集中式的狀態管理方案 Vuex 什么是Vuex?什么情況下使用Vuex?…