2012-07-19 3 views
0

관리 패널에 액세스하기 위해 로그인 패널을 코딩하고 있습니다. 데이터 (사용자 이름 및 암호)는 MySQL 데이터베이스 (유형 : InnoDB)에 저장됩니다. 테이블에서 암호가 일반 암호로 저장되어 있고 필드 암호에 다음과 같이 표시되어 있습니다. {일반} 암호.데이터베이스의 {일반} 비밀번호 및 로그인 오류

이미 가지고있는 코드를 수정하면 {plain} 문제가 다소 혼란 스럽기 때문에 몇 가지 문제가 있습니다.

내 예전의 코드는 다음과 같습니다 그래서

// Construct SQL statement for query & execute 
$sql = "SELECT * FROM table WHERE user = '" . $username . "' AND password = '" . md5($password) . "'"; 
$result = $mysqli->query($sql) or die(mysql_error()); 

내가 MD5 암호로 데이터베이스의 필드에서 "{일반} 암호"를 대체 할 경우, 코드가 잘 작동,하지만 난에 내 코드를 수정하는 경우 다음 중 하나 :

// Construct SQL statement for query & execute 
$sql = "SELECT * FROM table WHERE user = '" . $username . "' AND password = '" . $password . "'"; 
$result = $mysqli->query($sql) or die(mysql_error()); 

비밀번호가 잘못되어 로그인 할 수 없습니다.

이 문제를 해결하는 방법은 무엇입니까?

+0

암호에 '{일반}'을 연결하려고 했습니까? – Nico

+2

http://xkcd.com/327/ 참조하십시오. –

+1

참조 : http://bobby-tables.com/ – NullUserException

답변

1

실제 암호 앞에 접두사 "{plain}"이 있으면 해당 접두사를 포함하도록 쿼리를 조정해야합니다.

$sql = "SELECT * FROM table WHERE user = '" . $username . "' AND password = '{plain}" . $password . "'"; 
$result = $mysqli->query($sql) or die($mysqli->error()); 

또한 당신이 (그래서 $mysqli->error 사용)뿐만 아니라 mysqli 기능을 사용하는 die() 명령에 mysql_error()을 변경해야합니다 있습니다.

추신 : 요즘 암호를 저장하는 방법을 살펴보아야합니다. 그들을 일반 텍스트로 저장하는 것은 어떤 수단으로도 안전하지 않습니다.

편집

뿐만 아니라 여기 @BrianRasmussen로 의견을 언급 : 확실 $username$password을 확인 쿼리에 (문자열 CONCAT를 사용하여) 직접 사용되기 전에 sanitzed되었다! 그렇지 않으면 코드가 모든 종류의 SQL 주입에 개방됩니다.

+0

사용자 입력으로부터 직접 쿼리를 생성하지 않는다. –

+0

@BrianRasmussen '$ username'과'$ password'는 이전에 위생 처리되었을 수도 있습니다. – Sirko

+0

아마도,하지만 그 가능성은 ... –

1

확실한 것은 무엇입니까? {plain} 의미는 암호가 일반 텍스트임을 나타내며이 문자열이 실제로 있음을 나타냅니다. 따라서, 두 번째 SQL은 포함한다 : 나는 순전히 기술적 인 질문에 대답, 일반 텍스트에서 관리자 암호를 저장에 대한 논의를 시작하고 있지 않다

$sql = "SELECT * FROM table WHERE user = '" . mysql_real_escape_string($username) . "' AND password = '{plain}" . mysql_real_escape_string($password) . "'"; 

참고. 그러나 나는 일반 텍스트 암호를 저장하는 것은 아주 나쁜 아이디어라고 말해야합니다.

입력 내용을 살균하기 위해 mysql_real_escape_string을 추가했습니다.

+0

친절한 대답을 해주셔서 감사합니다. 불행히도 {평이한} 것이 특별하거나 특별한 것이 었는지 묻는 중이었습니다. 데이터베이스에 비밀번호를 저장하는 방법에 대해 조언 해 주셔서 감사하지만, 불행히도 다른 사람의 코드로 작업 중이므로 수정할 수 없습니다. DB에 평범한 비밀 번호를 저장하는 것은 나쁜 일이지만 나는 주니어 코더이며 고령자가 한 일을 수정할 수 없다는 것을 알고있다 : ( – Mark

관련 문제