2014-12-30 1 views
0

문제없이 작동하는 등록 양식이 있지만 최근에 나에게 UX에 대한 나쁜 습관이 있다고 지적되었습니다. 계정이 이미 존재하고 사용자가 채운 양식을 다시 채우지 않고 사용자를 등록 페이지로 다시 리디렉션하고 오류 메시지 만 표시합니다.

초기 등록 데이터가 체크 아웃 된 후 해당 전자 메일 계정이 이미 존재하는 경우 $ _SOSSION 데이터를 $ _SOSSION 데이터로 저장하면이 문제를 해결할 수있는 좋은 방법을 신속하게 파악했습니다. 사용자의 양식을 다시 채운 후에 파괴하십시오.

이제 내 질문에 : 모든 공격 유형에 취약한 $ _SESSION 변수가 있습니까? 아니면 $ _SESSION 안에 원시 입력 데이터를 저장하고 양식을 다시 채울 때 htmlspecialchars()를 사용하여 이스케이프 처리 할 수 ​​있습니까?

+0

일부 기본 위생 처리에는 항상 mysqli_real_escape_string()을 사용할 수 있습니다 –

+1

'$ _SESSION' 변수는 일반적으로 디스크에 저장되며 물론 권한 설정이 잘못 될 수 있습니다. 암호와 같은 중요한 정보는 기억하지 않는 것이 좋습니다. $ _SESSION [ "foo"] = $ _POST;를 직접하지 마라. 왜냐하면 임의로 거대한 세션 파일/변수가 악의적 인 사용자로부터 유출 될 위험이 있기 때문이다. –

+1

@ Anonymous.X 데이터베이스에 저장할 때까지 그렇게 할 필요가 없습니다. 그 기능을 다른 용도로 사용하는 것은 의도 된 목적을 벗어난 것입니다. –

답변

2

세션의 변수는 세션 내에서의 공격에 취약하지 않습니다. 그러나 다른 곳에서 이러한 변수를 사용하면 구멍이 생길 수 있습니다. 예를 들어, get/post 변수를 세션에 넣었다고해서 그것이 마법처럼 직접 쿼리에 사용될 수 있다는 것을 의미하지는 않습니다. 여전히 SQL 주입 문제를 일으킬 수 있습니다. 이와 같은 것을 고려할 때 데이터의 출처를 생각해야합니다. 이 사용자 입력의 일종으로을 시작한 경우 더러운 것으로 간주합니다.

문제가되는 유일한 곳은 보낸 데이터가 실제로 크고 방금 $_SESSION['POST'] = $_POST;을 맹목적으로 지정하는 경우입니다. 오버플로 또는 이와 같은 문제가 있어서는 안됩니다. 문제는 php가 요청 시작시 데이터를 unserialize하고 마지막에 reserialize해야한다는 것입니다 (일반적으로 변경이 발생한 경우에만 해당). 이 직렬화/직렬화에는 시간이 걸립니다 (빠르지 만 여전히 그렇습니다). 저장할 값만 지정하는 것이 좋습니다.

+0

양식 제출시 유효성 검사를 통과하지 못하는 데이터로 목록을 다시 채우고 싶지 않기 때문에 세션에 저장하기 전에 데이터를 필터링하고 있습니다. 또한 준비된 문을 사용하고 있으며 데이터베이스를 보호하는 방법을 알고 있습니다. 이는 질문에 언급 한 UX에 대한 추가 사항 일뿐입니다. assigining에서 전체 $ _POST 배열이 아닌 특정 $ _POST 데이터 값만 할당합니다. –

+1

그러면 입력 요소에 다시 입력 할 때'htmlentities ($ value, ENT_QUOTES)'와 같은 작업을하는 한 문제가되지 않습니다. 누군가가' ">"'과 같은 형태로 양식을 제출하고 에코 입력을 '처럼 끝내기를 원하지 않을 것입니다. "> –

+0

@ShowTime $ _POST의 일부분 만 지정하더라도 여전히 상당히 클 수 있습니다. 특정 변수의 길이를 제한 해보십시오. 입력 내용이 포맷 된 경우 PHP 배열도 가능합니다. php.ini'max_input_vars','max_input_nesting_level','post_max_size' 옵션을보십시오 –

1

정확히 말하기 어렵습니다. 하지만 나는 그 대답이 100 % 확실하지 않다는 사실을 확신하지 못하고있다. 그것은 거의 즉시 세션을 파괴 할 수 있다고 가정합니다. 이 경우 세션을 만들고 사용자를 이전 페이지로 리디렉션하고 세션 바를 확인하고 바이스를 올바른 위치 (이 경우 일반 텍스트로 수행 할 수 있음)로 설정 한 다음 세션을 삭제합니다. 세션은 약 10 초 동안 만 생존합니다. 최대 1 분? 아무도 정말 서버에서 끌어낼 시간이 충분하지 않습니다. 그들이 교통 체증을 이미 듣고 있다면, 당신은 더 많은 문제에 처해 있습니다.

은 이제까지 그러나 제출하기 전에

당신은 아약스와 사용자 이름에 대한 확인을 할 수 있습니다 ... 그게 너무 오래했기 때문에 답변을 이동했다. 그게 더 좋을거야. 이메일이 이미 존재하는 경우 제출을 허용하지 않습니다. 그냥 keyup 또는 뭔가를 기반으로 제출하십시오.

+0

사실, AJAX 메서드는 고려해야 할 가치가 있지만, JavaScript 지원이없는 사람들을위한 경험을 향상시키기위한 것이기 때문에 JS와 JS 이외의 두 클래스의 사용자를 만족시키는 대안을 원했던 것입니다. 또한 목록을 다시 채우는 즉시 세션을 설정 해제합니다(). –

+1

그 경우에는 둘 다 수행하십시오. 사용자가 자바 스크립트를 원하지 않기 때문에 자바 스크립트 나 다른 라이브러리를 제외해서는 안됩니다. 예, 그렇게하는 사람들을 잡아라,하지만 그들이 훨씬 더 고마워 할 것 인 것에 따라지지를 가지고있는 사람을 위해 그 여분의 안전을 가지고있어 라. (대부분 혼란스럽지 않을 것입니다.) –

1

아니요, 세션 변수는 디스크에 저장, redis 또는 memcached 저장소를 통해 공유 등과 같은 다양한 옵션을 통해 서버에 저장됩니다.

이 데이터가 손상 되더라도 위생 조치가 어떤 것을 보호하고 이러한 공격의 부작용을 완화 할 수 있는지 실제로 알지 못합니다.

그런 일이 실제로 걱정된다면, 임시 세션 변수를 사용한 후에 그것을 종료 할 수 있습니다.

관련 문제