Как обнаружить де-прокси, используемый в пакете

В FireFox подключение к интернету производится через файл автоконфигурации прокси-сервера "thing.pac"

Как узнать для определенного URL-адреса, какой прокси-сервер используется?

Благодарю.

2 ответа

Решение

Файл.pac - это всего лишь сценарий emca - он же JavaScript. Проверьте статью в Википедии о формате файла.

Если вы копируете код PAC, вы можете обработать его, чтобы увидеть, какой прокси-сервер используется на основе целевого URL. Если вам нравится, вы можете поместить скрипт в веб-страницу (локально), чтобы создать инструмент для локальной оценки.

Редактировать:

В качестве альтернативы методу, который я начал рекомендовать, вы можете проверить PACTester, доступный в Google Code. Это позволит вам быстро протестировать целый ряд вариантов.

Если у вас есть доступный.Net и вы хотите поиграть с C#, вы можете проверить эту статью на MSDN, в которой есть код, который вы можете использовать аналогично описанному выше.

Чтобы расширить исходный метод, описанный выше, существует ряд функций, которые могут (и обычно) предоставляются браузером хоста. Основная функция, которая должна быть реализована в pac файл FindProxyForUrl(), Это принимает два параметра: URL-адрес и хост (хост, полученный из имени URL-адреса). "Предоставляемые" функции включают в себя: isInNet(), localHostOrDomainIs(), isPlainHostName(), isResolvable(), так далее.

Если вы работаете в среде Microsoft, вы можете проверить эту страницу в Technet, которая описывает формат.pac с некоторыми полезными примерами.

Согласно документации Microsoft для isInNet():

isInNet(host, pattern, mask) функция возвращает TRUE если IP-адрес хоста соответствует указанному pattern, mask указывает, какая часть IP-адреса соответствует (255= совпадение, 0= игнорирование).

Если вы хотите получить техническую информацию, вот исходный код Mozilla для реализации сервисов, связанных с автоматической настройкой прокси. Он определяет код JS для isInNet() как:

200 function isInNet(ipaddr, pattern, maskstr) {
201     var test = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/(ipaddr);
202     if (test == null) {
203         ipaddr = dnsResolve(ipaddr);
204         if (ipaddr == null)
205             return false;
206     } else if (test[1] > 255 || test[2] > 255 ||
207                test[3] > 255 || test[4] > 255) {
208         return false;    // not an IP address
209     }
210     var host = convert_addr(ipaddr);
211     var pat  = convert_addr(pattern);
212     var mask = convert_addr(maskstr);
213     return ((host & mask) == (pat & mask));
214     
215 }

Надеюсь, это поможет!

Я создал простой прокси разрешающий HTML-страницы:

<html>
<head>
    <script type="text/javascript">
    function myIpAddress() {
        return "192.168.1.2"; // Your IP
    }

    function isInNet(ipaddr, pattern, maskstr) {
        var test = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/(ipaddr);
        if (test == null) {
            ipaddr = dnsResolve(ipaddr);
            if (ipaddr == null) return false;
        } else if (test[1] > 255 || test[2] > 255 || test[3] > 255 || test[4] > 255) {
            return false;    // not an IP address
        }
        var host = convert_addr(ipaddr);
        var pat  = convert_addr(pattern);
        var mask = convert_addr(maskstr);
        return ((host & mask) == (pat & mask));
    }

    function dnsResolve(host) {
        try {
            return dns.resolve(host, 0).getNextAddrAsString();
        } catch (e) {
            return null;
        }
    }

    function convert_addr(ipchars) {
        var bytes = ipchars.split('.');
        var result = ((bytes[0] & 0xff) << 24) |
                     ((bytes[1] & 0xff) << 16) |
                     ((bytes[2] & 0xff) <<  8) |
                      (bytes[3] & 0xff);
        return result;
    }

    function isPlainHostName(host) {
        return host.search('\\\\.') == -1;
    }

    function shExpMatch(url, pattern) {
       pattern = pattern.replace(/\\./g, '\\\\.');
       pattern = pattern.replace(/\\*/g, '.*');
       pattern = pattern.replace(/\\?/g, '.');
       var newRe = new RegExp('^' + pattern + '$');
       return newRe.test(url);
    }

    function dnsDomainIs(host, domain) {
        return host.length >= domain.length && host.substring(host.length - domain.length) == domain;
    }
    </script>

    <!-- Your proxy script -->
    <script type="text/javascript" src="webproxy.js"></script>
</head>
<body>
    Host: <input id="host"/><br/>
    URL: <input id="url"/><br/>
    Proxy: <input id="proxy" disabled="disabled"/><br/>
    <input type="button" value="Resolve"
           onclick="document.getElementById('proxy').value = FindProxyForURL(document.getElementById('host').value, document.getElementById('url').value)"/><br/>
</body>
</html>

Код для myIpAddress и т. Д. Я получил из источников Mozilla.

Другие вопросы по тегам