Aparentemente, por causa dos golpes recentes, as ferramentas do desenvolvedor são exploradas pelas pessoas para postar spam e até usadas para "invadir" contas. O Facebook bloqueou as ferramentas de desenvolvedor, e eu não posso nem usar o console.
Como eles fizeram isso? Um post do Stack Overflow afirmou que não é possível , mas o Facebook provou que eles estavam errados.
Basta ir ao Facebook e abrir as ferramentas do desenvolvedor, digite um caractere no console e esse aviso será exibido. Não importa o que você colocar, ele não será executado.
Como isso é possível?
Eles até bloquearam o preenchimento automático no console:
javascript
facebook
google-chrome-devtools
Derek 朕 會 功夫
fonte
fonte
Respostas:
Sou engenheiro de segurança no Facebook e isso é culpa minha. Estamos testando isso para alguns usuários, para ver se é possível retardar alguns ataques nos quais os usuários são induzidos a colar código JavaScript (malicioso) no console do navegador.
Só para esclarecer: tentar bloquear hackers do lado do cliente é uma má ideia em geral; isso é para proteger contra um ataque específico de engenharia social .
Se você acabou no grupo de teste e está irritado com isso, desculpe. Tentei tornar a página de desativação antiga (agora página de ajuda ) o mais simples possível, apesar de ainda ser assustadora o suficiente para impedir pelo menos algumas das vítimas.
O código real é bastante semelhante ao link de @ joeldixon66 ; o nosso é um pouco mais complicado sem uma boa razão.
O Chrome agrupa todo o código do console
... então o site redefine
console._commandLineAPI
para lançar:Isso não é o suficiente (tente!) , Mas esse é o principal truque.
Epílogo: a equipe do Chrome decidiu que derrotar o console do JS do usuário era um bug e corrigiu o problema , tornando esta técnica inválida. Posteriormente, foi adicionada proteção adicional para proteger os usuários do self-xss .
fonte
console.log
.Eu localizei o script de buster de console do Facebook usando as ferramentas de desenvolvedor do Chrome. Aqui está o script com pequenas alterações para facilitar a leitura. Eu removi os bits que não consegui entender:
Com isso, o preenchimento automático do console falha silenciosamente enquanto as instruções digitadas no console falham na execução (a exceção será registrada).
Referências:
fonte
Não consegui acioná-lo em nenhuma página. Uma versão mais robusta disso faria:
Para estilizar a saída: Cores no console JavaScript
Editar O Thinking @ joeldixon66 tem a ideia certa: Desativar a execução do JavaScript no console «::: KSpace :::
fonte
window.console.log = function(){//empty}
e uso console.logAlém de redefinir
console._commandLineAPI
, existem outras maneiras de invadir o InjectedScriptHost nos navegadores WebKit, para impedir ou alterar a avaliação das expressões inseridas no console do desenvolvedor.Editar:
O Chrome corrigiu isso em uma versão anterior. - que deve ter sido antes de fevereiro de 2015, como eu criei a essência na época
Então aqui está outra possibilidade. Desta vez, conectamos um nível acima diretamente
InjectedScript
ao invésInjectedScriptHost
da versão anterior.O que é legal, pois você pode usar o patch diretamente em
InjectedScript._evaluateAndWrap
vez de precisar confiar,InjectedScriptHost.evaluate
pois isso oferece um controle mais detalhado sobre o que deve acontecer.Outra coisa bem interessante é que podemos interceptar o resultado interno quando uma expressão é avaliada e devolvê-lo ao usuário em vez do comportamento normal.
Aqui está o código, que faz exatamente isso, retorna o resultado interno quando um usuário avalia algo no console.
É um pouco detalhado, mas pensei em colocar alguns comentários
Portanto, normalmente, se um usuário, por exemplo, avaliar
[1,2,3,4]
você esperaria a seguinte saída:Após o monkeypatching
InjectedScript._evaluateAndWrap
avaliar a mesma expressão, fornece a seguinte saída:Como você vê a pequena seta esquerda, indicando a saída, ainda está lá, mas desta vez obtemos um objeto. Onde o resultado da expressão, a matriz
[1,2,3,4]
é representada como um objeto com todas as suas propriedades descritas.Eu recomendo tentar avaliar esta e aquela expressão, incluindo aquelas que geram erros. É bem interessante.
Além disso, dê uma olhada no objeto
is
-InjectedScriptHost
- . Ele fornece alguns métodos para brincar e obter algumas informações sobre as partes internas do inspetor.Obviamente, você pode interceptar todas essas informações e ainda assim devolver o resultado original ao usuário.
Apenas substitua a instrução de retorno no caminho else por um
console.log (res)
seguinte areturn res
. Então você terminaria com o seguinte.Fim da Edição
Esta é a versão anterior que foi corrigida pelo Google. Portanto, não existe mais um caminho possível.
Uma delas é ligarFunction.prototype.call
Chrome avalia a expressão introduzida pelocall
ing sua função eval comInjectedScriptHost
comothisArg
var result = evalFunction.call(object, expression);
Diante disso, você pode ouvir o
thisArg
decall
estarevaluate
e obter uma referência para o primeiro argumento (InjectedScriptHost
)Você poderia, por exemplo, lançar um erro, que a avaliação foi rejeitada.
Aqui está um exemplo em que a expressão inserida é passada para um compilador CoffeeScript antes de passá-la para a
evaluate
função.fonte
A Netflix também implementa esse recurso
Eles simplesmente substituem
console._commandLineAPI
para gerar erro de segurança.fonte
Isso é realmente possível, já que o Facebook conseguiu fazer isso. Bem, não as ferramentas atuais para desenvolvedores da Web, mas a execução do Javascript no console.
Veja o seguinte: Como o Facebook desativa as Ferramentas de desenvolvedor integradas do navegador?
Isso realmente não fará muito, já que existem outras maneiras de contornar esse tipo de segurança do lado do cliente.
Quando você diz que é do lado do cliente, isso acontece fora do controle do servidor, portanto não há muito o que fazer. Se você está perguntando por que o Facebook ainda faz isso, isso não é realmente por segurança, mas para proteger usuários normais que não sabem javascript de executar código (que eles não sabem ler) no console. Isso é comum em sites que prometem serviço de comparador automático ou outros bots de funcionalidade do Facebook depois que você faz o que eles pedem, onde, na maioria dos casos, eles fornecem um fragmento de javascript para execução no console.
Se você não tem tantos usuários quanto o Facebook, não acho necessário fazer o que o Facebook está fazendo.
Mesmo se você desabilitar o Javascript no console, ainda é possível executar o javascript pela barra de endereço.
e se o navegador desabilitar o javascript na barra de endereço, (quando você cola o código na barra de endereços no Google Chrome, ele exclui a frase 'javascript:') ainda é possível colar o javascript em um dos links por meio do elemento inspecionar.
Inspecione a âncora:
Cole o código no href:
A linha inferior é a validação do lado do servidor e a segurança deve ser a primeira, depois o lado do cliente.
fonte
O Chrome mudou muito, pois os tempos em que o Facebook podia desativar o console ...
Em março de 2017, isso não funciona mais.
O melhor que você pode fazer é desativar algumas das funções do console, por exemplo:
fonte
Meu jeito simples, mas pode ajudar a mais variações sobre esse assunto. Liste todos os métodos e altere-os para inúteis.
fonte
Internamente, o devtools injeta um IIFE nomeado
getCompletions
na página, chamado quando uma tecla é pressionada dentro do console do Devtools.Observando a fonte dessa função , ele usa algumas funções globais que podem ser substituídas.
Usando o
Error
construtor, é possível obter a pilha de chamadas, que incluirágetCompletions
quando chamada pelo Devtools.Exemplo:
fonte
uma solução simples!
fonte
console.log()
?console.log()
não importa mais quando consola constantemente é limpo :)Eu seguiria o caminho de:
fonte
Esta não é uma medida de segurança para que código fraco seja deixado sem supervisão. Sempre obtenha uma solução permanente para código fraco e proteja seus sites corretamente antes de implementar esta estratégia
A melhor ferramenta, de longe, de acordo com o meu conhecimento, seria adicionar vários arquivos javascript que simplesmente alteram a integridade da página de volta ao normal, atualizando ou substituindo o conteúdo. Desabilitar essa ferramenta de desenvolvedor não seria a melhor idéia, já que o desvio sempre está em questão, pois o código faz parte do navegador e não uma renderização do servidor; portanto, pode ser quebrado.
Caso você tenha
js file one
a verificação de<element>
alterações em elementos importantes ejs file two
ejs file three
verificar se esse arquivo existir por período você terá a integridade restauração completa na página dentro do prazo.Vamos dar um exemplo dos 4 arquivos e mostrar o que quero dizer.
index.html
mainfile.js
ps.js
ks.js
style.css
Agora isso é apenas para mostrar que funciona em todos os arquivos e tags também
Se você juntar todos esses arquivos e criar o exemplo, verá a função dessa medida. Isso evitará algumas injeções imprevistas, caso você a implemente corretamente em todos os elementos importantes do seu arquivo de índice, especialmente ao trabalhar com PHP.
O motivo pelo qual escolhi recarregar em vez de voltar ao valor normal por atributo é o fato de que alguns invasores podem ter outra parte do site já configurada e pronta e isso diminui a quantidade de código. A recarga removerá todo o trabalho duro do atacante e ele provavelmente irá jogar em algum lugar mais fácil.
Outra observação: isso pode se tornar um monte de código; portanto, mantenha-o limpo e adicione definições ao local a que pertencem para facilitar as edições no futuro. Defina também os segundos para sua quantidade preferida, pois intervalos de 1 segundo em páginas grandes podem ter efeitos drásticos em computadores mais antigos que seus visitantes possam estar usando
fonte