Изображение://wp-content/uploads/2014/01/google-Bot.png[Google-Bot, ширина = 240, высота = 240]
Если веб-запрос поступает от сканера Google или бота Google, запрашиваемый «пользовательский агент» должен выглядеть примерно так:
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) or (rarely used): Googlebot/2.1 (+http://www.google.com/bot.html)
Источник: Google crawlers
1. Пример Java
В Java вы можете получить «пользовательский агент» из
HttpServletRequest
.
Пример: служба, размещенная на сайте abcdefg.com
@Autowired private HttpServletRequest request; //... String userAgent = request.getHeader("user-agent"); System.out.println("User Agent : " + userAgent); if(!StringUtils.isEmpty(userAgent)){ if(userAgent.toLowerCase().contains("googlebot")){ System.out.println("This is Google bot"); }else{ System.out.println("Not from Google"); } }
2. Ложный пользовательский агент
Легко создать фальшивый/поддельный запрос пользовательского агента. Например :
Пример: отправка ложного запроса пользовательского агента на abcdefg.com
package com.mkyong.web; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.HttpClientBuilder; public class test { public static void main(String[]args) throws Exception { HttpClient client = HttpClientBuilder.create().build(); HttpGet request = new HttpGet("abcdefg.com"); request.setHeader("user-agent", "fake googlebot"); HttpResponse response = client.execute(request); } }
Вывод на abcdefg.com.
User Agent : fake googlebot This is Google bot
3. Проверка Googlebot
Чтобы проверить реальный робот Google, вы можете использовать «обратный поиск DNS» вручную, например, так:
> host 66.249.66.1 1.66.249.66.in-addr.arpa domain name pointer crawl-66-249-66-1.googlebot.com. > host crawl-66-249-66-1.googlebot.com crawl-66-249-66-1.googlebot.com has address 66.249.66.1
Источник: Verifying Googlebot
4. Проверка Googlebot - пример Java
Основываясь на приведенной выше теории, мы можем смоделировать первую часть «обратного просмотра DNS». Используйте команду
host
, чтобы определить, куда указывает запрошенный IP-адрес.
Если запрос исходит от Googlebot, он будет отображать этот шаблон:
xx ** .googlebot.com
.
Команда
P.S
host
доступна только в ** nix system.
Пример: обнаружение поддельного пользовательского агента
@Autowired private HttpServletRequest request; //... String requestIp = getRequestIp(); String userAgent = request.getHeader("user-agent"); System.out.println("User Agent : " + userAgent); if(!StringUtils.isEmpty(userAgent)){ if(userAgent.toLowerCase().contains("googlebot")){ //check fake user agent String output = executeCommand("host " + requestIp); System.out.println("Output : " + output); if(output.toLowerCase().contains("googlebot.com")){ System.out.println("This is Google bot"); }else{ System.out.println("This is fake user agent"); } }else{ System.out.println("Not from Google"); } } //get requested IP private String getRequestIp() { String ipAddress = request.getHeader("X-FORWARDED-FOR"); if (ipAddress == null) { ipAddress = request.getRemoteAddr(); } return ipAddress; } //execute external command private String executeCommand(String command) { StringBuffer output = new StringBuffer(); Process p; try { p = Runtime.getRuntime().exec(command); p.waitFor(); BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); String line = ""; while ((line = reader.readLine())!= null) { output.append(line + "\n"); } } catch (Exception e) { e.printStackTrace(); } return output.toString(); }
Попробуйте еще раз подделать пример «агента 2». Теперь вы получите этот вывод:
Output : Host 142.1.168.192.in-addr.arpa. not found: 3(NXDOMAIN)//this output may vary. User Agent : fake googlebot This is fake user agent
-
Примечание ** . Это простое решение может не на 100% остановить фальшивого/поддельного пользовательского агента, но этот дополнительный уровень безопасности должен быть в состоянии остановить большинство атак спуфинга основного пользовательского агента.
Если у вас есть лучшее решение, поделитесь ниже, спасибо.
Рекомендации
, https://support.google.com/webmasters/answer/80553 [Verifying
Googlebot], https://support.google.com/webmasters/answer/1061943 [Google
Искатели/а>], ссылка://java/как-выполнить-shell-command-from-java/[выполнить оболочку
команда из Java]
ссылка://тег/googlebot/[googlebot]ссылка://тег/user-agent/[пользовательский агент]