1

私は次のようなことをしています:

SELECT * FROM table WHERE user='$user';
$myrow = fetchRow() // previously I inserted a pass to the db using base64_encode ex: WRM2gt3R=

$somepass = base64_encode($_POST['password']);

if($myrow[1] != $somepass) echo 'error';
else echo 'welcome';

私は常にエラーが発生します。 $somepass と $myrow[1] をエコーし​​ますが、それらは同じですが、それでもエラーです。私は何を間違っていますか?ありがとう

4

5 に答える 5

2

echo の代わりに使用してみてくださいvar_dump- おそらくそのうちの 1 つに先頭/末尾にスペースまたは改行があります。

編集:

CHAR(40) として保存する必要があります。A fixed-length string that is always right-padded with spaces to the specified length when stored

VARCHAR を使用するか、trim()

于 2008-10-17T20:18:29.813 に答える
0

このエンコーディングは、次の 2 つのことを行います。

  1. コードが追加され、より複雑になり、エラーが発生しやすくなります
  2. 画面にデータベースを表示していて、誰かがあなたの背後から見ている場合、パスワードを覚えるのが少し難しくなる可能性があります。

いいえ、それは実際にはセキュリティを追加しません。それは単なるエンコーディングであり、デコードするのは簡単です。

たぶん、md5-hashing などと間違えているかもしれません。

いじってみるのもいいですが、セキュリティに関しては、理解できないものは使用しないことを強くお勧めします。長期的には、それは良いことよりも多くの損害を与えるでしょう。

于 2008-10-17T20:38:39.197 に答える
0

いくつかの問題:

  • 他の場所のコメントから、現在のコードの問題は、データベース フィールドが CHAR(40) であることだと思います。CHAR フィールドは常に固定サイズです。データベースのフィールド タイプを CHAR ではなく VARCHAR に変更してみてください。

  • データベースに格納する前に base64_encode を使用することは、安全とは言えません。パスワードの一方向ハッシュのみをデータベースに格納することをお勧めします。通常は md5 または (より適切な) sha1 です。次に、ユーザーがログインするときに、提供されたパスワードで同じハッシュ関数を使用し、2 つのハッシュを比較します。
    これには、40 文字を超えるパスワードも使用できるという追加の利点があります。
    sha1 または md5-hash は常に一定量のスペースを必要とするため、このルートを使用する場合、データベース列を VARCHAR に切り替える必要はありません :)

于 2008-10-17T20:42:52.573 に答える
0

$myrow[1] が実際に base64 エンコードの正しいパスワードである場合、エラーは表示されません。

最後にこれを試してください:

echo "<br />$myrow[1] != $somepass";

それは何と言っていますか?

ちなみに、パスワードを base64 でエンコードする理由はありません。何を達成しようとしていますか?

于 2008-10-17T20:20:31.637 に答える
0

var_dump() を実行すると、次のようになると思います。

文字列(40) "YWRraM2=" 文字列(8) "YWRraM2="

コンソールを使用してデータベースにデータを挿入すると、パスフィールドに余分なスペースが追加されるようです。

myplacedk: やってはいけない理由はありますか? セキュリティのレイヤーが追加されると思いましたか?

于 2008-10-17T20:30:19.587 に答える