拼接SQL的一些问题_Tomcat, WebLogic及J2EE讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Tomcat, WebLogic及J2EE讨论区 »
总帖数
3
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3196 | 回复: 2   主题: 拼接SQL的一些问题        下一篇 
chong.zhang
注册用户
等级:上尉
经验:627
发帖:25
精华:0
注册:1970-1-1
状态:离线
发送短消息息给chong.zhang 加好友    发送短消息息给chong.zhang 发消息
发表于: IP:您无权察看 2014-5-19 11:30:44 | [全部帖] [楼主帖] 楼主

一些程序员在喜欢采用字符串拼接SQL的方式执行SQL语句。例如 String query ="SELECT * FROM user WHERE user_name = '" + request.getParameter("customerName") + "' and password = '" + request.getParameter("customerName") + "'" ; 我本人以前也是喜欢这样做的,我觉得这样处理,在Log上可以拿到能直接在数据库上执行的SQL,不像一些框架,打印出来的SQL中总是带一堆问号(如java中的Hibernate)。 但这种处理方法有一个不好的隐患。产生的主要原因是编程语言中的转义字符和SQL语言中的转义有差异。 上例中,若customerName变量输入"admin' --" 拼接出来的sql语句就成了这样了 select * from user where user_name = 'admin' -- ' and password = 'xxx' 由于-- 在sql语句中代表注释,最后执行的sql就成了 select * from user where user_name = 'admin' 也就是说我不需要输入密码就以管理员身份登录了。 在sql中字符“‘”,“_”,“%”,“--”等一些字符都是有他特殊的含义的,如果采用sql拼接的方案,是需要处理这些转移字符的,否则,轻的造成sql执行出错,重的影响数据安全。 当然最的防范方法也有,就是采用绑定变量的处理方案,这样底层的api会帮我们出来这些头疼的字符。程序员只要关注业务逻辑处理就好了。 令外:oracle10g后加入了一个q'函数,可以过滤oracle的转义字符, select 'it''s an example' from dual; select q'[it's an example]' from dual; 这两句的输出是一样的,不过一样不推荐使用,知道就好了。 如果想了解的更深入的话,可以查查关于sql注入方面的资料。可以帮你写出更健壮的代码。




赞(0)    操作        顶端 
koei
版主
等级:大校
经验:4186
发帖:7
精华:0
注册:2011-7-21
状态:离线
发送短消息息给koei 加好友    发送短消息息给koei 发消息
发表于: IP:您无权察看 2014-5-19 16:21:27 | [全部帖] [楼主帖] 2  楼

再多给大家几条详细的Guide Line就好了 :-)



赞(0)    操作        顶端 
chong.zhang
注册用户
等级:上尉
经验:627
发帖:25
精华:0
注册:1970-1-1
状态:离线
发送短消息息给chong.zhang 加好友    发送短消息息给chong.zhang 发消息
发表于: IP:您无权察看 2014-5-20 15:52:30 | [全部帖] [楼主帖] 3  楼

一般的情况下尽量做到前后台一起控制,前端js可以是用正则表达式拦截异常字符,或者限制仅能输入字母和数字,后台采用绑定变量的方式调用数据库接口。

至于是有还有其他更好的解决方案,大家可以贴出来,互相学习。



赞(0)    操作        顶端 
总帖数
3
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论