2010-02-26 4 views
0

보안 관련 질문이 있습니다. 내 웹 응용 프로그램을 사용하면 사용자가 URL을 입력 할 수 있습니다. URL은 즉시 데이터베이스에 저장됩니다 (이 시점에서는 santization이 필요하지 않습니다.). 그것은 이미 매개 변수화 된 그래서 SQL Linq 사용하고 있습니다. 하이퍼 링크를 다시 사용자에게 표시 할 때 중계기를 사용하고 있습니다. 툴팁과 href 속성뿐만 아니라 하이퍼 링크 텍스트도 인코딩해야합니까? 아니면 (표시되는) 텍스트를 인코딩해야합니까? 또한, URL 인코딩이 내가 여기에 필요한 것이라고 가정하지만 HTML 인코딩을 사용해야합니까?하이퍼 링크 인코딩 - 언제, 어떻게?

텍스트가 <script> alert("hello") </script> 인 모든 세 가지 속성에서 Server.UrlEncode을 시도했는데 href와 텍스트를 엉망으로 만든 것처럼 보였습니다. 나는 이것이 완전히 확보되지 않았다는 것을 짐작하고있다?

편집 - 출력물을 인코딩하는 경우 "% 2"대신 "/"가 표시되도록하려면 어떻게해야합니까? 감사합니다.

답변

3

임의의 http (s) 링크/텍스트를 허용합니까?

텍스트 (앵커 태그의 innerHtml)는 htmlentity로 인코딩되어야합니다. href까지 :

입력시 처음에는 입력 URL이 호스트 이름과 경로에 유효한 문자 만 포함 된 http 또는 https 링크인지 최소한 확인하십시오 (RFC는 사용하지만 더 이상 제약하지 않으므로 punycode는 비 ASCII 도메인 이름에 사용되므로 문자의 화이트리스트가 짧습니다). 이렇게하면 javascript : urls, username : password @ hostname url이 피싱, ftp : //, kindle : // 및 기타 스키마에서 사용되며 url에서 사용됩니다 (IE로 /로 변환되지만 도메인을 읽는 것을 혼동시킬 수 있음) 과도한 공백 사용 www.good % 20 {N times} evil.com urls 등

매개 변수를 허용하면 대상에 영향을 주지만 개별 이름과 값을 urlencode (HTML 엔티티 엔코 드하지 않음) . 어쨌든 표적으로 보내지는 이후로 #과 그 이후의 모든 것을 제거하십시오. href는 큰 따옴표로 묶어야합니다.

해당되는 경우 사용자가 사이트를 벗어날 때 경고하는 것이 좋습니다. 참고 대상 사이트는 추천 URL로 페이지 URL을 가져옵니다. 다른 옵션은 유해하지 않은 허용 목록에있는 허용 된 도메인에 대한 링크 만 허용하는 것입니다 (책임없이 행동하지 않으면 사이트가 netcraft, google 등의 유해한 사이트로 연결되는 것으로 식별되지 않습니다).

+0

답장을 보내 주셔서 감사합니다. 링크가 사용자의 프로파일 영역에 표시됩니다. 예를 들어 프로필에 '홈페이지'라고 표시됩니다. 다른 사용자가 상대방의 프로필을 방문하면 링크를 볼 수 있습니다. 따라서 링크가 어디로 향하고 있는지 실제로 확인할 수는 없지만 링크를 실제로 방문하지 않는 사이트 사용자에게 문제가되지 않도록하려는 경우 – Skoder

1

이것이 잘못된 것입니까? 예 입력이 아닌 출력을 살균합니다.

db에 저장하기 전에 위생 처리를하면 출력 할 때 인코딩 할 필요가 없습니다. 엄지 손가락 : 모든 레이어 또는 앱에서 데이터를 신뢰하므로 일찍 청소할 수 있습니다.

+0

나는 'http : // msdn.microsoft.com/ko-us/library/bb355989.aspx'의 조언을 따르고 있었다.'데이터를 일찍 인코딩하는 실수를 피하십시오. 데이터가 클라이언트에 표시되기 전에 마지막 기회에 인코딩해야합니다. ' – Skoder

1

입력 할 때 (이스케이프와 다름) 즉시 삭제해야합니다. 즉, 데이터가 URL이거나 적어도 URL에 허용 된 문자 만 포함하는 일종의 유효성 검사를 수행해야합니다. 이 작업을 수행하려면 Regex를 사용하거나 URL 구문 분석 라이브러리 (미안하지만 .NET API에 익숙하지 않음)를 사용하십시오.

HTML 요소에서 URL로 사용하려는 경우가 아니면 출력 할 때 인코딩해야합니다. 그렇지 않으면 인코딩을해서는 안됩니다. 툴팁과 텍스트를 링크 태그 본문으로 인코딩해야합니다. 데이터베이스에 입력되기 전에 입력 내용을 어떻게 위조하는지에 관해서는 좀 더 세 심하게 생각할 것입니다. 이 fantastic resource of example XSS 공격을 검색하는 것이 좋습니다.

데이터베이스로 저장할 때가 아니라 출력시에 인코딩하는 이유는 각 출력 매체가 서로 다른 인코딩/이스케이프 규칙을 가질 수 있기 때문입니다. 예 : HTML은 자바 스크립트와 다르다. PDF, 플래시, CSS 등과는 다르다.

SQL 인젝션을 피하기 위해 데이터베이스에 저장할 때 준비된 문을 사용한다고 가정합니다.

+0

감사합니다. 내가 가지고있는 정규식을 사용하여 URL을 입력하고 있는지 확인합니다. 텍스트를 인코딩하면 '/'대신 '% 2'이됩니다. 어떻게 극복하겠습니까? 예를 들어 포럼에 게시하면 URL이 유지됩니다. 이것은 입력이 유효하다고 가정 할 때 출력에서 ​​인코딩하지 않는다는 것을 의미합니까? – Skoder

+1

URL은 이미 A 태그의 href 속성에 필요한 형식이므로 출력에서 ​​인코딩되지 않습니다. 이제 URL을 링크 텍스트로 표시하려면 인코딩 할 수 있습니다. 예 : encoded_url 희망이 더 적절합니다. – Mike

+0

감사합니다 마이크, 그 말이 맞습니다. – Skoder