Ok… ainda em minha busca para fazer meu adserver exibir no Discourse. Me deparei com esse mistério que não consigo resolver. Usando o recurso de edição de tema, adicionei minha solicitação de script tanto em </body> quanto em ‘footer’.
Se adicionado ao footer (ou ‘after header’), o código falha. Mesmo que, no modo de inspeção, o texto codificado pareça estar correto. Veja abaixo:
Também não consigo fazer meus anúncios do Adsense funcionarem sozinhos por enquanto, mas talvez seja algo do lado deles e eles ainda não tenham verificado o site para ver o que exibir. Estranho que esteja levando tanto tempo.
Ok, então notei que o log do CSP estava mostrando que o script do Google Ads estava sendo bloqueado, então adicionei
https://pagead2.googlesyndication.com
à lista de script-src do CSP e, em seguida, meus anúncios do Google AdSense começaram a aparecer (fiquei meio surpreso de que ainda é necessário fazer isso, mesmo com o plugin do AdSense instalado). O que notei, no entanto, é que, com meus House Ads configurados para 100% (de modo que apenas meu script está sendo chamado), não recebo NENHUMA notificação no CSP de que há um problema. Isso me deixa de volta ao ponto de estar confuso. O código do House Ad está no HTML (codificado) e aparece como acima na visão de inspeção do navegador.
Existe algo bloqueando a saída, mas não acionando um aviso do CSP?
A saída usa document.write para criar o espaço do anúncio. Estou supondo que seja esse o culpado. A saída se parece com isso:
Então… tudo isso está relacionado ao CSP (acho), porque o site está configurado como ‘unsafe-inline’ para dados e estou tentando carregar meu script de servidor de anúncios com uma URL contendo variáveis. Eu sei… quão bárbaro é isso.
Então… ALGUÉM? Existe uma solução simples para isso ou devo apenas desistir?
A correção adequada é não usar inline e reescrevê-lo para se conectar às saídas existentes dos templates do EmberJS. Se você está procurando uma solução paliativa, pode desativar o CSP nas configurações do site enquanto trabalha nas alterações da sua solução de anúncios personalizados. Apenas esteja ciente de que isso pode expor você a XSS.
Também, onde a Política de Segurança de Conteúdo está sendo declarada? Não vejo nenhuma meta tag para ela. Isso são apenas configurações padrão do HTML 5 assumidas por cada navegador?
Obrigado, Falco. Em vez de desativar toda a proteção, existe uma maneira de eu permitir apenas strings de dados específicas para a URL do servidor de anúncios e permitir que essas variáveis passem? Ou… simplesmente desativar a exigência de “‘unsafe-inline’ data”?
Infelizmente, não vejo essa opção descrita no artigo que você linkou.
E ainda assim o anúncio não será exibido na seção principal do site, apenas no rodapé, onde ele está instalado no tema dentro de </body>. Percebi, no entanto, que há uma envoltória <noscript> em torno da seção central, enquanto a do rodapé fica fora do fechamento de </noscript>, então talvez seja por isso?
Verifiquei no Firefox e meu console agora não mostra mais avisos de CSP. Não sei por que eu nunca via esses avisos no Chrome desde o início.
O Discourse é um Single Page Application e toda a marcação da página é criada no lado do cliente por meio do nosso aplicativo EmberJS.
Usar manipulação direta do DOM, como document.write, entra em conflito direto com toda a estrutura e tem uma chance muito baixa de “funcionar apenas assim”.
Recomendo tentar adaptar seu sistema de anúncios para usar nosso sistema de House Ads no Plugin Oficial de Anúncios. Talvez você possa ter um único anúncio no inventário de House Ads e usar o gatilho de mudança de página para contatar o servidor de anúncios e substituir o anúncio pela resposta? Ou talvez seu sistema de anúncios possa escrever diretamente no inventário de House Ads via API?
Obrigado pela ajuda, Falco. Um pouco assustador, mas a base de código desse servidor de anúncios foi escrita antes do termo API ser criado, então… sim, eu estaria melhor se escrevesse um sistema de servidor de anúncios completamente novo do zero. Só não tenho tempo para isso agora, pois estou implantando este novo fórum e mais 6+ sites de conteúdo também.
Vou experimentar algumas opções alternativas ao uso de document.write e ver se isso pode funcionar.