base64_encode garip bir davranış

5 Cevap php

Ben aşağıdaki gibi bir şey yapıyorum:

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';

Im her zaman hata alıyorum, ben bile yankı $ somepass ve $ myrow [1] yine hata aynıdır, ama. Neyi yanlış yapıyorum? Teşekkürler

5 Cevap

Belki bunlardan biri başlangıç ​​/ sonunda bir boşluk veya yeni satır var - var_dump yerine yankı kullanmayı deneyin.

Edit:

A fixed-length string that is always right-padded with spaces to the specified length when stored: Sen CHAR (40) olarak saklanması gerekir

VARCHAR kullanın veya trim()

$ Myrow [1] aslında base64 kodlama doğru şifre ise, ben herhangi bir hata görmüyorum.

Sonunda ind bu deneyin:

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

Ne diyor?

Ve bu arada: I base64 kodlamak şifreler için herhangi bir neden göremiyorum. Ne yapmaya çalışıyorsun?

Ben bir var_dump yaparsam) (nasılsa düşünüyorum alıyorum:

string(40) "YWRraM2= " string(8) "YWRraM2="

Ben onun geçiş alanına fazladan bir boşluk ekleyerek konsolunu kullanarak db içine veri eklemek eğer nasılsa gibi görünüyor.

myplacedk: Ben bunu yapmamalıyım herhangi bir neden var mı? Ben ekstra bir güvenlik Leyer katacak düşündüm?

Bu kodlama, iki şey yapar:

  1. Bu hata yapmak için daha karmaşık ve daha kolay hale, kod ekler
  2. Eğer ekranda veritabanı görüntülemek ve birinin omzuna görünüyorsa, şifreleri biraz zor hatırlamak olabilir.

Yani hayır, gerçekten herhangi bir güvenlik katmıyor. Bu sadece bir kodlama, öyle çözmek kolaydır.

Belki md5-karma veya bunun gibi bir şey için mistaking.

Oynamak harika ama güvenlik söz konusu olduğunda, ben gerçekten anlamıyorum bir şey kullanarak tavsiye etmiyoruz. Uzun vadede, bu yarardan çok zarar yapacağız.

Bazı konular:

  • From your comments elsewhere, I guess that the problem with the current code is that your database field is CHAR(40). A CHAR field always has a fixed size. Try changing the database field type to VARCHAR instead of CHAR.

  • Using base64_encode before storing in a database is nowhere near secure. Good practice is storing only a one-way hash of the password in the database -- typically md5 or (better) sha1. Then, when the user wants to log in, use the same hash-function on the provided password, and then compare the two hashes.
    This has the added benefit of working with passwords longer than 40 characters too.
    A sha1 or md5-hash always takes a fixed amount of space, so if you go this route, you don't have to switch your database column to VARCHAR :)