Uma pequena equipe de monitoramento de preços configura um proxy residencial como proxy do sistema no Windows. Poucos dias depois, a página de consumo mostra muito mais gigabytes do que o trabalho deveria gastar. Atualizações do navegador, videochamadas e o webmail também passaram pelo proxy, embora só duas lojas concorrentes precisassem ser vistas de outro endereço IP. A equipe precisava de uma regra que dissesse "estes sites pelo proxy, todo o resto direto". Essa regra é um arquivo PAC.
Este guia explica o que é um arquivo PAC (arquivo de configuração automática de proxy, do inglês proxy auto-config), como o navegador o executa e o que FindProxyForURL pode retornar. Ele cobre as funções auxiliares e suas armadilhas, um exemplo testado que manda só os sites de destino por um proxy, o WPAD e seus riscos, por que o arquivo não pode guardar uma senha e como a mesma regra reduz o tráfego de proxy.
O que é um arquivo PAC?
Um arquivo PAC é um arquivo JavaScript em texto puro que define uma única função: FindProxyForURL(url, host). A função recebe o endereço que o navegador está prestes a abrir e retorna uma string que indica a rota. A Netscape adicionou a configuração automática de proxy ao Navigator 2.0, a mesma versão que introduziu o JavaScript.
O PAC não tem RFC nem especificação formal. Cada navegador traz a sua própria implementação, e os detalhes variam. A referência do MDN sobre arquivos PAC (em inglês) descreve o terreno comum, incluindo o tipo MIME, application/x-ns-proxy-autoconfig. O arquivo geralmente termina em .pac; quando é encontrado via WPAD, ele se chama wpad.dat.
Uma configuração manual de proxy manda todo o tráfego para um único proxy. Um arquivo PAC decide de novo a cada requisição, então o mesmo navegador pode acessar uma loja por um proxy e a wiki do escritório diretamente.
Como o navegador usa um arquivo PAC?
- Busca o arquivo. O navegador o baixa do endereço que você informou ou do endereço que o WPAD encontrou. O Chrome busca o arquivo diretamente, nunca por um proxy, e precisa de uma resposta HTTP
200em até 30 segundos, com um corpo menor que 1 MB. - Chama a função antes de cada requisição. Em endereços
https://, o Chrome remove antes o caminho e a query string, então a função vêhttps://store.example/, e não o endereço completo. O Chrome começou a fazer isso na versão 52 e, desde a versão 75, não é possível desativar. - Lê a resposta da esquerda para a direita. A string é dividida nos pontos e vírgulas. O navegador tenta a primeira entrada e só passa para a seguinte se esse proxy não puder ser alcançado.
- Deixa de lado um proxy que falhou. Ele vai para o fim da lista por um tempo. Quanto tempo depende do navegador, então não monte regras em torno de um tempo fixo.
- Recorre a uma alternativa quando o arquivo falta. Se o Chrome não consegue baixar o arquivo, ele passa para a próxima opção, geralmente uma conexão direta, sem nenhum aviso. Só um script PAC marcado como obrigatório faz as requisições falharem em vez disso. No nosso teste, um arquivo com erro de sintaxe também mandou o Chrome para a conexão direta.
As regras completas estão na documentação de suporte a proxy do Chromium (em inglês).
O que FindProxyForURL pode retornar?
A função retorna uma única string. Cada entrada é uma palavra-chave seguida, no caso dos proxies, de host:port.
| Valor retornado | O que faz | Suporte (fonte) | Atenção |
|---|---|---|---|
DIRECT | Conecta sem proxy | Palavra-chave padrão (MDN) | Como reserva em uma regra de destino, envia a requisição a partir do seu IP real |
PROXY pr.proxynet.io:8000 | Usa um proxy HTTP | Palavra-chave padrão (MDN, Chromium) | Se o proxy pedir senha, o navegador mostra uma janela de login 407 |
SOCKS5 pr.proxynet.io:1080 | Usa um proxy SOCKS5 | Chrome e Firefox (Chromium, MDN) | O Chrome não envia credenciais SOCKS5, então o proxy precisa liberar o seu IP |
HTTPS proxy.example:443 | Usa um proxy que você alcança por TLS | Chrome e Firefox (Chromium, MDN) | O proxy precisa falar TLS nessa porta |
SOCKS proxy.example:1080 | Usa um servidor SOCKS | Palavra-chave padrão (MDN) | O Chrome lê um SOCKS sozinho como SOCKS4 |
O Firefox também aceita HTTP host:port e SOCKS4 host:port, mas o parser do Chrome não conhece HTTP, então PROXY é a grafia que funciona em todos. O Chrome lê as palavras-chave em maiúsculas ou minúsculas; o MDN as escreve em maiúsculas, e nós também.
Uma cadeia como "PROXY a.example:8000; PROXY b.example:8000; DIRECT" significa: tente o primeiro proxy, depois o segundo, e conecte diretamente só se os dois estiverem fora do ar. Esse último passo serve para a navegação em geral e é errado para coleta de dados. A diferença de protocolo entre os dois tipos de proxy está em Diferença entre SOCKS e HTTP proxy.
Quais funções auxiliares um arquivo PAC pode usar?
As funções embutidas se dividem em dois grupos.
Verificações de string, rápidas e seguras: shExpMatch (padrões com * e ? no estilo do shell), dnsDomainIs, isPlainHostName (nome sem ponto), localHostOrDomainIs, dnsDomainLevels e as funções de tempo weekdayRange, dateRange e timeRange.
Funções que consultam o DNS: dnsResolve, isResolvable e isInNet quando recebe um nome de host em vez de um endereço IP. O MDN avisa que elas precisam consultar o servidor DNS e raramente são necessárias.
Verificamos três armadilhas comuns com o pacparser, que executa arquivos PAC no motor QuickJS:
dnsDomainIs(host, "shop.example")só compara o fim da string, entãoevilshop.exampletambém corresponde.dnsDomainIs(host, ".shop.example")corrige isso, mas oshop.examplesozinho deixa de corresponder. Verifique os dois:host === "shop.example" || dnsDomainIs(host, ".shop.example").shExpMatch(host, "*.panel.example")não corresponde ao própriopanel.example.
myIpAddress() pode retornar o endereço errado em uma máquina com várias interfaces de rede, então evite regras que dependam do IP da própria máquina.
Como escrever um arquivo PAC que manda só os sites de destino pelo proxy
Este é o cenário da introdução em um único arquivo. Os destinos do monitoramento de preços e os subdomínios deles passam por um Proxies residenciais. Um painel que precisa manter um único endereço passa por um proxy SOCKS5, com um proxy HTTP de reserva. Todo o resto vai direto. Troque os domínios .example pelos seus.
// proxy.pac: só os sites da lista usam proxy, todo o resto vai direto.
function FindProxyForURL(url, host) {
host = host.toLowerCase();
// 1. Nomes simples (intranet, impressora) e localhost: sempre direto.
if (isPlainHostName(host) || host === "localhost") {
return "DIRECT";
}
// 2. Endereços IP privados e de loopback: direto. A checagem com regex
// garante que isInNet só receba um endereço IP e nunca consulte o DNS.
if (/^\d{1,3}(\.\d{1,3}){3}$/.test(host) &&
(isInNet(host, "10.0.0.0", "255.0.0.0") ||
isInNet(host, "172.16.0.0", "255.240.0.0") ||
isInNet(host, "192.168.0.0", "255.255.0.0") ||
isInNet(host, "127.0.0.0", "255.0.0.0"))) {
return "DIRECT";
}
// 3. Destinos do monitoramento de preços e seus subdomínios: proxy residencial.
// Sem "; DIRECT" no fim: se o proxy cair, a requisição falha
// em vez de sair do seu próprio endereço IP.
var targets = ["shop.example", "store.example"];
for (var i = 0; i < targets.length; i++) {
if (host === targets[i] || dnsDomainIs(host, "." + targets[i])) {
return "PROXY pr.proxynet.io:8000";
}
}
// 4. Um painel que precisa manter um único IP: SOCKS5 primeiro, HTTP como reserva.
// Coloque aqui o host e as portas do seu proxy ISP estático.
if (host === "panel.example" || shExpMatch(host, "*.panel.example")) {
return "SOCKS5 pr.proxynet.io:1080; PROXY pr.proxynet.io:8000";
}
// 5. Todo o resto: direto.
return "DIRECT";
}O host é convertido para minúsculas primeiro, porque as funções auxiliares comparam strings de forma exata. O isInNet só roda depois que a regex confirmou um endereço IP, então o script nunca espera pelo DNS. O código fica em var e loops simples, porque nem todo motor PAC executa JavaScript moderno. Em um arquivo PAC, a cadeia com ponto e vírgula é o mecanismo de nova tentativa; a lógica de novas tentativas em código fica no scraper (Códigos de status HTTP no web scraping).
Como testamos
Rodamos o arquivo no pacparser 1.5.2, com Python 3.13, contra dez hosts, e cada um retornou a rota esperada, incluindo WWW.Shop.Example (proxy) e notshop.example (direto). Depois servimos o arquivo localmente com o tipo application/x-ns-proxy-autoconfig, apontamos os endpoints para dois proxies de teste locais e abrimos o Chrome 154 com --proxy-pac-url. Os hosts de destino chegaram ao proxy HTTP e os outros foram direto. Para o painel, o Chrome tentou primeiro o SOCKS5, oferecendo só o método "sem autenticação", e depois passou para a reserva HTTP. Uma cópia com uma chave faltando mandou todas as requisições direto, sem aviso.
Como apontar um dispositivo ou navegador para um arquivo PAC?
Sirva o arquivo a partir de um servidor web, por HTTPS sempre que puder, com o Content-Type que o MDN pede. Depois informe o endereço dele:
- Windows: a opção Usar script de configuração; os passos estão em configuração de proxy no Windows e no Chrome.
- Mac: a linha Configuração automática de proxy; veja quando usá-la no Mac.
- Android: a opção Autoconfiguração do proxy na rede Wi-Fi (configurações de proxy no Android).
- Firefox: URL de configuração automática de proxy nas configurações de conexão (configurações de proxy no Firefox).
Para alternar entre alguns perfis dentro de um único navegador, uma extensão costuma ser mais simples (SwitchyOmega). Se você encontrou um endereço PAC em um computador do trabalho, veja como encontrar o endereço do servidor proxy.
O que é WPAD e por que é um risco?
O WPAD (Web Proxy Auto-Discovery) está por trás da opção "Detectar configurações automaticamente": o cliente procura um arquivo PAC na rede. O rascunho do WPAD, de 1999, lista vários métodos de descoberta, e os clientes usam principalmente dois: a opção 252 do DHCP, que entrega a URL, e consultas DNS por um host chamado wpad. Uma máquina chamada pc1.sales.corp.example pergunta por wpad.sales.corp.example, depois por wpad.corp.example, e pede /wpad.dat ao primeiro nome que responder. O Chrome tenta o DHCP antes do DNS, mas só oferece o método DHCP no Windows e no ChromeOS. O rascunho expirou sem virar RFC.
O cliente confia em quem responder. Se um notebook configurado para detecção automática entra na rede de um café, ou se a consulta WPAD dele vaza para o DNS público, o servidor de um desconhecido pode entregar a ele um arquivo PAC e rotear o tráfego do notebook. O alerta TA16-144A da CISA explica como os novos domínios de primeiro nível facilitaram essas colisões de nomes.
Para proteger as suas máquinas:
- Desligue a detecção automática onde ela não for necessária, principalmente em notebooks que saem do escritório.
- Informe o endereço PAC explicitamente, por HTTPS.
- No Windows 10 versão 1809, no Windows Server 2019 e em versões posteriores, defina o valor de registro
DisableWpadcomo1, como a Microsoft documenta, e desligue também a detecção nas Configurações, porque os navegadores leem essa opção. - Registre e bloqueie no firewall as requisições de saída para
wpad.dat, como a CISA sugere (Proxy ou firewall).
Por que um arquivo PAC não pode guardar usuário e senha?
Um arquivo PAC responde a uma única pergunta: para onde esta requisição deve ir? Ele retorna uma palavra-chave, um host e uma porta, sem nenhum campo para credenciais.
Se um proxy HTTP pede senha, ele responde 407 e o navegador mostra uma janela de login. O Chrome não oferece nenhum método de autenticação para SOCKS5, então uma entrada SOCKS5 só funciona quando o proxy libera o seu IP. Para trabalhos automatizados e SOCKS5, a autenticação por whitelist de IP é o caminho prático: você adiciona o seu IP de saída à lista de permitidos na sua conta de proxy. Não coloque credenciais em URLs para contornar o problema. Os dois métodos, incluindo o que acontece quando o seu IP muda, estão comparados em Autenticação de proxy: user:pass ou whitelist de IP.
Como um arquivo PAC reduz o tráfego e o custo do proxy?
Proxies residenciais e móveis são cobrados por gigabyte; proxies ISP e de datacenter, por endereço IP. Com um proxy no sistema inteiro, atualizações, videochamadas e downloads também entram na conta. Um arquivo PAC manda só os domínios de destino pelo proxy residencial, então os gigabytes cobrados correspondem ao trabalho.
Para um painel que precisa manter um único endereço entre sessões, um produto cobrado por IP se encaixa melhor: um Proxies ISP ou um Proxies SOCKS5 com o seu IP na whitelist.
Casos de uso
- Monitoramento de preços: só as lojas que você acompanha usam o proxy, dentro das regras do
robots.txtdelas e com uma taxa de requisições moderada (monitoramento de preços da concorrência). - Redes de escritório: endereços internos vão direto, e o tráfego externo passa por um proxy da empresa, como o Squid (configuração do Squid proxy).
- Verificações por país: cada domínio de destino recebe o tipo de saída de que precisa (proxy residencial ou datacenter).
- Testar um proxy novo: um domínio de teste passa por ele enquanto a navegação normal continua direta (como testar um proxy).
- Verificação de vazamentos: uma regra PAC cobre as requisições do navegador, mas o WebRTC e o DNS ainda podem revelar o seu endereço (vazamentos de WebRTC e DNS).
- Proxies locais: um proxy de depuração em
127.0.0.1:8080recebe só os domínios que você inspeciona (porta 8080).
Erros comuns
Estes erros são específicos de arquivos PAC; para erros de conexão em geral, veja Servidor proxy não está respondendo.
- Tipo MIME errado ou arquivo ausente. O MDN pede que os servidores enviem
application/x-ns-proxy-autoconfig. O Chrome também exige exatamente200; um404é uma busca que falhou e vira conexão direta. - Não ver mudança depois de editar. Os navegadores mantêm o script carregado na memória. Use Recarregar nas configurações de conexão do Firefox, Re-apply settings em
chrome://net-internals/#proxyou reinicie o navegador. - Consultar o DNS no script.
isInNetcom nome de host,dnsResolveeisResolvablefazem uma consulta por requisição, e um servidor DNS lento faz toda página esperar. - Erro de sintaxe. O Chrome vai direto sem mensagem. Teste o arquivo com o pacparser antes de colocá-lo em produção.
- Regras de caminho em HTTPS.
shExpMatch(url, "*/products/*")nunca corresponde a um endereçohttps://no Chrome, porque o caminho é removido. No nosso teste, o mesmo tipo de regra correspondeu emhttp://. Faça a correspondência pelohost. - O ponto no dnsDomainIs. Sem ele, domínios parecidos correspondem; com ele, o domínio sozinho não corresponde.
- Escrever
HTTP host:portou umSOCKSsozinho. O Chrome rejeita o primeiro e lê o segundo como SOCKS4. - Uma reserva
DIRECTem destinos de coleta de dados. Quando o proxy cai, o site vê o seu próprio IP.
Guia de decisão
| Necessidade | Recomendação |
|---|---|
| Mandar só alguns domínios por um proxy | Um arquivo PAC: PROXY para os destinos, DIRECT para o resto |
| Todo o tráfego do navegador por um único proxy | Não precisa de PAC; um proxy manual no sistema basta (Windows e Chrome) |
| O seu IP real nunca pode chegar a um site de destino | Retorne só PROXY para ele, sem a reserva ; DIRECT |
| Usar SOCKS5 no Chrome | Retorne SOCKS5 host:port e coloque o seu IP na whitelist |
| O mesmo endereço PAC em todos os computadores do escritório | Distribua por política ou gerenciamento de dispositivos; se usar WPAD, proteja o DHCP e o DNS |
| Um notebook também é usado em redes de cafés e de casa | Desligue a detecção automática; defina DisableWpad no Windows |
| Um painel precisa do mesmo IP em toda sessão | Aponte esse domínio para um proxy ISP estático |
Perguntas frequentes
Como abrir ou editar um arquivo PAC?
Um arquivo PAC é texto puro, então o Bloco de Notas ou qualquer editor de código o abre. Um navegador que abre a URL mostra o texto ou baixa o arquivo, conforme o tipo MIME. Outros formatos usam a mesma extensão .pac; se o arquivo parecer dados binários, ele não é uma configuração de proxy.
Onde fica o arquivo PAC no Windows?
Geralmente ele não é um arquivo local. O Windows guarda o endereço informado em Usar script de configuração e baixa o arquivo de lá. Os passos para ver ou alterar esse endereço estão em configuração de proxy no Windows e no Chrome.
Um arquivo PAC pode incluir usuário e senha?
Não. A função retorna só uma palavra-chave, um host e uma porta. Para um proxy HTTP, o navegador pede as credenciais em uma janela 407; para trabalhos automatizados e SOCKS5, use a autenticação por whitelist de IP.
Qual é a diferença entre PAC e WPAD?
O arquivo PAC contém as regras. O WPAD encontra o endereço de um arquivo PAC na rede local via DHCP ou DNS. Você pode usar um arquivo PAC sem WPAD informando o endereço você mesmo, o que também é a opção mais segura.
Um arquivo PAC pode retornar um proxy SOCKS5?
Sim, como SOCKS5 host:port; o Chrome e o Firefox seguem essa entrada. O Chrome não envia credenciais SOCKS5, então coloque o seu IP na whitelist do proxy.
Mudei o meu arquivo PAC. Por que o navegador ainda usa as regras antigas?
O navegador mantém a versão que carregou até recarregar a configuração. Clique em Recarregar no Firefox, use Re-apply settings em chrome://net-internals/#proxy ou reinicie o navegador. Um nome de arquivo novo para cada versão (proxy-v2.pac) elimina a dúvida.
Em resumo
Um arquivo PAC transforma o proxy de um interruptor liga/desliga em uma decisão para cada requisição: FindProxyForURL olha o host e retorna DIRECT, PROXY ou SOCKS5, e o navegador tenta as entradas da esquerda para a direita. Faça a correspondência pelo host, evite funções que consultam o DNS e deixe a reserva DIRECT fora das regras para destinos de coleta de dados. Informe você mesmo o endereço PAC, por HTTPS, e desligue o WPAD onde ele não for necessário. Como o arquivo não pode guardar senha, combine-o com a autenticação por whitelist de IP e escolha o tipo de proxy de cada regra nos nossos serviços de proxy.




