0

私は自分のウェブサイトを立ち上げようとしていますが、セキュリティは重要です。そのため、サイトを保護するために行ったことの概要を説明したいと思います. 私が間違っている場合や、他に何か必要な場合は修正してください。

  • サーバーに接続するために、VPN 経由で 2 要素認証を有効にしています。
  • サイトは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

安全のために、おそらくPDOまたはmysqli_関数を使用し、その古い学校のジャンクをスキップする必要があり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のデータベースとレインボーテーブル攻撃のためのデータベースがたくさんあるため、あまり安全ではありません. ここでは、パスワードに mysql を使用しています。デモンストレーションの目的でユーザー名をキーとして使用しています。おそらく、独自のキーを生成してどこかに保存することをお勧めします。scryptのようにチェックアウトする必要があります。AES_ENCRYPTAES_DECRYPT

何をするにしても、addslashes()安全ではないので使用しないでください

その上で、サーバーの OS と Apache を他の方法で保護することを検討する必要があります。たとえば、バージョン番号をアドバタイズしないようにしたり、独自のユーザーとして apache を実行したりするなどです。多数のセキュリティ情報については、Open Web Security Project の Web サイトを確認してください。

于 2012-04-07T16:17:47.703 に答える