2011-12-27 9 views
0

PHP:ケース・小文字を区別しないログインを確認し、今ユーザーがこの方法でログインできる場合、私はチェックのよう

// simply logic: 
if (username == usernameEntered && password == passwordEntered) { 

私のデータベースは、私のユーザーの表内のAaronのエントリがあります。しかし、私がaaronまたはAARONなどとしてログインしようとすると、私のアクセスが拒否されます。それは大文字と小文字が区別されるようです。これは自分のデータベースに問題があるのですか、ログイン資格情報をどうやって確認していますか?

JavaScriptを使用したときに覚えています。/values/iを大文字と小文字の区別に使用できます。 PHPのチェックのためにこれがありますか?

また、私はここにいるので、isset();empty();の間には大きな違いがありますか?クッキー/ $ _ GET [];リクエスト?

+0

あなたはデータベースクエリを行うために使用しているコードを表示していません –

+0

あなたはどのデータベースシステムを使用していますか?関連するコードを表示できますか? MySQLを使用している場合、ユーザ名が調整なしで保存されている場合(ハッシュなど)、大文字と小文字の区別について心配する必要はありません。 –

+0

あなたのコードは非常に単純化されているので、これはオフかもしれませんが、実際にパスワードを平文で保存していて、ハッシュされていないようです。 – kba

答えて

3

はい、strtolower機能を使用してください。ただ、このような何かをする必要があります。

if(strtolower($username) == strtolower($usernameEntered)) 

isset()empty()用として、彼らは確かに異なっているが、多くの場合、彼らはあなたに同じ結果を与えるでしょう。 isset()は、変数がすべて設定されているかどうかを示します(しかし、値はまだ設定できます)。 empty()は、変数が何かと等しいかどうかを一般的に示します。それぞれのリンク先のPHPドキュメントを参照してください。私は空の文字列と0が空であると考えられるため、empty()をCookieとGET/POSTの値のチェックに使用することをお勧めします。私は変数が設定されているかどうかを確認するためにisset()を使い、探しているデータがあればそれをさらにチェックします。多くの場合、空の文字列を値なしとは異なる方法で扱いたいと思うことがあります。

また、Pekkaは、ユーザー名に基づいてデータベースのアカウントを検索している場合は、本当にそこで小文字に変換する必要があるというコメントを出しました。その場合:

SELECT * FROM users WHERE LOWER(username) = LOWER(:username) 

これは、PDOで準備済みのクエリを使用していると仮定しています。それ以外の場合は、:usernameの文字列を置き換えてください(文字列の連結などはもちろんです)。

EDIT:このようなクエリでLOWER()を使用すると、比較のためにテーブル内のすべてのユーザー名を小文字に変換する必要があり、フィールド上の任意のインデックスを役に立たなくするため、実際には悪い考えです。より良い方法は、データベースにユーザ名の小文字バージョンを格納し、フィールドにインデックスを格納することです。ユーザーがログインしようとすると、入力した内容を小文字に変換してから比較します。照合はあなたを聞かせます(大文字と小文字を区別しない)_ciを使用して

SELECT * FROM `users` WHERE `username` COLLATE utf8_general_ci = 'FoObAr' 

+0

TomSがstrtolowerの答えで私にそれを打つように見えます。:) – Compeek

+0

いいえ、 'empty'は'!isset ||と等価です。 == false'。 http://kunststube.net/issetを参照してください。 – deceze

+1

@Compeek、もっと良いです! –

3

strtolower()またはstrtoupper()を条件の両側に使用してください。

if (strtolower(username) == strtolower(usernameEntered) && strtolower(password) == strtolower(passwordEntered)) 

これらの機能は、すべての上位文字を下位文字で置き換えるか、またはその逆で、大文字と小文字を区別しないチェックを可能にします。

また、あなたがPHPのドキュメントに

PHP: isset - Manual

PHP: empty - Manual

参照チェックすることにより、詳細にisset()empty()の違いを見ることができます:

http://php.net/manual/en/function.strtoupper.php

+0

(私は 'strcasecmp'を使っているのと同じだと思います。http://www.php.net/manual/en/function.strcasecmp.php好きな方は編集してください)@Compeekは以下のように、おそらくstrlower /ストラッパーアプローチ。 – marnir

+4

私は大文字と小文字を区別してパスワードを保持しています。 – Noodles

+1

@marnir ** strcasecmp **のドキュメントページの最初のコメントは次のように書かれています:_これはシングルバイトの関数であることを忘れないでください:Unicode文字列では、両方の文字列が大文字と小文字を区別していればすぐにインコヒーレントな結果が得られます。あなたは文字エンコーディングと照合の両方を考慮に入れて独自の文字列を書く必要があるので、組み込みのマルチバイトの代替文字は存在しないようです._だから、** strtolower **や**を使うともっと安全になると思いますstrtoupper ** – Compeek

0

データベースにユーザ名を検索するときに、比較のために使用される照合を選択するSQL文でCOLLATE clauseを使用することができますケースに関係なく値を見つける。しかし、正しい照合順序を選択することを忘れないでください。そうしないと、予期しない結果が得られる可能性があります。他の文字も同じと見なされます(たとえば、eおよびé)。列の照合順序を直接設定することもできますので、すべてのクエリにCOLLATEを含める必要はありません。

あなたが本当にすべきことは、がデータベースに入る前にユーザ名を正規化することです。たとえば、ユーザ名は常に小文字で保存されます。次に、データベースを検索するときに、クエリーにプラグインする前に、検索する用語を小文字にします。 strtolowerを参照してください。 issetemptyについては

issetemptyもそれがemptyと考えていますかどうかを示します、値がまったく存在しているかどうかを示します。マニュアルまたはhttp://kunststube.net/issetをお読みください。

+0

ユーザ名の正規化に関しては、表示のために大文字小文字を維持したいことがあります。表示バージョンは常に別に保存することもできますが、プロジェクトによってはそれが過剰です。 – Compeek

+0

公正な点ですが、私は「ログインのために使用されるユーザー名」と「表示名」のアイデアを分けます。表示名をUnicodeで好きなものにして、ユーザー名をASCIIに制限します。その後、ユーザー名の代わりに電子メールアドレスまたはOpenID/Oauth/BrowserIDを使用することもできます。 – deceze

+0

確かに。私はおそらくそれらも分けるだろう。私はユーザー名が大文字と小文字を除いて表示名とまったく同じだと思っていましたが、たとえそうであっても、それらを別々に保つのがより理にかなっています。努力。 – Compeek

関連する問題