복붙노트

클렌징 사용자 암호

PHP

클렌징 사용자 암호

해시하거나 사용자 데이터베이스에 저장하기 전에 사용자가 제공 한 암호를 어떻게 벗어나거나 정리해야합니까?

PHP 개발자는 보안 목적으로 사용자의 암호 해시를 고려할 때 다른 사용자 제공 데이터처럼 암호를 생각하는 경향이 있습니다. 이 주제는 암호 저장과 관련된 PHP 관련 질문에서 종종 나타납니다. 개발자는 escape_string () (다양한 반복), htmlspecialchars (), addslashes () 및 기타를 해싱하고 데이터베이스에 저장하기 전에 암호와 같은 기능을 사용하여 암호를 정리하려고합니다.

해결법

  1. ==============================

    1.

    여러 가지 이유로 PHP의 password_hash ()를 사용하여 해싱 할 암호에 대해 다른 정리 메커니즘을 사용하지 말아야합니다. 그 중 하나가 가장 큰 것은 암호를 추가로 정리하면 불필요한 추가 코드가 필요하기 때문입니다.

    우리는 모든 사용자 입력을 정제해야하며 사용자가 받아들이는 모든 다른 정보에 적합하다고 주장 할 것입니다 (사용자 데이터가 시스템에서 사용되는 모든 게시물에서 볼 수 있습니다). 암호는 다릅니다. 해시 된 암호는 데이터베이스에 저장하기 전에 문자열이 해시로 변환되기 때문에 SQL 주입 위협을 제공 할 수 없습니다.

    패스워드를 해싱하는 것은 데이타베이스에 패스워드를 안전하게 저장하는 것입니다. 해시 함수는 모든 바이트에 특별한 의미를 부여하지 않으므로 보안상의 이유로 입력을 클렌징 할 필요가 없습니다.

    사용자가 원하는 암호 / 문구를 사용할 수 있도록 허용하고 암호를 제한하지 않는다는 말을 따르는 경우 길이, 여백 및 특수 문자 해싱을 허용하면 포함 된 내용에 상관없이 암호 / 암호를 안전하게 지킬 수 있습니다 비밀번호. 현재 가장 일반적인 해시 (기본값) 인 PASSWORD_BCRYPT는 암호를 해시 된 암호 정보와 비용 (해시 생성의 알고리즘 비용)과 함께 임의의 소금을 포함하는 60 자의 넓은 문자열로 바꿉니다.

    해시를 저장하기위한 공간 요구 사항은 다른 해싱 메소드가 함수에 추가 될 때 변경 될 수 있으므로 VARCHAR (255) 또는 TEXT와 같이 저장된 해시의 열 유형을 늘리는 것이 항상 좋습니다.

    완전한 SQL 쿼리를 비밀번호로 사용할 수 있으며 해시로 SQL 엔진이 실행할 수 없도록 만들 수 있습니다 (예 :

    SELECT * FROM `users`;
    

    $ 2y $ 10 $ 1tOKcWUWBW5gBka04tGMO.BH7gs / qjAHZsC5wyG0zmI2C.KgaqU5G로 해싱 될 수 있습니다.

    다른 살균 방법이 패스워드에 어떻게 영향을 주는지 보자 -

    비밀 번호는 "디저트 토핑"& <마루 왁스>입니다! (암호 끝에는 5 개의 공백이 있으며 여기에는 표시되지 않습니다.)

    다음과 같은 트리밍 방법을 적용하면 다양한 결과를 얻을 수 있습니다.

    var_dump(trim($_POST['upassword']));
    var_dump(htmlentities($_POST['upassword']));
    var_dump(htmlspecialchars($_POST['upassword']));
    var_dump(addslashes($_POST['upassword']));
    var_dump(strip_tags($_POST['upassword']));
    

    결과 :

    string(40) "I'm a "dessert topping" & a <floor wax>!" // spaces at the end are missing
    string(65) "I'm a &quot;dessert topping&quot; &amp; a &lt;floor wax&gt;!     " // double quotes, ampersand and braces have been changed
    string(65) "I'm a &quot;dessert topping&quot; &amp; a &lt;floor wax&gt;!     " // same here
    string(48) "I\'m a \"dessert topping\" & a <floor wax>!     " // escape characters have been added
    string(34) "I'm a "dessert topping" & a !     " // looks like we have something missing
    

    password_hash ()로 보내면 어떻게됩니까? 위의 쿼리와 마찬가지로 모두 해시됩니다. 암호를 확인하려고하면 문제가 발생합니다. 이러한 방법 중 하나 이상을 사용하는 경우이를 password_verify ()와 비교하기 전에 다시 사용해야합니다. 다음은 실패합니다.

    password_verify($_POST['upassword'], $hashed_password); // where $hashed_password comes from a database query
    

    패스워드 검증에서 그 결과를 사용하기 전에 선택한 클린징 방법을 통해 게시 된 패스워드를 실행해야합니다. 불필요한 단계이며 해시를 개선하지 않습니다.

    5.5 미만의 PHP 버전을 사용하고 있습니까? password_hash () 호환성 팩을 사용할 수 있습니다.

    MD5 암호 해시를 사용하면 안됩니다.

  2. ==============================

    2.

    패스워드를 해싱하기 전에, RFC 7613의 4 절에서 설명한대로 패스워드를 정규화해야한다. 특히 :

    과:

    이렇게하면 사용자가 동일한 암호를 입력하지만 다른 입력 방법을 사용하는 경우에도 암호를 수락해야합니다.

  3. from https://stackoverflow.com/questions/36628418/cleansing-user-passwords by cc-by-sa and MIT lisence