首页 > 代码库 > newLISP处理mysql escape character
newLISP处理mysql escape character
什么是转义字符
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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。