0

私は私の大学のためのプロジェクトを開発しています。

このプロジェクトは私の大学によって承認されており、来週までに 5000 人以上の学生に公開される予定です。プロジェクトは正常に機能していますが、学生が実行できるハッキングや侵入が心配です。

このプロジェクトは、大学の管理者がニュースを投稿し、学生が電子メールの確認後にそれを見ることができる、通知発行ポータルおよびスキル促進プロジェクトです。学生は自分の成果をアップロードして大学と共有したり、アプリや Web サービスなどの創造的な作品を共有したりできます。また、グループを作るのに役立つプロフィールが記入されている他の学生のスキルを参照することもできます。

以下の有価証券を申請しました。

  • if(isset($_SESSION['name']) && isset($_SESSION['email']) && isset($_SESSION['pass'])) ログインしていないユーザーを防ぐために、すべてのページで使用しました。

  • mysql_real_escape_string($pass);// 特殊文字のエスケープ用。

  • パスワードは、salt メソッド () を使用して暗号化されますCrypt();

  • サインアップ中の検証とファイルのアップロード制限。

上記のセキュリティを検索して適用しましたが、このタイプのプロジェクトで他に何が必要かを知りたいです。

4

4 に答える 4

3

いくつかの小さな改善を行うことができます:

1) ログイン後にユーザー ID を入力するセッションを 1 つだけ保存する必要があります。

2) もう mysql を使用しないでください。パラメータ化されたクエリを使用してSQLインジェクションを防ぐことができるドライバであるPDOを使用してください。

3) パスワードを安全に保存するには、bcrypt を使用します。使用方法に関する適切な回答は次のとおりです。リンク

于 2013-05-18T09:04:54.810 に答える
2

セッションにパスワード (またはハッシュ化されたパスワード) を保存する正当な理由はありません。パスワードは秘密です。他人の秘密の取り扱いには細心の注意を払う必要があります。

ユーザーがログインしていることを判断するには、一意の名前 (または電子メール) を保存するだけで十分です。

私が見つけた他のいくつかの問題:

  • トップログインフォームのパスワード欄が「パスワード」タイプではありません。ショルダーサーフィンが可能。
  • mysql_real_escape_string()パスワードをハッシュ化した場合は使用する必要はありません。パスワードを受け取った後、最初に行うことはパスワードのハッシュ化です。
  • アカウント ページで、セキュリティ アンサーに「パスワード」タイプのフィールドを使用しましたが、フィールドには値が事前に入力されています。これは HTML ソースで入手できます。あなたのものです12345
  • でまだdisplay_errorstrue に設定していますphp.ini
  • SSLなし。すべてのパスワードは、大学のネットワーク全体で暗号化されずに送信されます。
  • あなたの質問は言及していませんbcryptが、そうすべきです。BCrypt は適切なパスワード ハッシュ アルゴリズムです。(PHP はこれを CRYPT_BLOWFISH と呼びます)。
  • の使用は、mysql_real_escape_string()準備済みステートメントとバインディング パラメーターを使用していないことを示します。そうすることで、SQL インジェクションが不可能になります。mysqliまたは PDOに切り替えます。

私はあなたのサービスに対して異常な POST リクエストを試みませんでしたが、HTML で編集が無効になっているフィールドがたくさんあることに気付きました。これは実際には何も防ぎません。そのフォームを別の学生 ID で提出できます。受信側の PHP はそのケースを処理しますか?

于 2013-05-18T09:05:10.120 に答える
2

めちゃくちゃにする最も簡単な方法は、SQL インジェクション (データベースを使用していると仮定) によるものです。SQL インジェクションを介して Web ページにコードを挿入し、マルウェアを配信しようとするボットさえ存在します。

ユーザー入力パラメーターがある限り、すべての SQL ステートメント (INSERT / SELECT / UPDATE / DELETE に関係なく) を保護します。文字列の場合は、すでに適切に処理しています (ただし、文字セットの注意事項についてはhttp://php.net/manual/en/function.mysql-real-escape-string.phpを参照してください)。整数の場合は、(int)input を使用します。

そして、データベースを頻繁にバックアップしていることを確認してください。

また、ユーザー入力を表示する方法について考えてみてください。人々は HTML コードを<scripts>で送信し、htmlspecialchars() でフラット化することをお勧めします。

于 2013-05-18T09:19:34.577 に答える
1

暗号化と説明の URL パラメータにこれを試してください

$salt ='The key you can use anything';

暗号化:

function simple_encrypt($text)
{
    return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $salt, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))));
}

説明:

function simple_decrypt($text)
{
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $salt, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)));
}

ここで $text は、URL を介して渡したいパラメーターです。

それがあなたに役立つことを願っています

于 2013-05-18T09:00:35.993 に答える