Можно ли программно определить, какой IP-адрес cURL используется при подключении к удаленному серверу? У меня есть общий сервер, на котором я использую cURL, и мне нужно отправить IP-адрес как часть запроса.
Для сервера, на котором я разговариваю, требуется строка аутентификации, которая объединяет IP-адрес соединения и вращающийся код доступа (например, my $ code = SHA1 ($ _ SERVER ['SERVER_ADDR']. $ Passcode) сравнивается по завершении с SHA1 ($ _ SERVER ['REMOTE_ADDR']. $ Passcode)). Это отлично работало, когда исходящее соединение cURL использовало тот же IP-адрес, который хранится в $ _SERVER ['SERVER_ADDR'], однако IP-адрес, используемый cURL, теперь отличается и периодически вращается.
Вы можете сделать это, чтобы получить свой публичный IP-адрес, прежде чем звонить:
$ch = curl_init('http://whatismyip.org/'); curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE); $myIp = curl_exec($ch);
Однако:
whatismyip.org
(или аналогичная служба). Вы можете принудительно использовать IP, который использует curl, в отличие от его обнаружения.
Используйте параметр CURLOPT_INTERFACE
для curl_setopt()
– установите его на IP-адрес, который вы хотите использовать.
Если вы используете сервер, такой как облачный сервер, с пулом IP, то рекомендуется выбрать интерфейс для использования, если важно обнаружить это с другой стороны по соображениям безопасности.
Лично мне пришлось использовать эту функцию для передачи данных по платежным картам через cURL, когда IP-адрес ограничен.
Существует веб-сайт, который называется whatismyip.com. У них есть общедоступный API, который вы можете использовать до тех пор, пока вы не превысите их лимит (что-то вроде пяти запросов в час?). Не помешает сделать это выстрелом, а?
Предполагая, что завиток всегда запускается с одного и того же сервера, даже если у него несколько сетевых адаптеров, не имеет значения, скажете ли вы curl, какой IP использовать.
Я бы использовал трюк DaveRandom для получения того, какой IP-адрес вы используете в настоящий момент, а затем установите его для следующего вызова, используя
curl_setopt($ch, CURLOPT_INTERFACE, "XXX.XXX.XXX.XXX");
Предполагая, что два вызова достаточно близки, существует очень высокая вероятность того, что IP-адрес все равно будет привязан к интерфейсу, и, установив его, вы говорите, что он использует его, вместо того, который может потребоваться использовать балансировщик нагрузки.