У меня есть приложение, которое позволяет администраторам указывать допустимые IP-адреса, из которых могут быть сделаны запросы веб-сервисов. Я просто принимаю настроенные IP-адреса и сравниваю их с входящим запросом. Сравнение двух адресов IPv4 тривиально, и я думал, что сравнение двух адресов IPv6 также будет.
Однако мое сетевое незнание начало проявляться, когда я заметил, что адреса IPv6 немного сложнее. Одна из проблем, которую я заметил, заключается в том, что если я посмотрю на IP-адрес на машине (просматривал, какая консоль VMWare показывала IP-адрес) по сравнению с IP-адресом из веб-запроса (HttpContext.Current.Request.UserHostAddress
в .NET), я заметил, что один из они закончились в% 10, а другой в% 11:
- ipconfig показывает: fe80: 8179: 5576: c6d0: 8b16% 11
- UserHostAddress показывает: fe80:: 8179: 5576: c6d0: 8b16% 10
Единственное отличие - это% 10 и% 11 - что дает?
Я также видел, что адреса IPv6 заканчиваются на "/", а затем 2 цифры. Должен ли я просто игнорировать эти последние 3 цифры (если они существуют) при сравнении? Если да, то каковы действительные альтернативные окончания, которые мне нужно искать?
----------- ИЗМЕНИТЬ -------------
Вот мое решение на основе предоставленного ответа...
Я просто храню "очищенный" IP-адрес и сравниваю его с "очищенным" IP-адресом. Использование .NET здесь - это то, как я очищаю IP-адрес. Не лучшее с точки зрения производительности, но оно действительно работает. Я бы предпочел просто сравнить GetAddressBytes()
, но я использую Dictionary
, и я решил отказаться от дополнительного шага создания моего собственного ByteComparer
.
IPAddress incomingIp = null;
bool ipAddressParsePassed = IPAddress.TryParse(userHostAddress, out incomingIp);
if (ipAddressParsePassed)
{
IPAddress scrubbedIp = new IPAddress(incomingIp.GetAddressBytes());
string scrubbedIpStr = scrubbedIp.ToString()
}