Я хочу интегрировать ReCAPTCHA в мое веб-приложение GAE Golang. Чтобы проверить капчу, мне нужно получить IP-адрес пользователя. Как я могу получить IP-адрес пользователя из сообщения формы?Google App Engine Golang - как получить IP-адрес пользователя?
ответ
внутри функции обработчика позвонить r.RemoteAddr получить IP: порт
так:
func renderIndexPage(w http.ResponseWriter, r *http.Request) {
ip := strings.Split(r.RemoteAddr,":")[0]
}
обновление 02/15/2017 , как @Aigars Matulis указал, в текущей версии есть уже функция TODO это
ip, _, _ := net.SplitHostPort(r.RemoteAddr)
Использование net.SplitHostPort:
ip, _, _ := net.SplitHostPort(r.RemoteAddr)
http://golang.org/pkg/net/#SplitHostPort – Xeoncross
Не забудьте «импортировать» сеть »' – styler1972
+1, отличный ответ. Лучше повторно использовать код, чем разбить вручную. –
Ответы выше пренебрегают проверкой того, пересылается ли IP-адрес пользователя прокси-сервером. Во многих случаях IP-адрес, который вы найдете в RemoteAddr, является IP-адресом прокси-сервера, который перенаправляет вам запрос пользователя, а не IP-адрес пользователя!
Более точное решение будет выглядеть следующим образом:
package main
import (
"net"
"net/http"
)
func GetIP(r *http.Request) string {
if ipProxy := r.Header.Get("X-FORWARDED-FOR"); len(ipProxy) > 0 {
return ipProxy
}
ip, _, _ := net.SplitHostPort(r.RemoteAddr)
return ip
}
Этот ответ предполагает, что X-Forwarded-For может быть списком: http://stackoverflow.com/a/27235620/214070 – bugloaf
@orcaman это действительно так, если запрос передается через несколько прокси, например, в Elastic Load Balancer в AWS, контент будет списком IP-адресов. самый левый ip должен быть IP-адресом клиента. Дополнительную информацию вы можете найти здесь http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/x-forwarded-headers.html#x-forwarded-for –
При регистрации IP-адреса. Обязательно зарегистрируйте как RemoteAddr, так и X-Forwarded-For. Причина? Хакер всегда может установить заголовок X-Forwarded-For ;-). С другой стороны. Хакер, скорее всего, будет использовать TOR или другой способ скрыть свой IP-адрес. –
Это работает для меня. Я бегу идти в 8081 и сделал запрос от порта 8080.
fmt.Printf("r: %+v\n", r) // Print all fields that you get in request
Выход:
г: & {Метод: POST URL:/электронная почта Proto: HTTP/1.1 ProtoMajor: 1 ProtoMinor: 1 Header: map [User-Agent: [Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/602.2.11 (KHTML, например, Gecko) Версия/10.0.1 Safari/602.2.11] Accept-Language: [en- us] Accept-Encoding: [gzip, deflate] Connection: [keep-alive] Accept: [/] Referer: [http://127.0.0.1:8080/] Content-Length: [9] Content-Type: [application/x-www-form-urlencoded ; charset = UTF-8] Происхождение: [http://127.0.0.1:8080]] Тело: 0xc420012800 ContentLength: 9 TransferEncoding: [] Закрыть: false Хост: 127.0.0.1: 8081 Форма: map [] PostForm: map [] MultipartForm: Трейлер: map [] RemoteAddr: 127.0 .0.1: 62232 RequestURI:/email TLS: Отмена: ответ: ctx: 0xc420017860}
Референт и источник имеют мой IP-адрес клиента.
ip := r.Referer() // Get Referer value
fmt.Println(ip) // print ip
Выход:
+1 Для полноты, я был вопрос, как я использовал Localhost в моей ссылке. см. обсуждение здесь. https://groups.google.com/forum/#!topic/golang-nuts/rqo1--qR-8Y – bsr
yes localhost всегда особенный, и я предполагаю, что вы используете mac, который разрешает ipv6, что вызывает проблемы с localhost и ip начиная с лет –
Добавьте конец, что сработало для меня, было просто использовать «r.RemoteAddr». –