我想知道如何让这段代码更安全,我将它用作login.php:
if(isset($_POST["username"]) and isset($_POST["password"])) {
if($_POST["username"] == $adminusr && $_POST["password"] == $adminpass){
我想让它更安全地防止sql注入等。你有什么想法 ?我想了解更多有关制作更安全网站的信息。
谢谢老兄和老兄
编辑:
抱歉,我没有发布所需的所有代码,但这里是完整的代码:
<?php
session_start();
include_once("../include/config.php");
if(isset($_POST["username"]) and isset($_POST["password"])) {
if($_POST["username"] == $adminusr && $_POST["password"] == $adminpass){
$_SESSION['admin_user'] = $adminusr;
$_SESSION['admin_password'] = $adminpass;
}
else {
echo "Wrong Username or Password";
}
}else if(isset($_GET['act']) && $_GET['act']=='out') {
unset($_SESSION['admin_user']);
unset($_SESSION['admin_password']);
session_destroy ();
}
if($_SESSION['admin_user'] == $adminusr && $_SESSION['admin_password'] == $adminpass){
$_SESSION['testdd'] = 'test';
header("location:index.php");
exit;
}
?>
再次感谢你:)
答案 0 :(得分:2)
如果 在查询中使用$_POST['username']
,则以下代码可以让您免于SQL注入。
$username = mysql_real_escape_string($_POST["username"]);
$password = mysql_real_escape_string($_POST["password"]);
$query = "SELECT * FROM users
WHERE users.username = '$username'
AND users.Passhash = SHA2(CONCAT(users.id,'$password'),512) ";
$result = mysql_query($query);
....
请注意,您需要将mysql_real_escape_string()
与mysql_query
一起使用
和mysqli_real_escape_string()
与mysqli_query
。
更好的是将PDO与php5一起使用,请参阅:http://www.php.net/manual/en/book.pdo.php
在MySQL中处理密码
请注意,强烈建议不要在数据库中以明文形式存储密码
始终在数据库中存储哈希值(最好使用SHA2)并使用盐
见:https://stackoverflow.com/search?q=hash+salt+mysql
有关这方面的更多信息。
答案 1 :(得分:1)
您应该使用mysqli_real_escape_string
来转义特殊字符(假设您正在查询数据库)。例如。 $password = mysqli_real_escape_string($link, $_POST['password']);
。否则,似乎很好。
答案 2 :(得分:1)
您的代码未显示您实际使用数据库的内容。
如果使用常规的mysql_query,则需要对不需要的字符,引号(“,”)进行编码。
您还需要记住,人们可能希望在密码中使用这些字符,因此您需要将它们存储在以某种方式编码的数据库中。
可能是MD5哈希,或者只是常规实体编码(见下文)。
htmlentities($pass,ENT_QUOTES,'UTF-8')
(!get_magic_quotes_gpc()) ? mysql_real_escape_string($item):$item;
您仍然应该使用变量绑定,这有助于避免任何SQL注入。
答案 3 :(得分:1)
我认为你的代码应该是这样的:
if(isset($_POST["username"]) and isset($_POST["password"])) {
$handle = mysql_connect($host, $user, $pass);
mtsql_select_db($db, $handle);
$query = "SELECT user FROM table_users WHERE user='{$_POST["username"]}' AND password=MD5('{$_POST["password"]}')";
$result = mysql_query($query, $handle);
if(mysql_num_rows($result) == 1)
{
这里你需要的是使用mysql_real_escape_string()或PDO prepared statement来逃避特殊的charcarter,所以我们改变了这个:
$input["user"] = mysql_real_escape_string($_POST["username"]);
$input["password"] = mysql_real_escape_string($_POST["password"]);
$query = "SELECT user FROM table_users WHERE user='{$input["user"]}' AND password=MD5('{$input["password"]}')";
.
.
.
你也可以使用addslashes()函数,但它可能是sufficient enough,我引自this:
addslashes会为字符添加斜杠 这通常是令人不安的。 mysql_real_escape_string转义 无论MySQL需要被转义。 这可能是或多或少的字符 比什么addlashes更能照顾。