문제

쿼리 문자열을 추가 할 때 항상 후행 슬래시를 건너 뛰는 것이 안전합니까?

즉, 내가 사용할 수 있습니까?

http://example.com?querystring

대신에:

http://example.com/?querystring

? 내가 사용한 모든 웹 호스트는 이것을 지원하지만 모든 서버 환경 이이 방법을 지원할 것이라고 가정하는 것이 안전합니까? 표준입니까?

도움이 되었습니까?

해결책

아니요. 슬래시를 건너 뛰는 것이 맞지 않습니다. 그것 5월 현대식 브라우저 작업 : 그러나 이것이 올바르게 만들지는 않습니다.

보다 RFC1738 -URL 그리고RFC2396 -URI.

RFC1738 당 형식 (여기서는 스키마 형식을 제외했습니다) :

//u003Cuser> :u003Cpassword> @u003Chost> :u003Cport> /u003Curl-path>

그리고 계속해서 주목해야합니다.

... 호스트 (또는 포트)와 URL 경로 사이의 "/"는 URL-Path의 일부가 아닙니다.

이 경우 "?" URL 경로의 일부입니다

... 해석되는 방식과 마찬가지로 사용되는 체계에 따라 다릅니다.

또한 사양에 따라 완벽하게 유효합니다. 생략 "/url-path"-이 경우 "/"가 명시 적으로 포함되어 있습니다.

따라서 URL-PATH 이전에는 "/"가 없기 때문에 "feh.com?"는 유효하지 않습니다.

다른 팁

현대적인 사양의 문제로 , 슬래시를 건너 뛰는 것이 허용됩니다, 무엇과 반대로 받아 들여진 답변 여기에 주장합니다.

허용 된 답변은 RFC 1738 (20 년 전에 발표)을 올바르게 인용하지만 RFC 2396 (1998 년 출시)이 슬래시를 요구한다고 잘못 주장하고 둘 다 이러한 사양 중에는 차례로 쓸모 없게되었습니다 RFC 3986, 2005 년에 출시되었고 (수용된 답변이 작성되기 몇 년 전) 최근에 Whatwg URL 표준, 둘 다 슬래시를 생략 할 수 있습니다.

이 각 사양을 가장 빠른 최신에서 최신 사양으로 고려해 봅시다.


RFC 1738 : 균일 자원 로케이터 (URL) (1994 년 출시)

암시 적으로 슬래시가 포함되어야합니다 그것을 지정합니다 5월 생략하십시오 만약에 URL에는 경로 나 쿼리 문자열이 없습니다. (A라고합니다 searchpart, 여기). 아래의 대담은 내 것입니다.

HTTP URL이 양식을 취합니다.

http://<host>:<port>/<path>?<searchpart>

어디 <host> 그리고 <port> 설명 된대로 섹션 3.1. 만약에 :<port>포트 기본값은 80으로 생략됩니다. 사용자 이름이나 비밀번호는 허용되지 않습니다. <path> HTTP 선택기입니다 <searchpart> 쿼리 문자열입니다. 그만큼 <path> 선택 사항과 마찬가지로 <searchpart> 그리고 그 이전 "?". 둘 다 <path> ...도 아니다 <searchpart> 존재하면 "/"도 생략 될 수 있습니다.


RFC 2396 : 균일 자원 식별자 (URI) : 일반 구문 (1998 년 출시; "업데이트"RFC 1738)

여기서 슬래시를 생략하는 것이 허용됩니다. 이 RFC는 계획 후 이중 슬래시가없는 이상한 URL 구문을 합법화하지만, 우리가 무시한다면 (그들은 opaque_part 사양에서 BNF) 그리고 호스트가 포함 된 URL을 고수하면 absoluteURI 이렇게 정의됩니다 ...

absoluteURI   = scheme ":" ( hier_part | opaque_part )

그리고 그게 a hier_part 이렇게 보인다 :

hier_part     = ( net_path | abs_path ) [ "?" query ]

그리고 그게 a net_path 이렇게 보인다 :

net_path      = "//" authority [ abs_path ]

어디에 abs_path 슬래시로 시작하도록 정의되었습니다. 주목하십시오 abs_path ~이다 선택 과목 위의 문법에서 - 양식의 URL을 의미합니다. scheme://authority?query 완전히 합법적입니다.

이 변화에 대한 동기는 부록에서 암시됩니다. G.2. RFC 1738 및 RFC 1808의 수정:

질문 마크 "?" 테스트에 따르면 많은 응용 프로그램이 쿼리 구성 요소를 다른 URI에서 분리하기 위해 예약 된 것으로 취급하는 것으로 나타 났기 때문에 문자가 권한 구성 요소에서 허용 된 문자 세트에서 제거되었습니다.

다시 말해서 - 실제 세계의 코드는 URL의 첫 번째 물음표가 어디에서나 쿼리 문자열의 시작을 표시했다고 가정했으며, 따라서 사양은 현실과 정렬되도록 실용적으로 업데이트되었습니다.


RFC 3986 : 균일 자원 식별자 (URI) : 일반 구문 (2005 년 출시; "Obsoletes"RFC 2396)

다시, 슬래시를 생략하는 것은 허용됩니다. 사양은 당국 (호스트)을 포함하는 모든 URI에서 "경로"가 필요하다고 말함으로써이를 표현하며, 그 경로는 어느 하나 슬래시로 시작하십시오 또는 캐릭터가 없습니다.

3. 구문 구성 요소

일반 URI 구문은 체계, 권위, 경로, 쿼리 및 조각이라고하는 계층 적 구성 요소로 구성됩니다.

URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]

hier-part   = "//" authority path-abempty
            / path-absolute
            / path-rootless
            / path-empty

경로가 비어있을 수 있지만 (문자는 없음) 체계 및 경로 구성 요소가 필요합니다. 권위가 있으면 경로는 비어 있거나 슬래시 ( "/") 문자로 시작해야합니다.

완전성을 위해서는 주목하십시오 path-abempty 나중에 다음과 같이 정의됩니다.

path-abempty  = *( "/" segment )

이것은 실제로 캐릭터가 포함되어 있지 않습니다.


URL 표준 Whatwg (RFC 3986을 쓸모없는 목표로 2012 년에 처음 만들어진 활성 유지 보수에 따른 생활 표준)

다시 말하지만, 슬래시를 생략하는 것은 허용되지만, 이번에는 BNF를 볼 것이 없지만 대신 많은 산문을 읽어야합니다.

섹션 4.3 우리에게 말해:

an 절대 url 문자열 다음 중 하나 여야합니다

선택적으로 "?" 및 URL- 쿼리 문자열.

HTTP와 HTTP이기 때문에 특별한 계획, 모든 HTTP 또는 HTTPS URL 은이 세 가지 옵션 중 첫 번째를 충족해야합니다. http: 또는 https: 그 뒤에 체계-관계-관련-url 문자열, 어느:

해야한다 "//", 그 뒤에 유효한 호스트 문자열, 선택적으로 ":"그리고 a URL- 포트 문자열, 선택적으로 다음 뒤에 Path-Absolute-url 문자열.

Path-Absolute-url 문자열 슬래시로 시작하도록 정의되지만 위의 절대 url 문자열의 정의에서 명시 적으로 선택 사항입니다. 따라서 호스트에서 직접 가면 "?"그리고 쿼리 문자열, 그래서 URL은 좋아합니다 http://example.com?query 합법적입니다.


물론,이 중 어느 것도 모든 웹 서버 또는 HTTP 라이브러리가 그러한 URL을 수락하거나 슬래시가 포함 된 URL과 동등한 것으로 취급 할 것이라는 주철 보증을 제공하지 않습니다. 그러나 그대로 투기 슬래시를 건너 뛰는 것은 완전히 합법적입니다.

그것은이다 ~ 아니다 그것을 가정하기에 안전합니다. 웹 서버 및 자체 포함 웹 애플리케이션은 일반적으로 요청에 제공된 URL을 검사하지만 처리 할 것이라는 보장은 없습니다. /abc 동일 /abc/. 웹 서버 및 자체 포함 웹 애플리케이션이 수행 할 수 있습니다 그들이 좋아하는 것 정보가 URL에서 수집되면 반드시 기대하는 것은 아닙니다. 해당 특정 URL에 대한 협약이 무엇인지 알아 내야합니다.

물론 대부분의 웹 서버 및 웹 응용 프로그램 프레임 워크는 모든 종류의 입력을 수락하고 적절하게 처리하려고 노력합니다. 따라서 대부분의 경우 웹 서버 또는 독립적 인 웹 응용 프로그램이 처리합니다. /abc 동일 /abc/. 그러나 서버는 경로에서 좋아하는 모든 것을 수행 할 수 있기 때문에 이것은 잠재적으로 많은 예외를 가진 일반적인 관찰 일뿐입니다.

이 문제를 연구 한 후 찾은 몇 가지 정보와 함께 허용 답변에 추가 :

http://tools.ietf.org/html/rfc2396

권한 구성 요소에는 이중 슬래시 "//"가 앞서 있으며 다음 슬래시 "/", Question-Mark "?"또는 URI의 끝에 의해 종료됩니다. 권한 구성 요소 내에서 문자 ";", ":", "@", "?"및 "/"는 예약되어 있습니다.

이 진술에 근거하여, 질문 표시는 슬래시 유무에 관계없이 권한 구성 요소의 끝을 나타냅니다.

http://tools.ietf.org/html/rfc1738 (태그 교체)

{path}는 {searchPart}와 그 앞의 "?"와 마찬가지로 선택 사항입니다. {path} 또는 {searchPart}가 존재하지 않으면 "/"도 생략 될 수 있습니다.

그러나이 진술에 따르면 경로와 SearchPart가 모두 사전 설정되지 않은 경우에만 후행 슬래시를 생략 할 수 있습니다.

실제 세계에서는 이전에 쿼리 값 전에 후행 슬래시를 생략 할 수 있었지만 최근에는 상황이 떨어지는 상황을 발견했습니다. 이와 같은 쿼리가있는 경우 http://my.domain.com?do=something, 인터넷 익스플로러에서 HTML 페이지를보고 링크는 다음과 같습니다. 결정된 즉, 즉. 그런 다음 파일을 클릭하면 이메일로 페이지를 보내면 링크가 유효하지 않은 형식으로 이메일에 추가됩니다. 문제는 쿼리 값의 내용에 따라 다르지만 유효하지 않은 URL을 만들 수있었습니다.

요약하면 ~해야 한다 일을하지만 가장자리에 빠지게됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top