2016-04-22 3 views
0

私は新しいメールフォームを書いています。私はここにいくつかの良い人々によって提案されたものを実装していますので、後者で成功したかどうかはわかりませんが、私は古いMySQL APIに悩まされていると考えています。私は理由を説明しなければならないように感じる。これは、サイト全体がmysqlを使用しており、少なくとも今のところはPDOに切り替える時間がないからです。安全なログインフォーム、または少なくとも私はそうだと思います

私は!preg_matchでパスワードを実行しませんでしたが、その入力が何らかの攻撃に対して脆弱なのかどうかはわかりません。私は!password_verifyを使用するときに座ってリラックスできるという感覚を得ました。

ログインフォームは、サインインしてニックネーム、メールアドレスとパスワードを使用しています

ここに私のコードです:。

if (@$_POST['login']) { 
    $nickname = mysql_real_escape_string($_POST['nickname']); 
    $email = $_POST['email']; 
    $password_input = $_POST['password']; 
// validation 1 ------- // 
    else if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) { 
    $error = "Wrong nickname password or email."; 
    } 
    else if (!preg_match("/^[a-zA-Z0-9]{3,30}$/",$_POST['nickname'])) { 
    $error = "Wrong nickname password or email."; 
    } 
// validation 2 ------- // 
     else { //password check 
     $password_query = mysql_query ("SELECT password FROM userbase WHERE email='$email' && nickname='$nickname'"); 
     $password_actual = mysql_result ($password_query, 0); 
     if (!password_verify($password_input, $password_actual)) { 
     $error = "Wrong nickname, password or email."; 
     } 
      else { 
      LOGIN SUCCESSFUL 

は、それがmysql_real_escape_stringでエスケープされます場合に必要$_POST['nickname']ため!preg_matchですか? (セキュリティバイス)

+1

いいえ、必要ありません。 –

+1

あなたのコードは、mysql_real_escape_stringでも、SQLインジェクションに対して非常に脆弱です。 PDOを使用することをお勧めします。 –

+1

@CodeseeはOPの投稿のいくつかを読んでいます。彼は現時点でMySQL APIを変更する立場にはありません。 –

答えて

1

MYSQL関数とMYSQLI関数は、mysql_real_escape_stringを含むSQLインジェクションに対して非常に脆弱です。

How can I prevent SQL-injection in PHP?

私は、任意のパラメータとは別に、データベースサーバに送られて解析されるSQLステートメントである、PDOにmysqliのからあなたのコードを変換しました。

$con = new PDO('mysql:host=localhost;dbname=name', 'user', 'pass'); 

if ($_POST['login']) { 
$nickname = $_POST['nickname']; 
$email = $_POST['email']; 
$password_input = $_POST['password']; 
else if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) { 
$error = "Wrong nickname password or email."; 
} 
else if (!preg_match("/^[a-zA-Z0-9]{3,30}$/",$_POST['nickname'])) { 
$error = "Wrong nickname password or email."; 
}else{ 
$password_query = $stmt = $con->prepare("SELECT password FROM userbase WHERE email=:email && nickname=:nickname"); 
$stmt->bindParam(':email', $email); 
$stmt->bindParam(':nickname', $nickname); 
$stmt->execute(); 
if($password_query->rowCount() > 0) { 
$row = $stmt->fetch(); 
if(!password_verify($password_input, $row['password'])) { 
$error = "Wrong nickname, password or email."; 
}else{ 
//LOGIN SUCCESSFUL 
} 
+0

ウェブサイトの残りの部分が古いmysqlを使用していてもこれを使用できますか? –

+1

おそらくそうではありません。それらを混ぜることはお勧めしません。しばらく時間をかけてPDOについて読んでコードを更新することをお勧めします。 http://php.net/manual/en/book.pdo.php –

+0

残念ながら、私は今すぐ切り替えることはできません(確かに今年終わりまでにやっています)。 mysqlがSQLインジェクションに対して無防備な場合、SQLインジェクション攻撃を止めている古いmysqlを使用しているすべてのウェブサイトをどうやってやっているのかちょっと混乱していますか? SQLインジェクションを制限するには少なくとも何らかの方法が必要です。私は弾丸防御の防御は必要ありませんが、私が言っていることを得るならば、平均的/基本的な攻撃を止めるものです。 –

関連する問題