標籤:mysql newlisp
什麼是逸出字元
mysql的escape character指的是需要轉義的特殊字元,這些字元出現在sql語句中,如果沒有轉移會導致sql文法報錯或者有sql注入攻擊的可能。
主要有以下幾種都需轉義:
\x00, \n, \r, \, ‘, " and \x1a.
比如‘ 就需要變成\‘
下面是sql測試:
mysql> INSERT INTO nodes(name) VALUES (‘select a.dt, count(*), count(distinct a.uv) from (select dt, case when p2 in (‘04‘, ‘06‘)‘) ;ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘04‘, ‘06‘)‘)‘ at line 1
出錯原因是字串值中又出現了 ‘ 符號, 比如:‘04‘
解決方案是在前面加上\
INSERT INTO nodes(name) VALUES (‘select a.dt, count(*), count(distinct a.uv) from (select dt, case when p2 in (\‘04\‘, \‘06\‘)‘);Query OK, 1 row affected (0.04 sec)
newLISP解決方案mysql client 已經提供了一個C函數
mysql_real_escape_string
newlisp的artful mysql模組已經使用之。
(import libmysqlclient "mysql_real_escape_string")
直接使用:escape函數,內部使用了上面的mysql_real_escape_string函數。
> (load "/opt/newlisp_util/mysql.lsp")MAIN> (setf db-src (Mysql))(Mysql 27962464)> (:escape db-src "select dt, case when p2 in (‘04‘, ‘06‘)")"select dt, case when p2 in (\\‘04\\‘, \\‘06\\‘)\000
這樣在運行拼接sql語句後,可以通過:escape函數做一次處理
也可以使用:query的進階形式:
;; (:query db ‘("SELECT id FROM employees WHERE name = %s" ‘("Johnson, John")));; ; SQL generated: SELECT id FROM employees WHERE name = ‘Johnson, John‘;; => (MysqlResult 1069216)
這裡同時解決了SQL語句格式化拼接問題和處理escape字元問題。
只需要將值組成list,然後作為最後一個參數傳遞給query函數。
newLISP處理mysql escape character