2011-02-01 22 views
7

tôi có một vấn đề mà tôi chưa bao giờ gặp phải trước đây, và tôi nghĩ nó có liên quan đến cấu hình apache, mà tôi không thành thạo.apache: umlauts thoát trong chuỗi truy vấn (URL) dẫn đến 403

trước tiên, có một tập lệnh php có dạng tìm kiếm. biểu mẫu được truyền qua POST.

sau đó có danh sách kết quả của lần truy cập tìm kiếm. tại đây truy vấn tìm kiếm ban đầu được chuyển như một phần của url, ví dụ: search.php? id = 1234 & truy vấn = foo. điều này cũng hoạt động - miễn là không có các ký tự âm sắc (äöüÄÖÜß ...) được truyền đi.

càng sớm càng tôi bao gồm umlauts trong truy vấn tìm kiếm, phần đầu tiên mà truyền các chuỗi truy vấn như POST hoạt động, nhưng đi qua nó (urlencoded) trong URL dẫn đến 403.

vậy:

  • search.php?id=1234&query=bar làm việc
  • search.php?id=1234&query=b%E4r dẫn đến 403 (% E4 = "ä" utf-8 urlencoded)
  • search.php?id=1234&query=b%C3%A4r dẫn đến 403 (% C3% A4 = "ä" utf-8 urlencoded)
  • gửi umla thông qua các công việc POST

tôi đã chuyển đổi ứng dụng từ iso-8859-1 thành utf-8, nhưng điều đó không có sự khác biệt.

tôi cũng đã thử nghiệm trên máy cục bộ của tôi, tại đây nó hoạt động hoàn hảo - như mong đợi.

từ xa thiết lập máy chủ (nơi nó không hoạt động):

Apache/2.2.12 (Ubuntu),
PHP Version 5.2.10-2ubuntu6.7, Suhosin patch 0.9.7, qua CGI/FastCGI

thiết lập địa phương (ở đây các công trình tương tự):

Apache/2.2.8 (Win32) PHP/5.3.5
PHP Version 5 .3.5 qua mod_php

hiện có ai biết tại sao apache/php-cgi từ xa không chấp nhận đúng umlauts được mã hóa url trong url không?

thông tin bổ sung: tôi cũng đã cố gắng tạo tệp tĩnh có âm sắc trong tên của nó và cả hai số /t%C3%A4st.php/täst.php được phân phát không có vấn đề. täst.php?foo=täst không thành công.

lưu ý: ?foo=%28, nơi% 28 là "(", cũng làm việc

+0

pedantic, tôi biết, nhưng "ß" không có umlauts ... – Stephen

+0

xin lỗi :) làm thế nào là superset này của loại ký tự đặc biệt được gọi là? – stefs

+2

bạn có mô-đun nào giống như mod_security với một số quy tắc bị hỏng không? điều này cũng xảy ra với bất kỳ nhân vật nào không phải ascii như àéù? – arnaud576875

Trả lời

1

Apache không thoát đó, trình duyệt không

Bạn cần phải sử dụng urlencodeurldecode để tránh các vấn đề với điều đó..

Một số trình duyệt, như Netscape cũ, chỉ gửi url như được viết, với các ký tự 8 bit trong đó.Những người khác, đáng chú ý là MSIE, mã hóa url là UTF-8 trước khi gửi nó tới máy chủ web, do đó ký tự 8 bit xuất hiện dưới dạng hai ký tự, trong đó ký tự đầu tiên có bộ bit thứ 8. Không có chỉ định nào, trong tiêu đề yêu cầu hoặc ở nơi khác, rằng url được mã hóa bằng UTF-8.

+0

Tôi biết điều đó. nhưng tôi nghi ngờ một số cấu hình apache/mis-cấu hình bảo mật mod để chặn yêu cầu nếu có một số ký tự trong url. – stefs

+0

Các vấn đề khác là urldecode là nghĩa vụ phải được thực hiện automaticly trong php vì vậy điều này không nên gây ra một vấn đề, làm thế nào bao giờ nếu bạn đang được servered với 403 đã apache, nếu nó đã vào php và sai lầm lỗi sẽ là 500, 403 nói rằng apache là không tải các tập tin như với nhận được chuỗi này đã được một quy tắc được thiết lập trên máy chủ apache –

Các vấn đề liên quan