0

我即将推出我的网站,安全性很重要,所以我想概述一下我为保护网站所做的工作。如果我错了,如果我需要别的东西,请纠正我:

  • 为了连接到我们的服务器,我通过 VPN 启用了双因素身份验证。
  • 该网站使用 SSL
  • 数据是静态加密的。
  • 我有一个日志监控工具
  • 当用户将数据输入数据库时​​,我使用 mysql_real_escape_string(); 当我显示用户数据时,我使用 htmlspecialchars();
  • 密码使用 md5 加密存储。

         Sample insert query: 
    
         // I use these on every page
         $username = removeBadChars($_SESSION["username"]);
         $password = removeBadChars($_SESSION["password"]);
    
         //Sanitized data
         $_SESSION["username"] = $username;
         $_SESSION["password"] = $password;
    
         //Query to display 
         $sql = "select `User_name`, `User_id`, `User_kind` from `clientele` 
         where `username` =   '$username' AND `password`='$password'";
         $query = mysql_query($sql) or die ("Error: ".mysql_error());
    
          while ($row = mysql_fetch_array($query)){
    
      $name = htmlspecialchars($row['User_name']);
      $uid = htmlspecialchars($row['User_id']);
      $uis = htmlspecialchars($row['User_kind']);
    
          }
          mysql_free_result($query);
    
    
    
          //Insert Query
    
          $title = mysql_real_escape_string($_POST['title']);
          $comment = mysql_real_escape_string($_POST['comment']);
    
          $insert = "INSERT INTO table (Title, Comment)
          VALUES ('".$title."', '".$comment."')";
    
           $query = mysql_query($insert) or die ("Error: ".mysql_error());
    
4

2 回答 2

2
  1. 使用更强的哈希函数(例如sha256
  2. 在对密码进行散列之前将盐(每个用户的随机值)附加到密码
  3. 请改用准备好的语句( MySQLi),以避免在将数据输入数据库之前忘记转义数据的可能性
  4. 不要用户信息存储在 $_SESSION 中。相反,存储一个对外界毫无意义的会话变量,每次有人登录时都会更改,并链接到用户帐户。- 这仅适用于 cookie。喝一些咖啡因
  5. 小心将来自用户的数据放入属性值(例如<span title="FULLNAME">)中,因为需要额外的转义(引号、空格,如果不使用引号等)

注意:此列表并不详尽。它只列出了我注意到您提供的简短片段有问题的事情。

于 2012-04-07T16:12:41.530 回答
-1

为了安全起见,您可能应该使用PDOmysqli_函数并跳过那个老式的mysql_垃圾,它不再被开发。以下是如何使用 PDO:

$pdo = new PDO('mysql:host=localhost;dbname=whatever', $username, $password);
$statement = $pdo->prepare('select `User_name`, `User_id`, `User_kind` from `users` 
 where `username` = :user AND `password`= AES_ENCRYPT(:pass,:user)');
$statement->bindParam(':user', $_GET['user']);
$statement->bindParam(':pass', $_GET['pass']);
$results = $statement->execute();
var_dump($results->fetchAll());

参数更安全,因为当您bindParam自动验证时。其他人提到使用md5散列,但是有很多数据库可以“解码”它们以及彩虹表攻击,所以它们不是很安全。在这里,我使用 mysqlAES_ENCRYPT作为密码,并使用用户名作为密钥用于演示目的,您可能希望生成自己的密钥并将其存储在某个地方,因为您可以AES_DECRYPT使用它......有一些库可以更好地加密您应该检查一下,例如scrypt

无论你做什么,不要使用addslashes()它是不安全的

最重要的是,您应该考虑以其他方式保护服务器的操作系统和 Apache,例如不宣传版本号和以自己的用户身份运行 apache 等。查看Open Web Security Project 网站以获取大量安全信息。

于 2012-04-07T16:17:47.703 回答