“Erro de script” criptografado. Relatado em Javascript no Chrome e no Firefox

Eu tenho um script que detecta erros de Javascript no meu site e os envia ao meu back-end para relatórios. Ele relata o primeiro erro encontrado, o número da linha e a hora.

EDIT para include doctype:

  

  // -1){ return; } if(msg.indexOf("Error loading script") > -1){ return; } //report errors window.onerror = function(){}; (new Image()).src = "/jserror.php?msg=" + encodeURIComponent(msg) + "&url=" + encodeURIComponent(url || document.location.toString().replace(/#.*$/, "")) + "&ln=" + parseInt(ln || 0) + "&r=" + (+new Date()); }; })(window); //]]>  

Devido a este script, estou ciente de todos os erros de JavaScript que estão acontecendo no meu site. Um dos maiores infratores é o “Erro de script”. na linha 0. no Chrome 10+ e no Firefox 3+. Este erro não existe (ou pode ser chamado de outra coisa?) No Internet Explorer.

Correção (23/05/2013): Este erro “Script Error, Line 0” está sendo exibido no IE7 e possivelmente em outras versões do IE. Possivelmente, um resultado de um patch de segurança recente do IE, já que esse comportamento não existia anteriormente.

Alguém tem alguma idéia do que esse erro significa ou o que causa isso? Isso acontece em cerca de 0,25% do total de pageloads e representa metade dos erros relatados.

    O “erro de script”. acontece no Firefox, Safari e Chrome quando uma exceção viola a política de mesma origem do navegador – ou seja, quando o erro ocorre em um script hospedado em um domínio diferente do domínio da página atual.

    Esse comportamento é intencional, para impedir que os scripts vazem informações para domínios externos. Para um exemplo de por que isso é necessário, imagine acidentalmente visitar o site evilsite.com , que exibe uma página com . (sim, estamos apontando essa tag de script em html, não em JS). Isso resultará em um erro de script, mas o erro é interessante porque pode nos informar se você está logado ou não. Se você está logado, o erro pode ser 'Welcome Fred...' is undefined , enquanto que se você não for, pode ser 'Please Login ...' is undefined . Algo nesse sentido.

    Se o site evilsite.com fizer isso para as 20 maiores instituições bancárias, eles terão uma boa ideia de quais sites de bancos você visitará e poderão fornecer uma página de phishing muito mais direcionada. (Este é apenas um exemplo, é claro. Mas ilustra por que os navegadores não devem permitir que nenhum dado ultrapasse os limites de domínio.)

    Eu testei isso nas versões mais recentes do Safari, Chrome e Firefox - todos fazem isso. O IE9 não - trata exceções de origem x iguais às da mesma origem. (E o Opera não suporta onerror.)

    Da boca dos cavalos: Fonte do WebKit que verifica a origem ao passar exceções para onerror (). E a fonte do Firefox que verifica .

    UPDATE (21/10/11) : O bug do Firefox que acompanha esse problema inclui um link para a postagem do blog que inspirou esse comportamento.

    UPDATE (2/12/14) : Agora é possível ativar o relatório de erros de vários domínios completos em alguns navegadores, especificando um atributo crossorigin - crossorigin no tags de script e fazendo com que o servidor envie os headers de resposta CORS HTTP apropriados.

    Uma atualização para aqueles que se depararão com essa questão no futuro: a broofa está certa com a resposta e não há solução para isso.

    Obviamente, outros tropeçaram nesta limitação e alguns bugs solicitando uma correção foram arquivados para o Firefox: Bug 69301 e para WebKit: Bug 70574

    A boa notícia é que o bug foi resolvido para o Firefox com o lançamento do Firefox 13. É assim que você o usa:

      

    crossorigin é equivalente a crossorigin=anonymous e diz ao navegador para fazer uma busca do CORS do script sem enviar credenciais.

    Você deve garantir que o script seja enviado com um valor de header HTTP Access-Control-Allow-Origin que corresponda ao domínio solicitante, por exemplo,

     Access-Control-Allow-Origin: http://myhomesite.example Access-Control-Allow-Origin: * 

    caso contrário, o navegador cancelará o carregamento do script .

    Para o Apache:

     Header set Access-Control-Allow-Origin "*" 

    (Veja exemplos de CORS para outros servidores da Web .)

    Se você está enviando scripts em PHP:

     header('Access-Control-Allow-Origin', 'http://myhomesite.example'); 

    Eu testei isso e funciona como esperado. todos os erros do script.js serão capturados pelo manipulador window.onerror com detalhes de mensagem, arquivo e linha.

    O bug do WebKit ainda não foi corrigido, mas um patch foi proposto (e usa a mesma solução). Espero que a correção seja liberada em breve.

    Mais informações sobre o CORS aqui: http://enable-cors.org/

    Este demorou um pouco para descobrir.

    Fizemos um monte de coisas para tentar resolvê-lo, inclusive fazendo coisas como jogar todo o corpo do documento em nossos servidores via Ajax para tentar descobrir.

    Ainda não sei o que causa “Erro de script”. (com o período BTW, é assim que aparece no nosso Ajax logger) no Firefox, mas no Chrome, conseguimos reduzi-lo a …

    Rolo de tambor …

    O recurso de tradução automática do Google Chrome.

    Muitas pessoas que falam inglês provavelmente nem sabem sobre esse recurso, mas, para testá-lo, acho que visite um site que não seja em inglês usando o Chrome. Ou, melhor ainda, se você analisar as opções do Chrome, há um local para alterar o idioma do navegador. Altere-o para algo diferente do inglês, reinicie o navegador e visite um site em inglês.

    Você deve obter a barra na parte superior perguntando se gostaria que o Google Chrome traduzisse a página para você.

    No nosso caso, o tradutor estava causando o problema, pois injeta uma tag de script no corpo do documento e (adivinhando) usa algum tipo de sistema baseado em JS para enviar o conteúdo para os servidores do Google e fazer com que ele o traduza.

    Mesmo que o erro no console fosse Unreferenced something, a mensagem que estava sendo enviada para window.onerror era “Script Error”.

    De qualquer forma, existe uma cura.

    http://googlewebmastercentral.blogspot.com/2007/12/answering-more-popular-picks-meta-tags.html

      

    Isso vai fazer 2 coisas (tanto quanto sabemos, talvez mais?):

    a) Desabilite a barra de tradução de aparecer no Chrome.

    b) Desative a tradução da página por meio de translate.google.com.

    Na nossa situação, de qualquer forma, isso resolveu uma tonelada desses “Erro de script”. questões que estávamos experimentando.

    Desculpem os erros de ortografia nesta postagem, ainda estou em um modo não em inglês no Google Chrome, e o corretor ortográfico não está definido para inglês;) Hora de voltar atrás.

    Apreciar!

    Devido à% baixa, você pode assumir que eles não são usuários normais. Provavelmente, os usuários com userscripts, bookmarklets ou até mesmo talvez apenas mexer com o console em seu site. Ter todo o HTML de uma página onde isso acontece poderia ajudar a testar essa teoria. Bem como o erro completo. Deve te dar uma url, é sempre a mesma coisa? A linha é realmente 0 ou apenas indefinida?

    Eu não acho que configurar valores padrão em você onerror seja uma boa idéia e o 0 provavelmente vem de parseInt(ln || 0) quando o erro não está realmente na página (veja os exemplos acima).

    Adicionar um if para ver se a linha é conhecida no JavaScript para ignorar esses erros (porque eles provavelmente não vêm do seu próprio código) ou no código do lado do servidor para cuidar deles separadamente seria, melhor, melhor .

    === EDIT === Tem que: http://www.xavierm02.net/AZE/ Instale o arquivo user.js (eu fiz isso no Chrome, mas ele deve funcionar no Firefox também). Em seguida, abra a página html no mesmo navegador. Ele vai te mostrar o erro (eu só mudei aquele insteal de reportar para o servidor, ele escreve na página). Com 0 como número de linha.

    Eu tive um problema semelhante: meus scripts são servidos por um subdomínio e se enquadram na mesma restrição de origem. No entanto, resolvi isso por:

    1) adicionando cada tag de script como esta:

      

    2) modificando o httpd.conf do apache adicionando o seguinte dentro de cada vhost (você deve habilitar mod_headers):

      Header add Access-Control-Allow-Origin "*.mydomain.tld"  

    Espero que isto ajude ...

    EDITAR

    Em um dos servidores, não consegui tornar isso funcional, exceto substituindo

     *.mydomain.tld 

    de

     * 

    Esteja ciente das falhas que potencialmente permitem * violar informações estendidas. A documentação sobre o CORS, a mesma origem, img & fonts, cdn está disponível, mas muito menos sobre os detalhes de crossorigin da tag de script está disponível.

    No Chrome, também recebo “Erro de script” (na linha 0) ao carregar o HTML e o Javascript do file:// . Isso não acontece no Firefox. Provavelmente, proteção contra a mesma origem excessivamente zelosa do Chrome.

    Tudo é bom ao carregar o mesmo HTML e Javascript sobre HTTP.

    Como sobre o abaixo. O erro de script não está disponível via JavaScript, portanto, apenas isole esse caso específico e manipule-o da melhor maneira possível.

     window.onerror = function (msg, url, lineNo, columnNo, error) { var string = msg.toLowerCase(); var substring = "script error"; if (string.indexOf(substring) > -1){ alert('Script Error: See Browser Console for Detail'); } else { alert(msg, url, lineNo, columnNo, error); } return false; }; 

    Eu vou te dizer o que consertou para mim no Safari (WebKit): Se eu colocar a rotina de retorno de chamada JS na página , eu recebo informações completas. Se eu incluí-lo em um arquivo .js através de uma tag, acabei de receber o erro “Erro de script” (sem linenumber, etc.).

    Talvez isso esteja relacionado ao que Broofa disse.

    Anwyay, agora tenho um pequeno retorno de chamada na página e depois o resto do arquivo fora da página.

    Eu fiz um pouco de pesquisa e parece que um “Erro de script” significa que teve problemas ao carregar um arquivo que foi solicitado a procurar. Isso pode ser um problema de cache no lado do cliente ou pode ser um problema no servidor devido à sobrecarga.

    É mais provável que seja causado por algo como isto, onde o próprio script é o arquivo que ele não pode carregar, daí o erro que ocorre na linha 0.

      

    Eu experimentei

    Erro de script. linha 0

    erros por algum tempo sendo reportados de volta ao nosso servidor quando o erro ocorreu nos navegadores do cliente. Ontem pela primeira vez (depois de introduzir o "use strict"; no nosso javascript) eu consegui replicar esse problema no Safari e no Chrome no Windows 7. Depois de jogar lixo no nosso código com instruções alert (), rastreei esse erro até o uso de uma variável indefinida! eg xx = 123; onde xx não está definido com uma declaração var .

    Safari relatou isso como

    ReferenceError: modo estrito proíbe a criação implícita de propriedade global ‘xx’

    dentro do Web Inspector, mas a function window.onerror estava detectando

    Erro de script. linha 0

    O código fonte do Firefox revela que não há "Script Error." . Assim, é muito provável que algum script em seu site esteja causando um erro não detectado como este:

     throw new Error('Script Error.'); 

    Provavelmente esta afirmação só é alcançada no Firefox e no Chrome.

    Não tenho certeza porque não há nenhum número de linha embora. Talvez algum problema de eval() ?