register_globals,是php.ini文件里面的一個配置選項,接下來,我們可以通過例程來分析一下,當register_globals = on 與 register_globals = off 的時候,對php語言的一些安全影響。
測試源代碼如下:
index.html 源代碼:
<form method="post" action="index.php">
<table>
? <tr>
?<td>用戶名:</td>
??? <td><input name="username" type="text"></td>
? </tr>
? <tr>
??? <td>密 碼:</td>
?<td><input name="password" type="password"></td>
? </tr>
</table>
<input type="submit" name="submit" value="登錄" class="button">
</form>
index.php 源代碼:
<?php
? //包含配置文件
? require_once ('config.inc.php');
? //如果用戶已經登錄提交
? if($_POST['submit'])
? {
//用戶名
$username=ClearSpecialChars($_POST['username']);
//密碼,需要進行MD5或者sha1加密
$password=md5($_POST['password']);
//$password=sha1($_POST['password']);
//從數據庫中檢索用戶名,密碼是否匹配
$sql = "SELECT * FROM user WHERE username='$username' AND password='$password'";
$result = @mysql_query($sql);
$num_rows = @mysql_num_rows($result);
if($num_rows == 1)
{
//獲得用戶名
$row = mysql_fetch_assoc($result);
//將用戶名存入SESSION中
$_SESSION['username'] = $row['username'];
//跳轉到用戶權限頁面
header("Location: main.php");
}
else
{
ExitMessage("用戶名或者密碼錯誤!");
}
?}
?>
1-1:
當設置register_globals = off 的時候,index.php源代碼可以正常執行(注意:修改php.ini文件之后需要我們重新啟動Apache修改方能生效),如圖:
?
?
輸入正確的用戶名與密碼之后,執行效果如下:
?
?
1-2:
當設置register_globals = on 的時候,index.php源代碼修改成這樣子也可以正常執行(注意:修改php.ini文件之后需要我們重新啟動Apache修改方能生效),如圖:
修改后的php.ini文件如圖:
?
?
修改后的index.php源代碼,執行效果如圖:
?
?
修改之后的index.php源代碼如下:
<?php
? //包含配置文件
? require_once ('config.inc.php');
? //如果用戶已經登錄提交
? if($_POST['submit'])
? {
//用戶名
//$username=ClearSpecialChars($_POST['username']);
$username=ClearSpecialChars($username);
//密碼,需要進行MD5或者sha1加密
//$password=md5($_POST['password']);
$password=md5($password);
//$password=sha1($_POST['password']);
//從數據庫中檢索用戶名,密碼是否匹配
$sql = "SELECT * FROM user WHERE username='$username' AND password='$password'";
$result = @mysql_query($sql);
$num_rows = @mysql_num_rows($result);
if($num_rows == 1)
{
//獲得用戶名
$row = mysql_fetch_assoc($result);
//將用戶名存入SESSION中
$_SESSION['username'] = $row['username'];
//跳轉到用戶權限頁面
header("Location: main.php");
}
else
{
ExitMessage("用戶名或者密碼錯誤!");
}
?}
?>
總結:
有關于php版本與register_globals的歷史
php從>=4.20版本開始,php.ini中register_globals = Off了,php之前的版本register_globals = On 的。
php從>=4.20版本開始,使用register_globals = Off 的原因
當 register_globals = On,即register_globals 打開以后,各種變量都被注入代碼,例如來自 HTML 表單的請求變量。再加上 PHP 在使用變量之前是無需進行初始化的,這就使得更容易寫出不安全的代。但 PHP 社區還是決定默認關閉此選項。當打開時,人們使用變量時確實不知道變量是哪里來的,所以,php社區還是決定選擇register_globals = Off的情況,這樣,php語言寫出來的代碼會更安全些。