^-^mysql_real_escape_string的好问题
大家伙们都经常用mysql_real_escape_string,我有个疑问,这个函数是不是只有开了mysql扩展才能用,如果我用的是oracle数据库呢。我没开mysql_real_escape_string,我怎么办。
我查了一下php.net,有如下函数,基本上都是针对 每一个数据库的。我的问题:有没有一个通用的mysql_real_escape_string,这个样子的呢?
mysql_real_escape_string
maxdb_real_escape_string
ingres_escape_string
cubrid_real_escape_string
pg_escape_string
mysql_escape_string
maxdb_escape_string
dbx_escape_string
db2_escape_string
mysqli_escape_string
sqlite_escape_string
还有一个问题是:mysql_real_escape_string能完全防止SQL注入吗?
[解决办法]
弄明白 mysql_real_escape_string的功效你完全可以用正则之类的方法来实现,至于是不是要装了扩展才能用我不清楚。
第2个问题
mysql_real_escape_string函数转义 SQL 语句中使用的字符串中的特殊字符,不是用来针对SQL注入攻击的.所以你的问题就有答案了.
不能说用了转义就100%的安全,我前段时间看到有说将'转成16进制的,然后到了mysql却能正常识别。当然我自己没去测试过这个说法是否真的可行,但要相信那些骇客每天削尖了脑袋在想这些。
打算最近写个帖子大家一起来讨论这个令人烦恼的问题.
[解决办法]
对于SQL注入我也是最近在关注,其实并不会比你知道的多,所以希望写个帖子和大家讨论一下,欢迎来指点。
这里有一个据说是dz的
$magic_quotes_gpc = get_magic_quotes_gpc();
@extract(daddslashes($_COOKIE));
@extract(daddslashes($_POST));
@extract(daddslashes($_GET));
if(!$magic_quotes_gpc) {
$_FILES = daddslashes($_FILES);
}
function daddslashes($string, $force = 0) {
if(!$GLOBALS['magic_quotes_gpc'] || $force) {
if(is_array($string)) {
foreach($string as $key => $val) {
$string[$key] = daddslashes($val, $force);
}
} else {
$string = addslashes($string);
}
}
return $string;
}
echo daddslashes('jafoakfok*&%^:"');
还有别人写的
function str_filter($str){
$str=htmlspecialchars($str);
if(!get_magic_quotes_gpc()){
$str=addslashes($str);
}
//过滤危险字符
return preg_replace("/[\"\'=]|(and)|(or)|(create)|(update)|(alter)|(delete)|(insert)|(count)|(%20)|(char)/i","",$str);
}
网上应该还蛮多的.
[解决办法]
mysql的不适用sqlite,sqlite的不适用mysql。
[解决办法]
$db = new PDO('mysql:dbname=test');$ar = array( 'aa', "b'b", 123);$ar = array_map(array($db, 'Quote'), $ar);echo join(',', $ar);
[解决办法]
mysql_real_escape_string和其它普通escape函数的不同点在于它是编码安全的,会根据你的cient编码
(用mysql_set_charset设定编码)来分析字串而不是全当ansi处理
PDO::Quote加引号是因为在prepare的时候一般写成:
WHERE calories < ? AND colour = ?
这样,字串由quote根据变量类型加上引号,而非字串不会加
[解决办法]
这问题贴讨论的有意思。
[解决办法]
据说在新的之前,set xxx. 记不清了,新版本有设定字符的方法,以前所有方案已不推荐。
mysql_real_escape_string是是编码安全的, 安全级别最高。比addslash之类的都高。 它是编码安全的。
或者可以这么理解,它可以根据编码来进行转义。
如果更高安全,每次调用数据库函数转义?
另外,对于加引号是否一定正确的问题,可能和sql模式有关。 我以前遇到过,对于整型字段,加引号出错。
[解决办法]
记住PDO是企图给数据库提供统一操作界面,
这个quote对其它数据库是很有需要的,
很多数据库都是不让给整型字段加上引号的, 而mysql没问题.
另外quote一般是和prepare同时用的,
prepare在其它数据库里很普遍, 而mysql用户却不太习惯
prepare的好处可以参考这里
http://www.go4expert.com/forums/showthread.php?t=8074