2009-06-24 4 views
1
^([[email protected]#$%^&*|()_\-+=\[\]{}:;\"',<.>?\/~`]{4,})$ 

이 정규식이이 규칙에 적용됩니까?이 정규 표현식이 작동합니까?

  • 문자는 알파벳, 숫자 (비 대문자/대문자)의 혼합 일 수있다이어야 4 자, 다음과 같은 문자 여야합니다! @ # $ %^& *() _ - + = | [{}]; :.? ", <>/

은 암호 검증 할 의도 언어는 PHP입니다

+5

암호 유효성 검사에 이것을 사용하는 경우, 내 질문은 다음과 같습니다. 왜 그들은 사용할 수있는 문자 유형을 제한합니까? 최소 문자 수를 확인해야합니다. – MahlerFive

+2

4 문자는 보호할만한 가치가 거의 없습니다. 가치있는 보호가 아니라면 왜 비밀번호를 추가해야합니까? –

+0

@MahlerFive 그걸로 충분할까요? DB에 대해 확인하기 전에 암호가 해시 + 소금 화됩니다. 암호의 문자 수를 검사하는 것만으로 충분하다면이 정규식을 더 이상 구현하지 않을 것입니다. @Vinko 내가 아래의 설명에서 말했듯이, 나는 현재 개발 중이므로 4 개만 사용했고 로그인 할 때는 4자를 입력하는 것이 더 쉽습니다. – Nikko

답변

5

예?

솔직히, 무엇을 요구하고 있습니까? 왜 테스트하지 그래? 이 정규식 검사 무엇

  1. :

    경우, 그러나, 당신은 그것을 개선에 대한 제안, 몇 가지 질문을 원한다?

  2. 왜 큰 문자 집합이 허용됩니까?
  3. /0-9a-zA-Z_/ 대신 /\w/을 사용하지 않는 이유는 무엇입니까?
  4. 당신은 왜 () s에 모든 것을 가지고 있습니까?당신은 이미 모든 것을 가지고 있기 때문에 모든 것을 포착 할 필요가 없으며, 무엇이든 묶을 필요가 없습니다. 내가 할 것이 무엇

은 어떤 나쁜 문자가 있는지 확인하기 위해 정규식에 대해 확인 후 별도로 길이를 확인하고있다. 좋은 성격의 당신의 명단은 그렇게 쉽게 그렇게 할 수있을만큼 충분히 클 것 같습니다. 그러나 그것은 당신이 무엇을하고 있는지에 달려 있습니다.

편집 : 지금은 알고이 PHP 정확히 펄하지 않은 PCRE 라이브러리를 사용하기 때문에 /\w/ 안전, PHP 중심이며, PCRE에서, \w 것이다 하지 경기 유니 코드 워드 문자. 따라서, 길이를 확인하고 확인하지 왜 잘못된 문자가 없습니다 :

if(strlen($string) >= 4 && preg_match('[\s~\\]', $string) == 0) { 
    # valid password 
} 

또는, 거의 사용되지 POSIX 문자 클래스 [[:graph:]]를 사용합니다. Perl과 마찬가지로 PHP에서도 거의 동일하게 작동합니다. [[:graph:]]은 원하는대로 들리는 모든 영숫자 또는 구두점 문자와 일치하며 은 그 반대 문자와 일치해야합니다. 정규 표현식은 단순한를 들어, 상태 규칙 작동하지 않을 것입니다

preg('[[:^graph:]]', $string) == 0 
+0

정규식을 테스트했지만, 정규 표현식을 만드는 것을 정말로 잘하지 않아서 올바른지 확인하기를 원했습니다. (내가 보았 듯이, 정규식은 매우 최적화되지 않았습니다.) 기본적으로 여기에 암호를 만드는 것은 정규 표현식이며 엄격해야하는 정규식이 필요합니다 (대문자, 특수 문자, 숫자 등은 필요하지 않습니다). "좋은"문자의 흰색 목록이 있습니다. 내 정규식의 더 나은 버전을 제공 할 수 있습니까? – Nikko

+0

고맙습니다. 이것이 효과가있는 것 같습니다. – Nikko

+0

'[\ s ~ \\\]'가 정확히 대조하는지 설명 할 수 있습니까? – Nikko

1

Regex buddy 당신의 친구입니다

+2

아니야 .... –

+1

왜 안되니 ......? – Ankur

+2

별로 유용하지 않습니다. 나는 정규식을 작성하는 법을 알고 있고, 필자는 스스로 작성할 수있다. 필자가 쓰기에는 너무 복잡하다면 왜 내가 한 정규 표현식에서해야하는지 묻고 있어야한다. 왜 그 중 절반 만 할 수있는 도구에 돈을 지불해야합니까? –

1

당신은 쉼표 (,) 전체를 잊어 버렸습니다... (.)을 사용하고 사양에 포함되지 않은 물결표 (~)와 악센트 부호 (`)를 추가하십시오. 문자 세트 선언의 일부 문자 만 이스케이프 처리해야합니다.

^([[email protected]#$%^&*()|_\-+=[\]{}:;"',<.>?/~`]{4,})$ 
,

그리고 preg_match에 대한 PHP 문자열 선언과 같은 :

'/^([[email protected]#$%^&*()|_\\-+=[\\]{}:;"\',<.>?\\/~`]{4,})$/' 
+0

원래 인용 된 정규식을 편집하여 수정했습니다. 나는 ~과'를 스펙에 추가했다. – Nikko

0
당신이 수 대신, 그래서 이것에 대해, 백 슬래시, 공간 및 시작시 제어 문자를 제외하고, ASCII들이 모두 포함되어 있는지 알

?

^([!-\[\]-~]{4,})$ 
+0

기본적으로 여기에 암호를 만드는 정규 표현식이 있습니다. 정규식은 필요하지 않습니다 (대문자, 특수 문자, 숫자 등이 하나도 필요하지 않습니다). "좋은"문자의 화이트리스트. 귀하의 정규식이 그것을 할 수 있을까요? – Nikko

+0

Btw, 위의 데이터 이외에, 나는 PHP에서 preg_match와 함께 정규식을 사용하고 있습니다. – Nikko

+0

왜 일부 문자를 금지하고 있습니까? 그리고 왜 지구상에 4 자의 암호를 허용합니까? –

0

추가 이스케이프 처리 중이고 사전 정의 된 문자 클래스 (예 : \ w 또는 적어도 \ d)를 사용하지 않습니다.

그 외에

하고 문자열의 시작과는 일치 끝나는 경우 정규 표현식은 일치하는 것을 의미, 시작과 끝 부분에 고정되어 있는지, 그것은 올바른 같습니다

^([a-zA-Z\d\[email protected]#$%^&*()|_+=\[\]{};,."'<>?/~`]{4,})$ 

당신이 정말로 의미하는 경우 이것을 암호 검사기로 사용하려면 다음과 같이 불안정합니다 :

  • 왜 4 자 암호를 허용합니까?
  • 왜 일부 문자를 금지하고 있습니까? PHP는 일부를 처리 할 수 ​​없습니까? 왜 신경 쓰겠 니? 사용자가 원하는 문자를 입력하게하십시오. 결국 해시 + 소금을 저장하게됩니다.
+0

\ w 문자 클래스는 ASCII 이상의 방법과 일치합니다. – Joey

+0

사실, 내가 그것을 사용하지 않은 이유입니다. –

+0

@Johannes - Perl에서만 가능합니다. PCRE에서는 그렇게 생각하지 않습니다. –

0

아뇨 : 모든 문자가 그래프 일치하지 않는 경우

preg('^[[:graph:]]+$', $string) == 1 

테스트 : 모든 문자 그래프 일치하는 경우 테스트하려면 그 이유는 $이 기본값으로 과 일치하기 전에 마지막 줄 바꿈 문자 인 경우입니다. "1234 \ n"과 같은 암호 문자열을 허용하고 있습니다.

해결책은 간단합니다. $ 대신 \z을 사용하거나 D 수정자를 정규식에 적용하십시오.

관련 문제