[BUG]: Some JS characters aren't escaped when running the page-ready check

Aberta Para iniciantes
#316 0 comentários 0 reações 0 responsáveis Ver no GitHub

@Blizzeq já está trabalhando nisso.

Desde 1/10/2026.

  • #317 de @Blizzeq — aberto

Avaliação

Dificuldade
2/5
Tempo estimado
1-3 horas
Facilidade para iniciantes
75/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Ativa
Stack de tecnologia
javascript, python

Direção de pesquisa

O bug está em src/choreographer/protocol/devtools_async_helpers.py na linha 37, onde uma URL é inserida em um template literal JavaScript. Comece examinando a função create_and_wait e os helpers do protocolo devtools ao redor. Use json.dumps para escapar a string da URL corretamente, e também atualize a função para verificar exceptionDetails na resposta. Execute o script de reprodução fornecido para verificar a correção.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

bug P3 size: 1
Description

The page-ready check inserts the URL into a JavaScript template literal without escaping it, at src/choreographer/protocol/devtools_async_helpers.py:37. A backtick in the URL ends the literal, and a ${...} sequence in the URL runs as JavaScript.

Steps to reproduce
  • Run the following code:
import asyncio
import choreographer as choreo
from choreographer.protocol.devtools_async_helpers import create_and_wait

async def main():
    browser = await choreo.Browser(headless=True)
    try:
        # Correct: raises TimeoutError after 5s, because the address never loads
        await create_and_wait(browser, url="http://192.0.2.1:9999", timeout=5.0)
    except TimeoutError:
        print("plain URL: TimeoutError")
    # Wrong: returns after 0.02s, for the same unreachable address
    await create_and_wait(browser, url="http://192.0.2.1:9999/`", timeout=5.0)
    print("URL with a backtick: returned OK")
    await browser.close()

asyncio.run(main())

For the second problem, pass https://www.example.com/${(window.__injected = 42, "")} to create_and_wait, then read window.__injected back from the page. The value is 42.

Notes
  • With this bug:
    • A backtick makes the script raise a SyntaxError. Runtime.evaluate returns that as a normal response, and the race in create_and_wait counts any finished task as a load. So create_and_wait returns a tab for a page that never loaded.
    • A ${...} sequence runs arbitrary JavaScript in the page.
  • A fix is to build the JavaScript string with json.dumps(url) and drop the backticks from the template. json.dumps supplies its own quotes and escapes the contents, so a backtick and a ${ are both inert.
  • create_and_wait should also inspect the response for exceptionDetails instead of counting every finished task as a successful load
  • This was found while working on #295
Linguagem predominante
Python
Estrelas
17
Forks
10
Métricas de merge de PRs
Nenhum PR com merge em 30d

Preparar o ambiente

Este projeto não oferece contêiner de desenvolvimento, Dockerfile nem guia de contribuição, então a configuração fica por sua conta: comece pelo README e veja nosso guia da primeira contribuição para os passos gerais.

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de plotly/choreographer

Todas as issues de plotly/choreographer

Issues semelhantes

Mais issues de Python

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.