2011-09-18 40 views
1

我一直在最近构建一个登录脚本,我需要一些关于安全性的建议。谢谢。关于此脚本的安全性

<?php 
session_start(); 

include 'inc/conn.php'; 
include 'inc/config.php'; 
include 'inc/session.php'; //Prevent session hijack 

if (isset($_SESSION['banned'])) { 
    header("Location: banned.php"); 
    exit; 
} 

if (isset($_POST['submit'])) { 

    if (isset($_SESSION['token']) 
     && $_POST['token'] == $_SESSION['token']) { 

     $_POST['username'] = mysql_real_escape_string($_POST['username']);  
     $_POST['password'] = sha1($salt1 . $_POST['password'] . $salt2); 

     $user_query = "SELECT id, userlevel FROM users WHERE username = '" . $_POST['username'] . "' AND password = '" . $_POST['password'] . "'"; 
     $user_result = mysql_query($user_query); 

     if (mysql_num_rows($user_result) == 0) { 
      $error = 'Fel användarnamn eller lösenord'; 
     } else { 

      $row = mysql_fetch_assoc($user_result); 

      $banned_query = "SELECT * FROM bans WHERE user_id = " . $row['id'] . ""; 
      $banned_result = mysql_query($banned_query); 

      session_regenerate_id(); 

      if (mysql_num_rows($banned_result) == 0) { 

       $_SESSION['logged_in'] = TRUE; 
       $_SESSION['user_id'] = $row['id']; 
       $_SESSION['userlevel'] = $row['userlevel']; 

       header("Location: index.php"); 
       exit; 

      } else { 

       $ban_row = mysql_fetch_assoc($banned_result); 

       $_SESSION['banned'] = TRUE; 
       $_SESSION['user_id'] = $ban_row['user_id']; 

       header("Location: banned.php"); 
       exit; 

      } 
     } 
    } 

} 

$token = md5(uniqid(rand(), true)); 
$_SESSION['token'] = $token; 

?> 
<?php 
if (!isset($_SESSION['logged_in'])) { 
?> 
<?php if (isset($error)) echo $error ?> 
<form method="post" action="index.php"> 
<input type="hidden" name="token" value="<?php echo $token; ?>" /> 
Användarnamn<br /> 
<input type="text" name="username" value="" /><br /> 
Lösenord<br /> 
<input type="password" name="password" value="" /><br /> 
<input type="submit" name="submit" value="Logga in" /> 
</form> 
<?php } else { echo var_dump($_SESSION); } ?> 

config.php和conn只是两个文件,一个是数据库连接,另一个是两个静态变量。

session.php文件

<?php 
$string = $_SERVER['HTTP_USER_AGENT']; 
$string .= 'SHIFLETT'; 

$fingerprint = md5($string); 

if (isset($_SESSION['HTTP_USER_AGENT']) && 
    $_SESSION['HTTP_USER_AGENT'] != $fingerprint) { 
    session_unset(); 
    session_destroy(); 
    header("Location: index.php"); 
    exit; 
    exit; 
} else { 
    $_SESSION['HTTP_USER_AGENT'] = $fingerprint; 
} 
?> 

有什么建议?

+0

其中$ salt1和$ salt2定义? –

+0

在config.php文件中 – John123

+1

对于所有用户而言,每个用户帐户的盐需求不同。所以这是一个失败。 SHA1也被破坏,而不是使用sha2。最后,它们不需要两次赋值。一开始就有盐!是你所需要的全部。 – Johan

回答

0

看起来不错的兄弟,我会做

if(isset($_POST['submit'])&&$_POST['submit']=='submit') 
3

考虑使用mysqli_xxx功能,而不是mysql_xxx功能。

请参阅PHP手册overview of the mysqli extension以及它与旧版mysql扩展的区别。

使用mysqli函数将允许您使用诸如预准备语句之类的功能,这使编写安全代码变得更容易。

作为一个基本级别,它是一个相当平凡的一组更改,以转移到mysqli库。开始使用准备好的语句等的更改可能稍微有点多,但是非常值得。

仍然使用旧的mysql函数的唯一原因是,如果你被困在古老的MySQL版本中。但是,如果是这样的话,你可能还有很多其他安全问题需要担心。

希望有所帮助。

3

从您迄今提供的信息来判断,您的脚本似乎受到SQL注入保护。就是这样。

您的“会话劫持预防”仅仅是为了减少概率,但并未阻止它。由于会话劫持攻击通常使用技术来获取受害者的会话ID,该ID还可以揭示受害者的用户代理ID(例如XSS或检查HTTP引用者)。

说实话,防止会话劫持是非常困难的。但有些尝试像SessionSafe: Implementing XSS Immune Session Handling中描述的那样。

+0

我使用HTMLPurifier作为XSS保护。我已经在我的php.ini配置文件中设置了,像你不能index.php?sessid = 123。严重的是,我确实是paronoid,因为我想保持我的应用程序安全。 – 2011-09-19 15:56:52