我在寫一個由PHP和MySQL支持的動態網站(要在WAMP服務器上運行)。我目前的擔心是關於網站的安全性,但它沒有任何用戶輸入被保存,然後輸出給任何用戶(除了管理員),所以我並不擔心XSS。我主要關注的是針對SQL注入攻擊和保護管理員登錄門戶免受彩虹表/暴力破壞。動態網站安全問題(PHP + MySQL)
1)使用mysql_real_escape_string與sprintf()一起保護您免受SQL注入嗎?例如
$thing = mysql_real_escape_string($_REQUEST['thing'])
$query = sprintf("SELECT * FROM table WHERE thing='%s'", $thing);
$result = mysql_query($query);
這是否足夠安全?當然,沒有系統是完全安全的,但我知道準備好的語句應該是防止SQL注入的最佳方法。但是,如果我的代碼「足夠安全」,那麼我認爲沒有理由進行更改。我在某處讀到,默認情況下,mysql_query只允許每次調用一個MySQL查詢以獲得安全原因,這是否正確?如果是這樣,我不明白我的代碼如何進行任何注入,但請讓我知道我的邏輯是否存在缺陷。
2)我正在爲該網站編寫管理門戶,以便它的所有者可以在網站上以簡單,用戶友好的方式操作MySQL數據庫(從未鏈接到的登錄HTML文件網站上的任何地方)。我對安全性的關注是登錄過程,它由兩個頁面組成。首先,收集用戶登錄信息:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml" lang="en">
<head>
<title>Admin Portal</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="robots" content="noindex, nofollow">
<link rel="stylesheet" type="text/css" href="http://www.anotherdomain.com/my.css">
<script type="text/javascript" src="http://www.anotherdomain.com/my.js"></script>
</head>
<form method="post" action="admin/login.php">
<table align="center">
<tr><th>Admin Login Form</th></tr>
<tr><td>Name</td><td><input type="text" name="Name" size="30" onKeyPress="return aJSFunctionToStopEnterKeyFromWorking(event)"></td></tr>
<tr><td>Password</td><td><input type="password" name="Password" size="30" onKeyPress="return aJSFunctionToStopEnterKeyFromWorking(event)"></td></tr>
<tr><td></td><td><input type="reset" value="Clear Form"> <input type="submit" value="Login"></td></tr>
</table>
</form>
其次,實際的登錄腳本:
<?php
$inputusername = $_POST['Name'];
$inputpassword = $_POST['Password'];
$username = "a username that is not obvious";
$password = "a password that is at least 10 characters long";
$salt = hash('sha512', "a messed up string with weird characters that I wrote");
$hashword = hash('sha512', $password . $salt);
$inputhashword = hash('sha512', $inputpassword . $salt);
if($username == $inputusername && $hashword == $inputhashword) {
session_start();
$_SESSION['valid'] = 1;
header('Location: portal.php');
exit;
}
else {echo "Invalid username or password";}
?>
然後登錄過程後,每個頁面都會有以下以確保管理員在登錄:
<?php
session_start();
if(!$_SESSION['valid']) {header('Location: ../admin.html');}
?>
Portal page goes here
由於沒有建立新的用戶,將有永遠只能是爲門戶網站一個用戶。我只是想知道這種登錄方法對彩虹桌和暴力強制等攻擊有多安全?我認爲,既然我把hashword和salt都設置得非常大,即使用戶名不知爲何,這些攻擊也應該是相當安全的。
我也想知道這是否安全從會話劫持,因爲這是一個術語,我聽說過,但我不知道太多......我知道我從來沒有扔過會話ID周圍或類似的東西,所以它看起來很安全。
3)我應該知道/考慮的任何其他安全問題?
我非常感謝任何幫助!
哦,沒關係。現在我明白你的意思了。沒關係。基本上你是說他認爲無法進行注入是錯誤的,因爲MySQL只允許每次調用一個查詢。我得到你... – ircmaxell 2011-04-13 15:45:21