Recusou-se a executar um script JavaScript. Código-fonte do script encontrado na solicitação

No WebKit, recebo o seguinte erro no meu JavaScript:

Recusou-se a executar um script JavaScript. O código-fonte do script encontrado na solicitação.

O código é para um spinner JavaScript, consulte ASCII Art .

O código usado para funcionar bem e ainda está funcionando corretamente no Camino e no Firefox. O erro parece ser lançado somente quando a página é salva por um POST e, em seguida, recuperada por meio de um GET. Isso acontece tanto no Chrome / Mac quanto no Safari / Mac.

Alguém sabe o que isso significa e como consertar isso?

É uma medida de segurança para impedir ataques XSS (cross-site scripting) .

Isso acontece quando algum código JavaScript é enviado ao servidor por meio de uma solicitação HTTP POST, e o mesmo código é retornado por meio da resposta HTTP. Se o Chrome detectar essa situação, o script será recusado e a mensagem de erro será Refused to execute a JavaScript script. Source code of script found within request Refused to execute a JavaScript script. Source code of script found within request .

Veja também esta postagem de blog sobre Segurança em Profundidade: Novos Recursos de Segurança .

Esse “recurso” pode ser desativado enviando o header HTTP não padrão X-XSS-Protection na página afetada.

 X-XSS-Protection: 0 

Resposta curta : atualize a página depois de fazer o envio inicial do javascript ou clique no URL que exibirá a página que você está editando.

Resposta longa : como o texto que você preencheu no formulário inclui javascript, e o navegador não necessariamente sabe que você é a fonte do javascript, é mais seguro que o navegador presuma que você não é a fonte desse JS, e não executá-lo.

Um exemplo : Suponha que eu te dei um link para seu e-mail ou facebook com algum javascript nele. E imagine que o javascript enviaria mensagens a todos os seus amigos como meu link legal. Assim, o jogo de obter esse link para ser invocado torna-se simplesmente, encontrar um lugar para enviar o javascript de tal forma que ele será incluído na página.

O Chrome e outros navegadores WebKit tentam atenuar esse risco não executando nenhum javascript que esteja na resposta, caso esteja presente na solicitação. Meu ataque nefasto seria frustrado porque seu navegador nunca executaria esse JS.

No seu caso, você está enviando para um campo de formulário. A postagem do campo de formulário causará uma renderização da página que exibirá o Javascript, fazendo com que o navegador se preocupe. Se o seu javascript for realmente salvo, no entanto, acessar essa mesma página sem enviar o formulário permitirá que ele seja executado.

Como outros disseram, isso acontece quando uma resposta HTTP contém uma string JavaScript e / ou HTML que também estava na solicitação. Isso geralmente é causado pela inserção de JS ou HTML em um campo de formulário, mas também pode ser acionado de outras maneiras, como ajustar manualmente os parâmetros da URL.

O problema com isso é que alguém com más intenções poderia colocar qualquer JS que quiser como o valor, vincular a URL com o valor JS malicioso e causar problemas aos usuários.

Em quase todos os casos, isso pode ser corrigido pela codificação HTML da resposta , embora haja exceções. Por exemplo, isso não será seguro para o conteúdo dentro de uma tag . Outros casos específicos podem ser tratados de maneira diferente - por exemplo, injetar input em uma URL é melhor servido pela codificação de URL.

Como Kendall Hopkins mencionou, pode haver alguns casos em que você realmente deseja que o JavaScript de inputs de formulário seja executado, como a criação de um aplicativo como o JSFiddle . Nesses casos, recomendo que você, pelo menos, esfregue a input em seu código de back-end antes de escrevê-la de volta às cegas. Depois disso, você pode usar o método que ele mencionou para evitar o bloqueio de XSS (pelo menos no Chrome), mas esteja ciente de que ele está abrindo você para invasores.

Eu usei esse truque de hacky do PHP logo depois de me comprometer com o database, mas antes do script ser processado a partir do meu pedido de _GET :

 if(!empty($_POST['contains_script'])) { echo ""; } 

Esta foi a solução mais barata para mim.