2009年05月9日 下午 59:22 | 作者:hemon
流程:Apache日志分析,解析GET的URL参数,生成CSV后,使用LOAD INFILE导入数据库;
问题:字段错位
一行数据(1,2,3),导入后成了(1,23,NULL);
原因:分隔符和字段值中的宽字节字符组合成了新字符;
相当于命中了宽字节编码漏洞:
高字节范围129-254的ASCII编码可以和基础字符编码组成一个非法宽字节字符。
造成漏洞的高字节编码范围:0xC0-0xFE
安全的生成CSV文件的方法:
过滤宽字符函数:
function safe_string($string){
if( strlen($string) > 2 &&
//攻击发生在字符串的最后两个字节,倒数第二个字节ASCII码大于129,倒数第一个字节ASCII码小于127.
(ord(substr($string,-2,1)) >= 129 && ord(substr($string,-1,1))<127) ){
$string = substr($string, 0, -1);
return safe_string($string);
}
return $string;
}
示例代码:
$value = mysql_real_escape_string(safe_string($value));
“$value”,”$value”
倒入这样的CSV就万无一失了,不会出现字段对齐问题。
分类:mysql, 未分类 | 没有评论
2008年03月14日 下午 16:58 | 作者:hemon
做价格数据库(http://cms.xxty.cn/price),农产品搜索提示需要支持字母,网上的mysql函数只支持单个汉字,另外SQL也写得不规范,重写:支持多个汉字。
用法:
SELECT pinyin(’精神鸦片’);
=> JSYP
- DROP TABLE IF EXISTS `pinyin`;
-
- CREATE TABLE `pinyin` (
- `letter` char(1) NOT NULL,
- `chinese` char(1) NOT NULL,
- PRIMARY KEY (`letter`)
- ) ENGINE=MyISAM DEFAULT CHARSET=gbk;
-
- insert into `pinyin`(`letter`,`chinese`) values
- ('A','驁'),
- ('B','簿'),
- ('C','錯'),
- ('D','鵽'),
- ('E','樲'),
- ('F','鰒'),
- ('G','腂'),
- ('H','夻'),
- ('J','攈'),
- ('K','穒'),
- ('L','鱳'),
- ('M','旀'),
- ('N','桛'),
- ('O','漚'),
- ('P','曝'),
- ('Q','囕'),
- ('R','鶸'),
- ('S','蜶'),
- ('T','籜'),
- ('W','鶩'),
- ('X','鑂'),
- ('Y','韻'),
- ('Z','咗');
-
- DELIMITER $$
-
- DROP FUNCTION IF EXISTS `PINYIN`$$
-
- CREATE FUNCTION `PINYIN`(str CHAR(255)) RETURNS char(255)
- BEGIN
- DECLARE hexCode char(4);
- DECLARE pinyin varchar(255);
- DECLARE firstChar char(1);
- DECLARE aChar char(1);
- DECLARE pos int;
- DECLARE strLength int;
-
- SET pinyin = '';
- SET strLength = CHAR_LENGTH(LTRIM(RTRIM(str)));
- SET pos = 1;
- SET @str = (CONVERT(str USING gbk));
- WHILE pos <= strLength DO
- SET @aChar = SUBSTRING(@str,pos,1);
- SET hexCode = HEX(@aChar);
-
- IF hexCode >= "8140" AND hexCode <= "FEA0" THEN
- SELECT letter into firstChar
- FROM pinyin
- WHERE chinese >= @aChar
- LIMIT 1;
- END IF;
-
- SET pinyin = CONCAT(pinyin,firstChar);
- SET pos = pos + 1;
- END WHILE;
-
- RETURN UPPER(pinyin);
- END$$
-
- DELIMITER ;
分类:mysql, sql | 没有评论
2006年07月27日 下午 15:49 | 作者:hemon
分类:mysql | 没有评论