注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

红尘若梦

生活的色彩

 
 
 

日志

 
 

Mysql乱码,注入攻击防范,无法导入等问题的取巧解决办法  

2015-09-10 18:06:10|  分类: 技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
众所周知,Mysql+Java搭配,很容易产生乱码问题,这个是因为字符集的问题,同样SQL语句注入攻击,以及无法导入等问题,却大多都是基于一些特殊字符,如',;,等等。
那么为了避免这些问题,可以在存入字段时就先将字段处理下再存入数据库。当然这个字段处理可以用程序语言来处理,也可以用MYSQL触发器来处理。那么就来考虑下,用那些通用的函数来处理。象MD5,CRC32之类的就不考虑了。
创建库的语句如下:

CREATE TABLE `593668` (
`id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
)

优先考虑的肯定是BASE64,但是好象MYSQL并不支持,那么用URLENCODE,汗,这个也需要自己写扩展函数。当然如果用程序语言这些都不是问题。那么其实可以利用MYSQL的HEX()函数。下面来创建一个触发器:

DELIMITER $$
CREATE
TRIGGER `trigger_test` BEFORE INSERT
ON `593668`
FOR EACH ROW BEGIN
SET NEW.title =hex(NEW.title);
END$$
DELIMITER ;

触发器很简单,执行下插入语句,看看效果:

insert into `593668`(`id`,`title`) values ( NULL,'593668');

Mysql乱码,注入攻击防范,无法导入等问题的取巧解决办法 - 1976xyg - 红尘若梦
哈,确定变动了,不过好象反而增加了一些长度啊,确实,因为HEX函数就是把二进制的数据转为16进制的字符串;这其实就已经达到我们想要的效果了,因为即使插入字段值中有一些特殊字符也会转化成16进制的字符串。虽然会多占用一些字段空间,其实查询什么的,只要用下UNHEX函数,就都不会受到影响[而且执行效率也不会降低太多]。

select unhex(title) from `593668` where unhex(title) like '%593%';#查询语句

当然,如果您觉得占用空间多余,还可以用COMPRESS函数,将字段再压缩一下。当然这里字段就需要变更下类型,varbinary或者blob。读取时将字段同样用UNCOMPRESS解压缩下即可,只是查询就不太方便了。更进一步,您需要将字段加密的话,还可以用ENCODE()|DECODE()函数。经过编码过的字段,可以防止注入,也不会有乱码,导入也不会有问题。当然这更进一步的研究,就需要大家继续深入挖掘了。
  评论这张
 
阅读(86)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017