2016-10-28 1 views
-1

웹 응용 프로그램의 Javascript/HTML/PHP 가입 양식을 만들고 있습니다. 나는 그것을 가능한 한 안전하게 만들고 싶고, PHP에 널 바이트 주입을 읽고 있었다. 나는 이런 일을 막기 위해 % & £ # @ ?!와 같은 특수 문자 (null 바이트 문자)를 허용하지 않아야한다고 생각합니다. 사용자가 가입 할 때 비밀번호 등으로 선택되지 않습니까?HTML/자바 스크립트/PHP 입력란에서 null 바이트 삽입을 방지하는 올바른 방법

사용자는 두 개의 HTML 텍스트 상자에 사용자 이름과 암호를 입력하고 사용자 이름이 이미 사용되었는지 확인하는 사용자 이름 텍스트 상자의 onBlur 이벤트와 함께 데이터베이스 (PHP 스크립트 사용)를 검사하는 사용자 이름을 가지고 있습니다. 데이터베이스에 저장하고, "등록"버튼을 사용하지 않으면 사용자에게이를 경고합니다.

비밀번호 입력란과 비슷한 기능을 수행하고 싶습니다. 사용자가 특수 문자 (예 : "mypassword!")와 함께 비밀번호를 입력하면 "가입"버튼을 비활성화하고 비밀번호에 문자와 숫자 만 포함시켜야한다고 알려줍니다.

null-byte injection을 방지하는 올바른 방법입니까? 또는 PHP 파일 내부에서 일종의 검사를 통해 암호에 특수 문자를 허용하는 것이 안전합니까? 미리 도움을 주셔서 감사합니다!

+3

그래서 암호를 약하게 만들고 나중에 추측/해킹하기가 쉽습니다. 되도록 UGLY 및 COMPLICATED 인 암호를 권장해야합니다. –

+2

'null-byte injection을 방지하는 올바른 방법입니까? no - _any_ 클라이언트 측 코드가 암시 적으로 여러분의 제어에 없습니다. 사용자는 자신의 브라우저에서 JS를 사용하지 않도록 설정하여 간단히 무시할 수 있습니다. 클라이언트 쪽 유효성 검사에만 의존해서는 안되며, 서버를 보호 할 수는 없지만 사용자 경험을 향상시키는 데에만 도움이됩니다. – vlaz

+0

패스워드에서 null-byte-injection을 방지하는 최선의 방법은 패스워드 _hash()를 사용하는 것입니다. –

답변

2

답변이 없으므로 CW로 게시하십시오. @emily : 중 그들은 (PHP7에 테스트)를 고정, 또는 주석의 잘못 :

마크 B에 의해 위의 게시물에 대한 응답에서
php > echo password_hash("123\0456", PASSWORD_BCRYPT); 
$2y$10$UQ7o/1ggpeqQYQaAPDQUxeAq0vPFJCenBJEzDFkcFXirrz6HC7N9. 
php > var_dump(password_verify("123\0456", '$2y$10$UQ7o/1ggpeqQYQaAPDQUxeAq0vPFJCenBJEzDFkcFXirrz6HC7N9.')); 
bool(true) 
php > var_dump(password_verify("123", '$2y$10$UQ7o/1ggpeqQYQaAPDQUxeAq0vPFJCenBJEzDFkcFXirrz6HC7N9.')); 
bool(false) 
+0

안녕하세요, 제 서버는 7.0.12입니다. 특수 문자를 사용하는 사용자에 대해 걱정할 필요가 없습니다. 다시 한번 감사드립니다. – Emily

0

, 당신은 여전히 ​​조심해야하지? 우리가 NULL 바이트 신호 (PHP v7)로 \ 000을 사용하면 여기서 일어나는 일을보십시오. 개인적

php > echo password_hash("123\000456", PASSWORD_BCRYPT); 
$2y$10$GNQS2Wxj.L/5WukaOJEcxeOwgIgzug5BvCVvyVJOAUTkpfW2HiclO 
php > var_dump(password_verify("123\000456", '$2y$10$GNQS2Wxj.L/5WukaOJEcxeOwgIgzug5BvCVvyVJOAUTkpfW2HiclO')); 
bool(true) 
php > var_dump(password_verify("123", '$2y$10$GNQS2Wxj.L/5WukaOJEcxeOwgIgzug5BvCVvyVJOAUTkpfW2HiclO')); 
bool(true) 
php > var_dump(password_verify("123\000NothingMattersPastTheNull!", '$2y$10$GNQS2Wxj.L/5WukaOJEcxeOwgIgzug5BvCVvyVJOAUTkpfW2HiclO')); 
bool(true) 

, password_hash()를 사용할 때/bcrypt I가 첨가와 대소 알파를 포함하는 암호 모든 숫자 살균.! $^& (*)] @ -_ + 및에 최대 72 자 이것은 핵 미사일 코드의 저장이 아닌 내 용도에 완벽하게 적합합니다. 인터넷에 해답을 묻는다면 정보를 위험에 빠뜨리는 저장 장치를 사용하지 않을 가능성이 높습니다. 위의 위생 처리가 잘 작동 할 것이므로 위험하다고 말하는 운명을 무시할 수 있습니다. '엔트로피를 줄이고 있습니다!'와 같은 말을 던지면서 삶과 사지를 잡습니다.

나는 정의 된 문자 세트를 사용하여 8 - 72 자 사이의 암호를 행복하게 만들고, '고급 암호'대회에 password_hash()를 제공합니다. 지식이 있으면 심각한 하이 엔드 하드웨어를 사용할 것입니다 그리고 충돌을 찾기위한 많은 시간. 위의 내용을 좋은 시스템 보안으로 혼합하고 TLS를 통해 모든 정보를 전송하고 준비된 명령문 등을 사용하여 주입 공격과 같은 다른 일반적인 문제를 방지하십시오. 가장 확실한 상태를 제외한 모든 것을 막을 충분한 보안을 확보하고 있습니다. 후원 활동.

관련 문제