2013-05-28 6 views
1

이것은 아마도 반복되는 질문이지만 실제로 답변을 찾을 수 없습니다. $ _GET을 사용하여 URL에서 사용자 이메일 주소를 가져 오는 잊어 버린 비밀번호 스크립트가 있습니다. 그런 다음 스크립트는 $ _GET에서 오류 메시지를 확인한 다음 mysql을 통해 사용자 ID가 같은지 확인합니다. 사용자 ID는 정수 여야합니까?

지금 스크립트 자체는 잘하지만 사용자 ID는 문자열 대신 위해서 var_dump의 정수()으로 돌아옵니다. 나는 그것을 풀어 놓을 예정 이었지만 사용자 ID가 $ _GET 변수의 정수가 아니면 공격으로 이어질 수 있다는 것을 읽었습니다. num_rows 값을 int로 변경하려고 시도했지만 성공하지 못했습니다. num_rows가 배열을 반환하기 때문입니다. 사용자 ID를 확인하는 코드는 다음과 같습니다

if (mysql_num_rows($result) == 1) { 
    // NEED TO TURN THIS ARRAY TO AN INT 
    list($userId) = mysql_fetch_array($result, MYSQL_NUM); 
} 

//elseif (mysql_num_rows($result) <= 0) { 
else { 
    $wrong = '<p style="color: red">Something went wrong. Please try again</p>'; 
} 

내가 스크립트 자체는 괜찮 전에, 그것은 물어 저를 이끌어가 내 머리에서 그것을 얻을 수없는 지금은 뭔가를 읽고 그냥 그리고 말했듯 너희들. Doe의 사용자 ID는 정수 여야합니다. 그렇지 않으면 문자열로 가져갈 수 있습니까?

편집 : 모든 여러분의 의견과 제안을 주셔서 감사합니다. PHP로 배우기에는 여전히 많은 것들이 있습니다. 다시 건배.

+0

스크립트가 정수를 예상 할 경우 입력이 정수인지 확인해야합니다. '$ _GET'의 값은 문자열이지만,'is_numeric'을 사용하여 검사하고'(int)'를 사용하여 변환 할 수 있습니다. –

+0

URL에서 가져 오는 것은 int 여야합니다. 문자열 인 경우 취약점입니다. 데이터베이스에서 ID를 검색 할 때 데이터베이스의 내용을 신뢰하는 한 값은 문자열 일 수 있습니다. – 11684

+1

[** FILTER_VALIDATE_INT **] (http://php.net/manual/en/function.filter-var.php)를 사용하십시오. [_ 여기는 (int)가이 경우에는 바람직하지 않을 수있는 이유입니다.] (http://stackoverflow.com/questions/4789624/php-security-int-vs-filter-validate-int). 그리고 나서, [여기에 그것의 또 다른 예가있다] (http://codepad.org/kZGrkNuG) – itachi

답변

0

사용자 ID는 나는 그것이 데이터베이스에에 고유 키를 가지고 있으며, 시간에 따라 변화하지 않는 것을하는 것이 단지를 제안 ... 당신이 원하는 무엇이든 할 수있다. 어쨌든 당신의 테이블에 자동 증가 기본 키를 가지고하는 것이 좋습니다이고 그것이 유효 사용자 ID로 기준을 모두 충족하기 때문에

ID 년대는 전통적으로 사용된다. 당신은 $ _GET 배열에서 끌어

+1

좋은 연습은 아니며 이유는 실제로 잘 정의되어 있습니다. –

+1

@ N.B. 아마도 그 이유가 언급 된 링크를 공유하는 데 도움이 될 것입니다. –

+0

@ 잭 - 모든 이유를 설명하는 링크가 있다면 즉시 제공 하겠지만 불행히도 –

1

모든 HTTP를 통해 전송에는 유형 정보가 없다는 사실 때문에, 문자열 될 것입니다.

당신은, 그러나, 항상 사용자의 입력을 살균 또는 SQL 주입 공격을 방지하기 위해 준비된 문을 사용해야합니다.

1

당신이 섞어 보았을 때, 나는 그것들을 분명히하려고 노력할 것입니다. PHP가 HTTP 프로토콜을 통해 데이터를 받으면 GET 또는 POST가됩니다. 데이터가 무엇인지를 안전하게 식별 할 수있는 방법이 없기 때문에 모든 데이터가 문자열로 간주됩니다. 당신은 당신이 타입 캐스팅을 사용하여 $ _GET 또는 내부적으로 다른 타입으로 $ _POST를 통해 얻었다 데이터의 조각을 강요하려고 할 수 있다는 것을 의미합니다

, 데이터베이스로 같은 $id = (int)$_GET['id'];

, ID는 (의이 Primary Key를 호출하자)는 항상 정수 여야합니다.

이유 : - InnoDB는 실제 데이터 구조 구성과 정보를 디스크에 쓸 때 내부적으로 특정 원칙을 사용합니다. 순차적으로 증가 된 정수를 사용하면 성능이 크게 향상됩니다. - 정수를 사용하여 고유 한 식별자를 쉽게 만들 수 있습니다. 삽입을 수행 할 때마다 오프셋을 사용하여 숫자를 하나씩 늘리고 행에 할당 된 고유 번호를 얻으십시오. UUID() 등의 고유 식별자를 계산하는 복잡한 알고리즘이 필요하지 않습니다.

짧은 설명 - $ _POST/$ _ GET을 통해 데이터를 받으면 - int 형, float 형, string 형 등 원하는 형태로 캐스팅하십시오.)

1

는 사용자 ID 그러나 그것은 예를 들어 (일반적으로 고유의

  • 사용자 당 (일)
  • 효율적으로 데이터베이스에서 검색이라고하는 방법을 포맷, 정수가 없습니다)
  • 짧게는

때문에 특히 많은 사용자 은행, 많은 공간을 차지하지 않도록 이상적으로, 그 비트 수는 expec의 가장 큰 수를 포함해야한다 정수 (것 테드 사용자) 고유의

  • 이 - 데이타베이스에 의해 (점진적으로) 자동으로 할당 예를 들어
  • 효율적으로 색인하고,
  • 짧은 더 큰 사용자 테이블의

하나에 작은 화살표가있는 단점은 정수가 클라이언트 브라우저 (예 : 양식)에 주어진 경우 클라이언트는 순서대로 숫자를 쉽게 추측 할 수 있기 때문에 양식 사용자 ID를 변경하거나 사용자 수를 추측 할 수 있다는 것입니다. 추가 보안을 통해)