magic_quotes_gpc
開關,當此開關 on 時,$_GET
、$_POST
、$_COOKIE
等從 user 端來的資料,如果含有單引號、雙引號、反斜線等內容,會自動被加上倒反斜線跳脫該字元,也就是做 addslashes() 的處理,以免程式設計師直接把資料串在 SQL 指令上,導致系統沒兩天就被駭客爆台。不過 php 5.4 以上版本,不支援此開關。
get_magic_quotes_gpc
函數判斷 magic_quotes_gpc
是否開啟,如果沒有開啟,則將輸入字串中指定的字符加入倒斜線,也就是跳脫其作用。
本練習系統 PHP 版本為 5.4.xx,故以下範例 get_magic_quotes_gpc
函數判斷永遠為關閉,會執行 addslashes 函數。
[root@kvm8 ~]# cd /var/www/html [root@kvm8 html]# vim escape.php [root@kvm8 html]# cat escape.php <?php $dbhost = 'localhost:3306'; $dbuser = 'root'; $dbpass = '123qwe'; $conn = mysql_connect($dbhost, $dbuser, $dbpass) or die(mysql_error().PHP_EOL); //if(! get_magic_quotes_gpc() ) { $user = addslashes ($_GET['user']); //} else { $user = $_GET['user']; //} $sql = "SELECT host,user FROM user WHERE user='{$user}'"; mysql_select_db('mysql'); $retval = mysql_query( $sql ); while($row = mysql_fetch_array($retval, MYSQL_NUM)) { echo "HOST: {$row[0]}<br>User: {$row[1]}<br>". "--------------------------------<br>"; } ?>
?user='a' or 1
,如果可以 SQL Injection,應該會回傳所有 user,但卻回應空白,也就是沒有 |user='a' or 1| 這個用戶。
?user=dywang
,查詢結果列出 host 及 user。