工作中基本上都會使用mybatis。有一次為了達到控制許可權的效果,又為了最少的修改現有的**,使用了自定義的mybatis的外掛程式,在運算元據的時候做一次查詢,判斷是否有許可權操作。這種許可權控制是很暴力且有很多漏洞的。
問題1在一次操作中,當引數只有乙個且引數型別為long型時,預設這個引數是表a的主鍵pk,在mybatis外掛程式中根據這個主鍵去查詢資料,根據查詢結果判斷當前使用者是否有許可權對此行資料進行操作。實際操作中,有一次更新並不是根據a主鍵pk進行更新,而是update set xx=*** where a_foreign_key = #。然而在外掛程式中還是認為alongparam是a的id,導致查詢出的行和要修改的行不是同一行,使用者的許可權判斷出現錯誤,最後更新語句未執行。
解決方法
莫名其妙將問題解決了
dao層定義:
public long update
(long alongparam)
; "update" paramtype=
"long"
>
update set xx=*** where a_foreign_key = #
<
/update>
在未定位到問題時,直接將dao層定義修改:
public long update
(@param
("alongparam"
) long alongparam)
;
修改後,更新語句順利執行,但並未定位到原因。
最後通過單步除錯,定位到mybatis的一段邏輯:在查詢許可權時,如果入參是乙個long則認為它是表a的主鍵;如果是乙個map型別,則先找map中key為pk的entry,用value去查詢,未找到則跳過。入參不是long或者map則直接執行,map中沒有key==pk的,則直接執行。
當加上@param(「alongparam」)之後,入參變成了乙個map,找不到建pk,所以update直接執行了。雖然加上@param,確實達到了效果,但也沒有做先查詢判斷許可權,再執行的邏輯,有了越權的可能。
相關知識
乙個問題記錄2014 10 30
問題背景 公升級所有的動態庫,客戶端獲取不到伺服器資料,並且公升級實際伺服器時沒有備份資料 環境涉及lisp,dll,config 問題查詢過程 1 先在實際伺服器上查詢,看日誌,發現可能是 原因。2 然後在測試伺服器上查詢是否是 的原因,但是發現測試伺服器各種缺必要的資料,也就是說測試伺服器不滿足...
java 遞迴的乙個問題記錄
問題 第一行是乙個數字n 接下來m個數字在陣列a中 要求輸出對應下標使去掉這些數字時剩下的數字之和為n 例如 3 2 4 3 1 此時,程式輸出 0 20 3 4 1 2 4 2 3 如下 public class main public static void main string args b...
mybatis學習及問題記錄
獲取mybatis config.xml,建立工廠類的過程寫在了乙個dbutil類中,提供獲取session的靜態方法。讀取xml檔案的初始化 寫在static 語句塊中。mybatis的sql配置中,物件中的物件欄位的屬性是用物件名來作字首的 真繞口 public class address pu...