0

基本的な ajax リクエストといくつかのフィードバックを使用するログイン システムを作成しましたが、うまく機能しています (コードは下部にあります)。

私が入力しようとしているパスワードのハッシュ化とソルト化は別として(だから、それに夢中にならないでください)、これらの要求を処理するために Ajax/jQuery を使用することのセキュリティへの影響は何ですか: 最も重要なこと:

  1. これが純粋な PHP ではなく JS 依存であることに関して、一般的な見方は何ですか? 人々は冗長性を入れていますか? これは JS のみのサイトであると単純に言うのは正当ですか? 、そのため、JSに依存しています)。

  2. 私の PHP と JS は正しい方法で接続していますか? (そして、私のクッキーはまだ機能しますか?)

  3. ログインに成功したときに jQuery .load() を使用してコンテンツを取り込む安全な方法を作成するにはどうすればよいですか?

  4. システムを安全にするための一般的なアドバイスはありますか?

     $(function login() {
    
     $("form .button").click(function () {
    
     // getting form values and assigning variable names
     var username = $("form #username").val();
     var password = $("form #password").val();
     var remember = $("form #remember").val();
    
     // concatenating variables to form the data used by the Ajax post method
     var dataString = 'username=' + username + '&password=' + password + '&remember=' + remember;
    
     // begin Ajax post function
     $.ajax({
         type: "POST",
         url: "controls/login/process.php",
         data: dataString,
         success: function (response) {
             if (response == 'success') {
                 alert("SUCCESS");
             } else {
                 $('.alert').find('span').text('Incorrect username or password');
                 $('.alert').addClass('alert-error').fadeIn('fast');
             }
         },
         error: function () {
             $('.alert').find('span').text('An error occured, try again');
             $('.alert').addClass('alert-error').fadeIn('fast');
    
         }
     });
    
     return false;
    
     });
     });
    

これは

<?php
session_start();
// Starting the session
require '../../tools/db/connect.php';
// Including the database connection file
session_set_cookie_params(2*7*24*60*60);
// Making the cookie live for 2 weeks

if($_SESSION['reference'] && !isset($_COOKIE['unifyLogin']) && !$_SESSION['remember']){
    // If you are logged in, but you don't have the cookie and you have not checked the remember checkbox (a browser restart), destroy the session 
    $_SESSION = array();
    session_destroy();
    echo "expired";
}

$_POST['username'] = mysql_real_escape_string($_POST['username']);
$_POST['password'] = mysql_real_escape_string($_POST['password']);
$_POST['remember'] = (int)$_POST['remember'];
// Escaping all input data
$row = mysql_fetch_assoc(mysql_query("SELECT ID,REFERENCE FROM USER WHERE USERNAME='{$_POST['username']}' AND PASSWORD='{$_POST['password']}'"));

if($row['REFERENCE']) {
$_SESSION['secure'] =  false;
// If everything is OK login
$_SESSION['id'] = $row['ID'];
$_SESSION['reference'] = $row['REFERENCE'];
$_SESSION['remember'] = $_POST['remember'];
// Store some data in the session
setcookie('unifyLogin',$_POST['remember']);
// We create the cookie
echo "success";
} else {
echo "failure";
}

?>
4

5 に答える 5

2

Web サイトのセキュリティを確保する最善の方法は、SHA-512 でパスワードを暗号化することです。

$rounds = 5000
$cryptedPwd = crypt($password, '$6$rounds=' . $rounds . '$SOMeSILLySTrInG$');

復号化するには:

$pwdEntered = trim($_POST['password']);
if (crypt($pwdEntered, $pwdHashed) == $pwdHashed){
// do something
}

おそらくログファイルを使用して、ブルートフォース保護を追加することもできます...

通常の mysql connect の代わりに PDO を使用することをお勧めします。

于 2013-01-03T13:47:15.827 に答える
1

これが純粋な PHP ではなく JS 依存であることに関して、一般的な見方は何ですか? 人々は冗長性を入れていますか? これは JS のみのサイトであると単純に言うのは正当ですか? 、そのため、JSに依存しています)。

私の PHP と JS は正しい方法で接続していますか? (そして、私のクッキーはまだ機能しますか?)

今日、JavaScript を無効にしてインターネットを使用している人が何人いるかはわかりませんが、JavaScript が目障りであってはならず、Web サイトは JavaScript が無効になっていても機能するはずです。それほど難しいことではありません。.click()AJAX クエリに を使用する代わりに、 を使用.submit()してフォームにバインドする必要があります。そうすれば、PHP のみでフォームを処理することができます。

また、これは.click()、送信ボタンにイベントをバインドしすぎないベスト プラクティスの 1 つです。そうしないと、Enter キーを押してフォームを送信できません。

次に、PHP で$_SERVER['X-Requested-With'].

そして、次の 2 つの異なる動作を行うことができます。

if ( isset( $_SERVER['X-Requested-With'] ) ) {
    // comes from jQuery
} else {
    // basic submit
}

それが大まかにあなたのアプリをインターフェースする方法だと思います。

ログインに成功したときに jQuery .load() を使用してコンテンツを取り込む安全な方法を作成するにはどうすればよいですか?

PHP から true または false を返すことができます。または、一部のデータを再表示する必要がある場合は、json オブジェクトを渡すことができます。返したいデータの配列があるとしましょう

PHP

if ( isset( $_SERVER['X-Requested-With'] ) ) {
    $data = array('success' => true , 'username' => $username );
    return json_encode( $data );
}

システムを安全にするための一般的なアドバイスはありますか?

POST (AJAX 経由) でデータを送信します。これは、通常の方法でデータを POST するよりも安全です。

于 2013-01-03T14:08:14.170 に答える
1

質問 #3 に答えるには: 「従来の」PHP サイトの場合と同様に、HTML に挿入するときに、信頼できないデータをエスケープしてサニタイズします。サーバーがエスケープされていないテキストを返す場合は、jQuery の.text()メソッドを使用してテキストを要素に挿入します。テキストを HTML として挿入しないでください(例: $(...))。

質問 1 の答えはすでに明らかだと思います。ごく一部のユーザー (検索エンジンを含む) が、プライバシーまたはセキュリティ上の理由から、JavaScript を実行できないか、実行しないことを選択しています。彼らへのサービスを拒否したくないかもしれません。

質問 2 と 4 に関する私のコメントは次のとおりです。


var dataString = 'username=' + username + '&password=' + password + '&remember=' + remember;

jQueryはこれを行うことができます(不足しているクエリ文字列のエスケープを含む)。オブジェクトに格納するだけで、文字列の代わりに jQuery に渡すことができます。

var dataObject = {
    username: username,
    password: password,
    remember: remember
};

AJAX 応答を JSON として返し、非推奨の jQuery 機能を回避するという jerome.s の提案にも注意してください。JSON 応答の場合、最も外側のオブジェクトが配列ではなくオブジェクトであることを確認してください。


$_POST['username'] = mysql_real_escape_string($_POST['username']);
$_POST['password'] = mysql_real_escape_string($_POST['password']);
$_POST['remember'] = (int)$_POST['remember'];
// Escaping all input data
$row = mysql_fetch_assoc(mysql_query("SELECT ID,REFERENCE FROM USER WHERE USERNAME='{$_POST['username']}' AND PASSWORD='{$_POST['password']}'"));

PHP MySQL 拡張機能は、PHP 5.5で非推奨になりました。MySQLi 拡張機能または PDO のいずれかを使用していたでしょう。どちらも準備済みステートメントを提供するため、パラメーター値を手動で SQL エスケープすることを回避できます。

ユーザーごとの saltを実装するには、このクエリを変更する必要があります。具体的には、ハッシュされたパスワードと対応するソルトを取得し、入力したパスワードをそのソルトでハッシュする必要があります。パスワードが正しい場合、計算されたハッシュは、データベースに格納されているハッシュと一致する必要があります。


if($row['REFERENCE']) {
$_SESSION['secure'] =  false;
// If everything is OK login
$_SESSION['id'] = $row['ID'];
$_SESSION['reference'] = $row['REFERENCE'];
$_SESSION['remember'] = $_POST['remember'];
// Store some data in the session
setcookie('unifyLogin',$_POST['remember']);
// We create the cookie
echo "success";

PHP は、任意のセッション ID 値を受け入れるという点でかなり寛大なセッション処理モデルを使用し、コードはログインの成功時にセッション ID を再生成しません。そのため、サイトはセッション固定攻撃に対して脆弱である可能性があります。

また、「ログインCSRF」またはクリックジャッキングに対する保護も見られませ

Jeffrey のコメントにも注意してくださいif($row['REFERENCE']) {。「データベースで一致が見つからない場合、この行はエラーを生成します」。

編集:ログイン試行の失敗に対するレート制限も実装する必要があります(自動パスワード推測を遅くするため)。

于 2013-01-03T15:35:33.327 に答える
1

私が見つけた最良のパスワード セキュリティ メソッドは、もちろんログインに php を使用する場合の php の内部メソッドです。

http://php.net/manual/en/function.password-hash.php

password_hash("rasmuslerdorf", PASSWORD_DEFAULT);

password_verify('rasmuslerdorf', $hash);

データベースにソルトを保存し、すべてのラウンドチェックを行います。

暗号化とセキュリティについて何時間も読んだ後、この方法を見つけるのに長い時間がかかりました。信頼性が高いだけでなく、非常に簡単に使用できます.

郵送で情報を送信してから、これを使用することをお勧めします。また、往復で、往復がない場合、誰かがJavaScriptハッシュを飛び越えて、純粋なハッシュを使用してログインすることができます。このようにして、彼らがハッシュを使用しようとすると、それを再ハッシュし、それが何であるかである間違った pw として返します。

于 2015-03-06T14:24:17.867 に答える
0

通常のブラウジングではなく、サーバーと対話するための別の方法として JS を使用しています。そのため、リクエストした他のページよりも安全性が劣ることはありません。

ログイン認証情報を PHP ページに投稿してログインを確認する場合は、通常のリクエスト (おそらくセッション) と同じように情報を保存します。AJAX を使用してサーバーからデータを要求するたびに、データを返送する前にサーバー側でセッションを再度確認してください。許可されていない場合は、単純にエラーを返します。JS では、応答を確認し、それに基づいてアクションを実行できるようになりました。

セキュリティを確保するための私のアドバイスは、すべてのページを通常のブラウザーから要求されたかのように開発することです。それができれば、AJAX を使用する場合にも安全です。

セキュリティ以外のアドバイスとして。一部の訪問者 (古い携帯電話、タブレット、または単に js が無効になっているブラウザー) を犠牲にするつもりがない限り、javascript のみのサイトを作成しないでください。

于 2013-01-03T13:47:28.483 に答える