2010-05-05 7 views
4

다음 중 어떤 방법으로해야하는지 궁금합니다. 나는 적절한 html 태그로 사용자 데이터를 포맷하는 작은 MCE wysiwyg 편집기를 사용하고 있습니다. 이제는 편집기에 입력 된이 데이터를 데이터베이스 테이블에 저장해야합니다.모범 사례. DB에 html 태그를 저장하거나 html 엔티티 값을 저장합니까?

DB에 삽입 할 때 해당 엔티티에 html 태그를 인코딩해야합니까? 그러면 테이블에서 데이터를 다시 가져올 때 XSS 용도로 인코딩 할 필요가 없지만 여전히 eval을 사용해야합니다. html 태그를 사용하여 텍스트 서식을 지정합니다.

또는

내가 그들의 실체에 html 태그를 인코딩 다시 데이터베이스에서 데이터를 얻을 때 난 후, 데이터베이스에 HTML 태그를 저장 않지만, 태그가 사용자에게 표시 될 다음, 나는 ' eval 함수를 사용하여 실제로 입력 된 데이터를 형식화해야합니다.

제 생각에는 첫 번째 옵션이 있습니다. 나는 여러분이 생각한 것을 궁금해했습니다.

답변

3

아니요. HTML을 "있는 그대로"보관하면 준비가 완료된 상태로 렌더링 할 때 그대로 사용할 수 있습니다. 당신은 앞뒤로 변환하지 않아도됩니다. 당신이 넣는 것은 당신이 전시하는 것이어야합니다. 당신이 원하는 것은 DB에 입력하기 전에 입력을 필터링하는 것입니다. tinyMCE와 ck/fckEditor는 편집기에서 사용할 수있는 태그를 제한 할 수있는 기능을 가지고 있으며 태그를 제거합니다. 그런 다음 다른 필요한 유효성 검사 또는 서식을 수행해야합니다.

+0

"필터 입력"이라고 말하면 무슨 뜻인지 알 수 있습니까? – phpNutt

+0

나는 가능한 한 안전하게 애플리케이션을 만들고 싶다. htmlentities 함수를 사용하여 태그를 HTML 엔티티로 변환하면 더 안전하게 만들기위한 단계가 될 것이라고 생각했다. – phpNutt

+0

@matt : 금지 된 태그를 제거하고 잘못된 마크 업을 수정하고 싶습니다. 그런 다음에 나가기 전에 변형, 추가 xss 필터링 등을 수행하기 위해 필터를 적용 할 수 있습니다. 하지만 db의 whats는 Adam N, brian_d 및 Earlz가 답변을 제시 할 때 기본 마크 업이되기를 원합니다. – prodigitalson

4

가능한 한 "자연스러운"형식에 가까운 데이터를 데이터베이스에 저장하는 것이 좋습니다. 일반적으로 데이터베이스 계층은 필드에 HTML, Base64 인코딩 이진 텍스트 또는 일반 텍스트가 포함되어 있는지 여부와 관련되어서는 안됩니다. 뷰 레이어가 컨텐트를 렌더링하는 방법을 결정할 때 이러한 레이어는 관심사입니다.

따라서 데이터베이스에 삽입하기 전에 XSS 공격에 대한 예비 검사를 수행하는 동안 브라우저에 "신뢰할 수없는"정보를 보내기 전에 항상 XSS를 검사해야합니다.

XSS 방지 알고리즘이 향후 개선 될 경우 HTML이 포함될 수있는 필드를 데이터베이스에서 검색하지 않고도이를 표시하는 루틴을 변경하여 전체 응용 프로그램에 구현할 수 있다는 이점이 있습니다 그런 다음 업데이트하십시오.

+0

또한 일반 텍스트 전자 메일을 보내거나 다른 방식으로 데이터를 볼 필요가 있는지 고려하십시오. 데이터베이스가 HTML보기로 표준화되면 다른 변환이 어색 할 수 있으며 인코딩이 어떤 인코딩인지 궁금 할 것입니다. 성능상의 문제가 있으면보기에서 항상 캐싱을 수행 할 수 있습니다. – Matthew

1

데이터베이스에 삽입 할 때 SQL 주입을 확인하고 HTML을 원래 상태로 두는 것이 "원시"형식입니다.

나는 drupal이이를 수행하고 필터 (예 : 모든 html 태그 (필터 없음), 특정 태그 만, xss 필터, PHP 코드 형식, 토큰 등)를 즉시 적용한다는 것을 알고 있습니다. 이 방법의 장점은 나중에 사용할 필터를 변경하려는 경우 입력 데이터를 파괴적으로 수정하지 않는다는 것입니다.

2

블로그를 처음 시작했을 때 나는 BBCode를 HTML로 변환하고 (그리고 온 전성 검사를하고) 데이터베이스에 넣기로 결정했다. 글쎄, 한달이 지나면 레이아웃 문제가 발생했다. 이제는 내 오래된 HTML이 데이터베이스에서 "고정"되었으므로 사용자가 데이터베이스에서 사용하는 초기 텍스트를 항상 저장하고 나중에 요청에서 변환해야한다는 것을 곧 알게되었습니다.

이렇게하면 HTML 및 XSS로 버그를 수정할 수 있으며 소급 적용됩니다.

0

위생 처리 된 버전과 원래 버전을 모두 저장할 수 있습니다. HTMLPurifier와 함께이 기능을 사용하여 사용자가 원래 양식으로 내용을 편집 할 수 있도록 허용하면서 실시간 살생 화로 인해 발생하는 성능 문제를 방지합니다.

말할 필요없이 두 배의 저장 공간이 필요하지만 일반적으로 공간은 속도와 제어의 문제가 아닙니다.