^-^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。
------解決方案--------------------
探討
我查了一下php.net,有如下函數,基本上都是針對 每一個資料庫的。我的問題:有沒有一個通用的mysql_real_escape_string,這個樣子的呢?
還有一個問題是:mysql_real_escape_string能完全防止SQL注入嗎?
------解決方案--------------------
親 PDO::Quote 就是加引號而已...哈哈哈 不是額外贈送.
------解決方案--------------------
PDO::Quote
mysql_real_escape_string
都是對特殊字元進行轉義
不同的是:後者只針對 mysql,前者可用於所有的資料庫
注意不同的資料庫對於特殊字元和轉義後的結果是不同的
至於 PDO::Quote 會奉送一對單引號,是有他的考慮的
這個函數會在動態綁定時被內部調用。而被預先處理的 SQL 運算式中的參數是不需要用單引號括起的。但傳遞給資料庫的 SQL 指令卻是要有的
------解決方案--------------------
也不竟然
PHP code
$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之類的都高。 它是編碼安全的。