我有一個使用用戶輸入的詞條查詢數據庫的搜索頁面。我在Spring中使用Mybatis 3.4.0。如何:帶單引號的Mybatis查詢詞/撇號
問題是Mybatis在搜索詞中刪除了任何單引號,無論我是否轉義它們。這些是有效的查詢,因爲用戶需要能夠搜索像O'Toole這樣的字符串,但是沒有任何內容被返回。
這是來自mapper的代碼片段。在考慮中的字段是caseWhereConditionDTO.value
和傳入的值是,例如,O''TOOLE
(手動代碼之前逸出)
<if test="caseWhereConditionDTO.value != null">
${caseWhereConditionDTO.leftExpression}
${caseWhereConditionDTO.operator}
#{caseWhereConditionDTO.value}
${caseWhereConditionDTO.closeConditionString}
</if>
這導致where子句
where UPPER(p.last_name ||', ' || p.first_name) LIKE 'OTOOLE%'
其缺少雙轉義Ò 'TOOLE
一切工作正常,當在映射器中我用$替換#並用單引號括起來
'${caseWhereConditionDTO.value}'
導致
where UPPER(p.last_name ||', ' || p.first_name) LIKE 'O''TOOLE%'
一個SQL輸出這給預期的查詢結果
但我當然想保留#{}
這樣的SQL注入保護我問題是,如何使用單引號查詢條款,同時仍然使用#{}/prepared語句的sql注入保護?
如果您已經使用雙引號手動轉義caseWhereConditionDTO.value,您是否可以使用文本字面值語法?例如,查看http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements003.htm#sthref344,並工作以生成where子句,如where q'[UPPER(p.last_name || ',','|| p.first_name)like'O'TOOLE%']' –