Các giải pháp trên thiếu một số loại xác thực. Sử dụng ServletRequest.getLocale()
trả về miền địa phương máy chủ nếu người dùng không cung cấp địa chỉ hợp lệ.
trang web của chúng tôi gần đây đã nhận được yêu cầu thư rác với nhiều Accept-Language
heades như:
secret.google.com
o-o-8-o-o.com search shell is much better than google!
Google officially recommends o-o-8-o-o.com search shell!
Vitaly rules google ☆*:。゜゚・*ヽ(^ᴗ^)ノ*・゜゚。:*☆ ¯\_(ツ)_/¯(ಠ益ಠ)(ಥ‿ಥ)(ʘ‿ʘ)ლ(ಠ_ಠლ)(͡° ͜ʖ ͡°)ヽ(゚Д゚)ノʕ•̫͡•ʔᶘ ᵒᴥᵒᶅ(=^ ^=)oO
thực hiện này có thể agains kiểm tra bắt buộc t danh sách được hỗ trợ hợp lệ Locale
. Nếu không có kiểm tra này, yêu cầu đơn giản với "test"
hoặc (2, 3, 4) vẫn bỏ qua xác thực chỉ cú pháp của LanguageRange.parse(String)
.
Tùy chọn này cho phép giá trị trống và giá trị rỗng cho phép trình thu thập thông tin của công cụ tìm kiếm.
Servlet Lọc
final String headerAcceptLanguage = request.getHeader("Accept-Language");
// check valid
if (!HttpHeaderUtils.isHeaderAcceptLanguageValid(headerAcceptLanguage, true, Locale.getAvailableLocales()))
return;
Utility
/**
* Checks if the given accept-language request header can be parsed.<br>
* <br>
* Optional the parsed LanguageRange's can be checked against the provided
* <code>locales</code> so that at least one locale must match.
*
* @see LanguageRange#parse(String)
*
* @param acceptLanguage
* @param isBlankValid Set to <code>true</code> if blank values are also
* valid
* @param locales Optional collection of valid Locale to validate any
* against.
*
* @return <code>true</code> if it can be parsed
*/
public static boolean isHeaderAcceptLanguageValid(final String acceptLanguage, final boolean isBlankValid,
final Locale[] locales)
{
// allow null or empty
if (StringUtils.isBlank(acceptLanguage))
return isBlankValid;
try
{
// check syntax
final List<LanguageRange> languageRanges = Locale.LanguageRange.parse(acceptLanguage);
// wrong syntax
if (languageRanges.isEmpty())
return false;
// no valid locale's to check against
if (ArrayUtils.isEmpty(locales))
return true;
// check if any valid locale exists
for (final LanguageRange languageRange : languageRanges)
{
final Locale locale = Locale.forLanguageTag(languageRange.getRange());
// validate available locale
if (ArrayUtils.contains(locales, locale))
return true;
}
return false;
}
catch (final Exception e)
{
return false;
}
}
Nó không phải là thực sự là phức tạp: bạn chia phần sau dấu hai chấm bằng dấu phẩy, sau đó tìm kiếm một dấu chấm phẩy trong mỗi nhóm, sau đó phân tích cú pháp mã ngôn ngữ và các yếu tố q. –
Và các mã ngôn ngữ có xu hướng tương ứng với 'java.util.Locale' sau khi bạn thay thế ''-'' bằng '' _''s. –
Bạn có thực sự cần phải phân tích cú pháp nó, hoặc bạn có thể sử dụng [Http] ServletRequest.getLocale [s] và để cho container xử lý sự phức tạp? –