2013-08-05 4 views
2

내가 얻은 입력이 HTML로 인코딩되었는지 아닌지 확실하지 않은 상황이 있습니다. 어떻게해야합니까? 또한 jQuery를 사용할 수 있습니다.JavaScript에서 HTML로 인코딩 된 값을 처리하는 방법

function someFunction(userInput){ 
    $someJqueryElement.text(userInput); 
} 

// userInput "<script>" returns "&lt;script&gt;", which is fine 
// userInput "&lt;script&gt;" returns &amp;lt;script&amp;gt;", which is bad 

내가 탈출 앰퍼샌드 (&)를 피할 수 있지만,의 위험은 무엇입니까? 어떤 도움이라도 대단히 감사합니다!

중요 사항 :이 사용자 입력 내용은 컨트롤이 아닙니다. 그것은 외부 서비스에서 돌아오고 누군가가 그 서비스를 조작하고 해당 서비스 자체가 제공하는 html 이스케이프를 피할 수 있습니다.

+3

이러한 상황을 피할 필요가 있습니다. 왜 확실하지 않니? – SLaks

+0

입력이 이미 인코딩 된 경우 중요한 이유는 무엇입니까? 사용자가 문자 '<script>'을 입력하면 표시되어야 할 내용입니다. 그것을 인코딩하는 방법은 변경되지 않습니다. –

+2

_ 입력에 HTML 인코딩 여부가 확실하지 않은 상황이 있습니다 .-이 경우는 좋지 않습니다. – Halcyon

답변

2

정말 어려운 상황을 예측하기 때문에 이러한 상황을 피해야합니다.

추가 변수 입력을 함수에 추가해보십시오.

function someFunction(userInput, isEncoded){ 
    //Add some conditional logic based on isEncoded 
    $someJqueryElement.text(userInput); 
} 

fckEditor와 같은 제품을 보면 원본을 편집하거나 서식있는 텍스트 편집기를 사용할 수 있습니다. 따라서 자동 인코딩 감지가 필요 없습니다.

html 인코딩 문자를 자동으로 검색하는 데 여전히 어려움이 있다면 특정 핵심 구문이 있는지 확인하려면 index of를 사용하는 것이 좋습니다.

str.indexOf('&lt;') !== -1 

위 예제는 < 문자를 감지합니다.

는 ~~~ 새로운 텍스트는이 라인 아래에 편집 이후에 추가. ~~~

마지막으로, 나는 this answer보고 제안했다. 그들은 디코드 기능을 사용하고 길이를 감지 할 것을 제안합니다.

var string = "Your encoded &amp; decoded string here" 

function decode(str){ 
    return decodeURIComponent(str).replace(/&lt;/g,'<').replace(/&gt;/g,'>'); 
} 

if(string.length == decode(string).length){ 
    // The string does not contain any encoded html. 
}else{ 
    // The string contains encoded html. 
} 

이것도 여전히 그 부호화 특수 문자를 입력하여 처리를 꾀 사용자의 문제를 가지고 있지만, 그 HTML 인코딩되는 것이다. 따라서 이러한 문자 시퀀스 중 하나가 나타나면 곧 html 인코딩을 사용하는 것이 적절할 것입니다.

+0

실용적인 솔루션이 마음에 들지만,이 '<'문자열을 입력 어딘가에 추가하면 입력을 쉽게 통과 할 수 있습니다. –

+1

링크를 제공해 주셔서 감사합니다. 탈주 여부를 알지 못하는 이유에 대해 설명해 드리겠습니다. –

+0

그 코드는 매우 잘못되었습니다. URI 이스케이프는 HTML 이스케이프와 아무 관련이 없으며 HTML 이스케이프를 제대로 커버하지 못합니다. – SLaks

1

항상은 신뢰할 수없는 입력을 HTML과 같은 구조화 된 언어로 연결하기 전에 올바르게 인코딩해야합니다.

그렇지 않으면 XSS와 같은 주입 공격을 사용할 수 있습니다.

입력에 HTML 서식이 포함될 것으로 예상되는 경우 안전하지 않은 모든 태그 &을 제거하려면 살균제 라이브러리를 사용해야합니다.

정규식 /<|>|&(?![a-z]+;)을 사용하여 문자열에 인코딩되지 않은 문자가 있는지 확인할 수도 있습니다. 그러나 인코딩 된 문자열과 인코딩되지 않은 문자열을 구별 할 수는 없습니다.

+0

나는 완전히 동의하지만 인코딩 된 것인지 아닌지를 확인하거나 그 못생긴 이중 인코딩 된 메시지를 피할 수있는 방법이 있습니까? –

+1

@JustusRomijn :'if (!/<|> | & (?! [a-z] +;) /. test (소스))'. 그러나 '<'과 같은 텍스트가 인코딩 된'<'로되어 있는지 또는 XML에 대해 말하는 리터럴 텍스트로되어 있는지 여부는 알 수 없습니다. – SLaks

+0

멋진 정규식, 아마도 답변에 추가하고 싶습니까? 나는 그걸로 어딘가에 갈 수있을 것 같아. –

관련 문제