2012-04-17 5 views
0

현재 사용자는 원하는대로 파일을 업로드 할 수 있습니다. 따라서 업로드 된 파일에는 공백 문자 (ß, ü 등등)가 있습니다. 다른 사용자는 URL에서 공백을 포함하여 이러한 파일을 다운로드 할 수 있습니다. 이 방법으로 작동하지만 RFC1738 - Uniform Resource Locators (URL)에 따라 [a-zA-Z0-9] 영숫자 문자와 일부 특수/예약 문자 만 사용할 수 있습니다. 빈 공간도 피해야합니다.사용자 업로드/다운로드 파일 이름에 허용되는 문자

현재 서버의 파일 이름에 ßß이 표시됩니다. 파일을 다운로드하려는 사용자는 MySQL 데이터베이스 (utf8_unicode_ci)에서 표시된 올바른 문자 (ß)를 가져 오므로 서버에서 파일을 찾을 수 있습니다.

  • 파일 이름을 처리하는 올바른 방법은 무엇입니까?
  • 파일 이름을 확인하고 업로드를 허용해야합니까?
  • 사용자 업로드 후 서버의 파일 이름을 변경해야합니까 (예 : str_replace(), urlencode(), ...)?

답변

1

웹 서버가 파일 다운로드를 처리하는 동안 파일 시스템의 인코딩에 대해 알고 있는지 확인하고 파일 시스템이 업로드 파일 이름에 사용하는 charset과 호환되는지 확인하십시오. 핸들.

모든 것이 여기에 호환되는 한 (UTF-8을 사용하는 것처럼 보입니다) 아무런 문제가 발생하지 않습니다. 인코딩이 파일 시스템, 웹 서버, 데이터베이스 서버, 데이터베이스 클라이언트 연결, 브라우저, 업로드 POST 요청, 파일 링크 제공 HTTP HTML 응답 등을 사용하는 모든 장소에서 올바르게 설정되어 있는지 확인하십시오.

당신이 Content-Disposition 헤더 PHP로 파일을 제공하려는 경우에만 파일 이름 내에서 followinig 문자를 허용해야한다 : 해당 헤더가 미국 이외의 자에 대한 작업 사양이 없기 때문이다

a-z, A-Z, 0-9, _, - , . 

-ASCII 인쇄 가능 범위.

일반적으로 파일을 업로드하면 파일 이름이 정상화됩니다. 업로드 시점에서 유효성 검사/위생 처리를하는 것도 현명한 방법입니다.

+0

"파일 시스템의 인코딩과 파일 시스템이 업로드 파일 이름에 사용하는 charset과 호환되는지"를 어떻게 알 수 있습니까? 예, UTF-8을 사용해야합니다. 웹 서버는 아파치이고, 데이터베이스 서버는 MySQL 5.0.77이고, 연결은'SET NAMES utf8'으로 설정되고, 브라우저는 누구나 될 수 있고, 업로드는'POST '와'multipart/form-data'를 통해 이루어지며, HTML의 인코딩은'UTF-8 '. Firebug에서 file-link-offering HTTP HTML 응답은'Content-Type \t application/x-www-form-urlencoded'을 가지고 있지만, 나는 무엇인가하지 않았다 (디폴트?). – testing

+0

그래서'Content-Disposition'은 내가 원하는 것이 아닐 것이다. 파일 이름은 어떻게 정상화되고 유효성이 검사됩니까? – testing

+0

@testing : 문자열 처리를 통해 직접 처리 할 수 ​​있습니다. – hakre

1

파일 이름을 처리하는 올바른 방법은 무엇입니까?

이미 처리하고 있습니다. rawurlencode에 파일 이름을 랩핑 한 다음 URL 매개 변수에 넣어서 규격을 준수해야합니다.

파일 이름을 확인하고 업로드를 허용해야합니까?

아니요, 이는 사용자를 괴롭히는 역할을합니다.

사용자 업로드 후 서버의 파일 이름을 변경해야합니까?

이것은 좋은 생각 일 수 있습니다. 원하는 기술로 "임의"이름을 생성하고 데이터베이스에 "원래"이름을 저장할 수 있습니다. 사용자가 파일을 다운로드하고자 할 때마다 Content-Disposition HTTP 헤더를 통해 파일을 업로드하는 데 사용한 이름으로 파일을 다시 제공하십시오.

이렇게하는 것의 장점은 각 사용자의 파일 시스템과 서버의 파일 시스템 사이의 미묘한 차이로 인해 피해를 입히지 않아 파일 이름 문제가 중복되지 않는다는 점입니다.

+0

"당신은 이미 그것들을 다루고 있습니다"라는 말은 무엇을 의미합니까? 나는 그들을 다른 위치로 옮기고 원래 파일 이름을 데이터베이스에 저장한다. 콘텐츠 처리가 모든 브라우저에서 작동합니까? 사용자에게만 영숫자 문자를 사용해야한다고 통보해야합니까? 임의의 이름 생성에는 SEO에 대한 단점이 있습니까? 현재의 상황이 언제 문제가 될 수 있습니까 (작동하지만 그 이유는 무엇입니까?)? – testing

관련 문제