문제

나는 다음과 같은 일을하고있다 :

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] 그것들은 동일하지만 여전히 오류입니다. 내가 뭘 잘못하고 있죠? 감사

도움이 되었습니까?

해결책

사용해보십시오 var_dump 에코 대신 - 아마도 그들 중 하나는 시작/끝에 공간이나 신축이 있습니다.

편집하다:

char (40)로 저장해야합니다. A fixed-length string that is always right-padded with spaces to the specified length when stored

바르 차르를 사용하십시오 trim()

다른 팁

$ myrow [1]이 실제로 Base64-Encoding의 올바른 암호라면 오류가 표시되지 않습니다.

이 끝을 시도해보십시오.

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

그것은 무엇을 말하는가?

그건 그렇고 : 나는 비밀번호를 기준으로 할 이유가 없다. 당신은 무엇을 성취하려고합니까?

var_dump ()를한다면 어떻게 든 생각합니다.

문자열 (40) "ywram2 ="String (8) "ywram2 ="

콘솔을 사용하여 데이터를 DB에 삽입하면 패스 필드에 추가 공간을 추가하는 것처럼 보입니다.

MyPlacedk : 내가하지 말아야 할 이유가 있습니까? 보안의 여유가 추가 될 것이라고 생각 했습니까?

이 인코딩은 두 가지를 수행합니다.

  1. 코드가 추가되어 오류를보다 복잡하고 쉽게 만들 수 있습니다.
  2. 화면에서 데이터베이스를보고 누군가가 어깨 너머로 보면 암호를 기억하기가 조금 어려울 수 있습니다.

아니요, 실제로 보안을 추가하지는 않습니다. 인코딩 일뿐입니다. 디코딩하기 쉽습니다.

어쩌면 당신은 MD5-Hashing이나 그런 것을 착각하고있을 것입니다.

주위를 놀리는 것은 훌륭하지만 보안과 관련하여 이해하지 못하는 것을 사용하지 않는 것이 좋습니다. 장기적으로는 좋은 것보다 더 많은 피해를 입을 것입니다.

몇 가지 문제 :

  • 다른 곳에서 귀하의 의견에서 현재 코드의 문제는 데이터베이스 필드가 char (40)라는 것입니다. 숯 필드는 항상 고정 된 크기를 가지고 있습니다. 데이터베이스 필드 유형을 Char 대신 varchar로 변경하십시오.

  • 데이터베이스에 저장하기 전에 Base64_encode를 사용하는 것은 거의 안전하지 않습니다. 모범 사례는 비밀번호의 일방 통행 해시 만 데이터베이스 (일반적으로 MD5 또는 더 나은) SHA1에 저장하는 것입니다. 그런 다음 사용자가 로그인하려면 제공된 비밀번호에서 동일한 해시 기능을 사용한 다음 두 해시를 비교하십시오.
    이는 40 자 미만의 암호로 작업 할 수 있다는 이점이 추가됩니다.
    SHA1 또는 MD5-Hash는 항상 고정 된 양의 공간을 차지 하므로이 경로를 가면 데이터베이스 열을 Varchar로 전환 할 필요가 없습니다 :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top