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。