这些步骤是否足以保护网站?

时间:2012-04-07 15:56:54

标签: php security

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

  • 要连接到我们的服务器,我通过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());
    

2 个答案:

答案 0 :(得分:2)

  1. 使用更强大的哈希函数(例如sha256
  2. 在对其进行哈希处理之前,将一个salt(每个用户的随机值)附加到密码
  3. 使用prepared statementsMySQLi)代替,以避免在将数据输入数据库之前忘记转义数据
  4. 在$ _SESSION中存储用户信息。相反,存储一个对外界没有任何意义的会话变量,每次有人登录时都会更改,以及指向用户帐户的链接。 - 这仅适用于cookie。 喝一些咖啡因
  5. 小心地将用户的数据放在属性值中(例如<span title="FULLNAME">),因为需要额外的转义(引号,空格,如果不使用引号等)
  6. 注意:此列表并非详尽无遗。它只列出了我注意到你提供的短片段的错误。

答案 1 :(得分:-1)

为了安全起见,您应该使用PDOmysqli_ functions并跳过旧学校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散列,但是它们有很多databases for "decoding"以及彩虹表攻击,所以它们不是很安全。这里我使用mysql的AES_ENCRYPT作为密码,并使用用户名作为演示目的的密钥,你可能想要生成自己的密钥并将其存储在某个地方,因为你可以AES_DECRYPT与那......你应该检查出更好的加密库,比如scrypt

无论你做什么,都不要使用addslashes() it's insecure

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