2008-10-21 4 views
26

나에게 도청을 계속하는 간단한 질문.저장하거나 표시 할 때 HTML 인코딩 사용자 입력

사용자 입력을 즉시 HTML로 인코딩하고 인코딩 된 내용을 데이터베이스에 저장해야합니까, 아니면 표시 할 때 원시 값과 HTML 인코딩을 저장해야합니까?

인코딩 된 데이터를 저장하면 개발자가 데이터를 인코딩 할 때 코드를 잊어 버리는 위험이 크게 줄어 듭니다. 그러나 인코딩 된 데이터를 저장하면 데이터 마이닝이 다소 복잡해지며 대개는 문제가 아니지만 조금 더 많은 공간이 필요하게됩니다.

답변

24

나가는 길에 정보를 인코딩하는 것이 좋습니다. 원시 데이터를 데이터베이스에 저장하는 것은 특정 시점에서 조회 한 방식을 변경하려는 경우 유용합니다. 흐름은 다음과 비슷한 형식이어야합니다.

sanitize user input -> protect against sql injection -> db -> encode for display 

대신 정보를 RSS 피드로 표시하려는 경우를 생각해보십시오. 다시 표시하기 전에 HTML에 특정한 인코딩을 다시해야하기 때문에 약간 바보 같습니다. 모든 개발은 입력이 사용자 또는 데이터베이스에서 왔는지 여부에 관계없이 항상 "입력 신뢰하지 않음"밈을 따라야합니다.

+2

SELECT..WHERE를 수행 할 때 후속 쿼리가 작동하고 일부 값에 HTML 인코딩이 있고 다른 쿼리가 작동하지 않을 때 어떻게해야합니까? – DOK

+0

우, 소리가 좀 엉망 이네. 그것은 당신의 세부 사항에 달려 있습니다. 그러나 새로운 뷰를 생성해야하는 프로젝트를 상속하고 정보가 절반으로 인코딩 된 경우 장기적으로 쉽게 정보를 다시 저장하여 쉽게 삶을 유지할 수 있습니다. – Owen

+0

디스플레이에 대한 인코딩 프로세스가 비쌉니다 (예 : HTML을 허용하고 HTML Purifier를 실행중인 경우) 필터링 된 버전을 캐싱하는 것이 옵션이 될 수 있습니다. 디스크 공간이 쌉니다. –

5

HTML 인코딩 텍스트 (예 :보고 도구)를 이해하지 못하는 것으로 데이터베이스에 액세스해야 할 수 있습니다. 나는 스페이스가 문제가되지 않는다는 것에 동의하지만 IMHO는 HTML 인코딩을 데이터베이스에 두어 뷰/프론트 엔드에 대한 지식을 애플리케이션의 가장 낮은 계층으로 옮긴다. 이것은 디자인 실수이다.

+0

가 동의합니다! 이것은 ppl이 XSS를 막기 위해 할 때 먼저 무시됩니다. – jack

+0

이 [관련 질문] (http://stackoverflow.com/questions/22297015/should-i-save-in-db-user-input-as-html-encode)을 살펴 보시기 바랍니다. –

6

인코딩은 디스플레이에서만 수행해야합니다. 예외없이.

6

출력.

는 HTML을 사용하면 간단하게 (& 1 개 캐릭터이지만, strlen()는 5 말할 것이다) 문자열의 길이를 확인할 수 없습니다 (그 실체를 깰 수), 당신은 쉽게자를 수 있습니다.

데이터베이스의 문자열을 다른 원본의 문자열과 혼합하거나 다시 읽고 쓸 필요가있을 수 있습니다. 탈출을 놓치지 않고 이중 탈출을 피하면서이 응용 프로그램 전체를 수행하는 것은 악몽입니다.

PHP가 magic_quotes과 비슷한 일을 시도했지만 거대한 실패로 밝혀졌습니다. magic_entities 경로를 잡지 마십시오! :)

0

인코딩 목적을 상쇄하지 않습니까? 악의적 인 SQL 스크립트가 입력으로 입력되면 db에 전달되어 큰 문제가 발생할 수 있습니다.

+0

이 때문에 우리는 매개 변수화 된 sql을 사용하고 보안 설정을 활용합니다. SQL 삽입에 대한 해결책은 보안입니다. 예를 들어, 웹 응용 프로그램 사용자가 테이블에 직접 쓰기 권한을 부여하지 말고 Dyanmic SQL에 테이블에 삽입 할 동적 스크립트를 작성하지 마십시오. 이를 위해 Procs 나 ORM을 사용하십시오. –

관련 문제