4

たとえば、データベースからデータを取得し、get を介してユーザー入力を取得する単純なパスワード スクリプトを作成しています。

私が抱えている問題は、何らかの理由で、文字をエコーアウトしたときに文字がまったく同じに見えても、if ステートメントはまだそれらが異なると考えていることです。

htmlentities() 関数を使用して文字をエンコードしようとしましたが、データベースからのパスワードが適切にエンコードされ、「& #35441;」が機能します。(漢字に変換されないようにスペースを入れました!)。

もう 1 つのユーザー入力値では、おかしな文字が大量に表示されます。私がそれを壊しているに違いないと私が信じている唯一のことは、それが別の方法でエンコードされているため、phpはそれが2つの完全に異なる文字列であると考えていることです。

誰にもアイデアはありますか?
前もって感謝します、
ウィル

編集:
迅速な対応に感謝します。データベースのエンコーディングをUTF-8に設定してみますが、現時点では、データベースからの結果は問題ではありません.htmlentitiesを使用して正しくエンコードされています.問題を引き起こしている $_GET から取得します。

乾杯、
ウィル

4

4 に答える 4

3

パスワードについては、パスワードを平文で保存していることを意味するため、直接比較しないことをお勧めします。それらを保存する前に、少なくとも MD5 や SHA などのハッシュ (できればソルト値も使用) を実行してください。次に、通常は 16 進値であるハッシュ値を比較するだけでよいため、エンコードの問題は発生しません。

パスワード以外の値の場合、データベースと PHP が同じエンコーディングではないため、適切に一致していないようです。MySQL が必要な方法でそれらを保存している場合は、(最初に値を返すのではなく) 比較を行います。これにより、問題と思われるエンコーディングの変更を通過するパスの 1 つを回避できます。

于 2010-04-14T13:02:00.390 に答える
0

とにかく、パスワード自体ではなく、パスワードのハッシュを保存する必要があるため、これは解決策の一部である可能性があります。パスワードではなくハッシュを保存するため、データベースに問題はありません。

とはいえ、ブラウザが送信する文字列をエンコードする方法には違いがあるかもしれません。これは私があまり興味を持っていることではありませんが、すべてのブラウザでまったく同じ文字列を作成するソリューションを見つけることをお勧めします。accept-charsetをutf-8に設定するのは簡単です。また、enctypeをいじりたい場合もあります。

于 2010-04-14T13:25:43.597 に答える
0

SHA1 と MD5 を使用して値を保存すると、他の人が述べたように問題が解決する場合があります。また、安全なプロセスです。これが役立つコードスニペットです。

public function getHashedPassword()
{
    $salt = 'mysalt';
    return  sprintf( "%d%s",$salt,sha1( sprintf( "%d%s", $salt,$this->_rawPassword) ));
}

比較時に、パスワード入力を再ハッシュし、データベースに保存されているハッシュされたパスワードと比較します。そうすることで、エンコードの問題が解消される場合があります。

于 2010-04-14T13:16:07.477 に答える
0

パスワードを保存したい場合は、これを読んでください:安全なパスワードスキームについて知っておくべきこと.

それを読んだ後、あなたの根本的な問題は、ユーザーから受け取ったものとデータベースから得たものとの間の文字エンコーディングの不一致のようです。Mysql と utf-8 エンコーディングを使用している場合、最初にSET names "utf-8"クエリを使用しますか?

于 2010-04-14T13:03:05.157 に答える