web-dev-qa-db-ja.com

AJAX呼び出しは通常のPOSTメソッドよりも安全ではありませんか?

現在、次のような標準のログインフォームがあります。

<?php
if( isset( $_POST['username], $_POST['password'] ) ) {
    // escape both strings and compare them to database
}

?>
<form action="" method="post">
    <input type='text' value='username' name='username'></input>
    <input type='password' value='password' name='password'></input>
    <input type='submit' value='submit'></input>
</form>

AJAXに移動したいので、新しいページが更新されません。これは私の新しい方法です:

<script>
function login_ajax() {
     var formdata = new FormData();
     var ajax = new XMLHttpRequest();
     formdata.append('username', document.getElementById('username').value;
     formdata.append('password', document.getElementById('password').value;
     ajax.open( "POST", "https://my-website.com/login_validation.php" );
     ajax.onreadystatechange = function() {
         if(ajax.readyState == 4 && ajax.status == 200) {
             // do something
         }
    }
    ajax.send( formdata );
}

</script>
?>
<form action="" method="post" onsubmit='login_ajax(); return false;'>
    <input type='text' value='username' id='username'></input>
    <input type='password' value='password' id='password'></input>
    <input type='submit' value='submit'></input>
</form>

と私 login_validation.phpは次のようになります。

<?php
if( isset ( $_POST['username'], $_POST['password'] ) ) {
    // escape strings compare to database and sign on

}

2番目の方法は最初の方法よりも安全性が低いですか?

5
Tim von Känel

どちらも同等に安全です。どのバージョンでも間違いはありますが、本質的に他のバージョンより優れているものはありません。

ログインのセキュリティに関連するのはサーバー側です。このような制限は簡単にバイパスされる可能性があるため、クライアントにセキュリティ制限を設定することはできません。したがって、ここで重要なのは、検証を行うサーバー側のコードです。ここでも両方のオプションで同じです。これは、POSTリクエストであることを確認し、ユーザー名とパスワードが正しいかどうかを確認します。

7
Anders

アンダースが言ったように、それは本当に重要ではありません-それはAJAXまたは非AJAXです。主なセキュリティ原則は、コードを保護する方法に依存しています。OWASPテストガイドは、見てください。

ログイン機能に関連する2つのセクションを見つけてください。

https://www.owasp.org/index.php/Testing_Identity_Management

https://www.owasp.org/index.php/Testing_for_authentication

3
yehg.net