[BUG]: Some JS characters aren't escaped when running the page-ready check
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
- Domínio
- devtools, security, testing-qa
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
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.evaluatereturns that as a normal response, and the race increate_and_waitcounts any finished task as a load. Socreate_and_waitreturns a tab for a page that never loaded. - A
${...}sequence runs arbitrary JavaScript in the page.
- A backtick makes the script raise a
- A fix is to build the JavaScript string with
json.dumps(url)and drop the backticks from the template.json.dumpssupplies its own quotes and escapes the contents, so a backtick and a${are both inert. create_and_waitshould also inspect the response forexceptionDetailsinstead 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
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de plotly/choreographer
-
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 35/100
plotly/choreographer#318 ·
-
Multiple choreographer errors in docker and apptainer when trying to export figure with plotlyAberta
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 45/100
plotly/choreographer#287 · 7 comentários ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 42/100
plotly/choreographer#284 ·
-
Can close logger-pipe fasterAberta
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 45/100
plotly/choreographer#259 ·
Todas as issues de plotly/choreographer
Issues semelhantes
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 88/100
didi/helixharness#18 ·
-
[MOVIE]: Airport '77 (1977)Abertarequest-theme
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 78/100
LizardByte/ThemerrDB#9883 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
NousResearch/hermes-agent#149885 ·
Mantenedores costumam responder em até 1 dia
-
Set cache_ok = True on GUID TypeDecorator to enable SQLAlchemy query cachingTalvez já em andamento @patelshivani2283-lab assumiu hoje. Aberta
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 91/100
fedora-infra/anitya#2157 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 84/100
Project-MONAI/MONAI#9258 ·
Mantenedores costumam responder em até 3 dias