Estoy usando esta declaración en Python
jsonreq = json.dumps({'jsonrpc': '2.0', 'id': 'qwer', 'method': 'aria2.pauseAll'}) jsonreq = jsonreq.encode('ascii') c = urllib.request.urlopen('http://localhost:6800/jsonrpc', jsonreq)En esto, recibo esta advertencia/error cuando realizo una prueba de calidad del código
Url de auditoría abierta para esquemas permitidos. Permitir el uso de "archivo:" o esquemas personalizados a menudo es inesperado.
Debido a que me topé con esta pregunta y la respuesta aceptada no funcionó para mí, investigué esto yo mismo:
urlib no solo abre las URL http:// o https://, sino también ftp:// y file://. Con esto, podría ser posible abrir archivos locales en la máquina ejecutora, lo que podría ser un riesgo de seguridad si un usuario externo puede manipular la URL para abrir.
Usted mismo es responsable de validar la URL antes de abrirla con urllib. P.ej
if url.lower().startswith('http'): req = urllib.request.Request(url) else: raise ValueError from None with urllib.request.urlopen(req) as resp: [...]Al menos bandit tiene una lista negra simple para la llamada de función. Siempre que use urllib, el linter generará una advertencia. Incluso si SÍ valida su entrada como se muestra arriba. (O incluso usar URL codificadas).
Agregue un comentario #nosec a la línea para suprimir la advertencia de bandit o busque la palabra clave de supresión para su linter/code-checker. Es una buena práctica agregar también comentarios adicionales que indiquen POR QUÉ cree que no vale la pena una advertencia en su caso.
creo que esto es lo que necesitas
import urllib.request req = urllib.request.Request('http://www.example.com') with urllib.request.urlopen(req) as response: the_page = response.read()Para las personas que no pudieron resolverlo con las respuestas anteriores. En su lugar, podría usar la biblioteca de requests , que no está en la lista negra de Bandit.
https://bandit.readthedocs.io/en/latest/blacklists/blacklist_calls.html#b310-urllib-urlopen
import requests url = 'http://www.example.com' the_page = requests.get(url) print(the_page.json()) # if the response is json print(the_page.text) # if the response is some text