• XSS.stack #1 – первый литературный журнал от юзеров форума

Ошибка has been blocked by CORS policy.

acc2ss

(L3) cache
Пользователь
Регистрация
26.08.2023
Сообщения
161
Реакции
222
Гарант сделки
2
Депозит
0.00
Пытаюсь получить ответ от python что бы передать его в js.
Но взамен получаю ошибку:
Код:
Access to fetch at 'url' from origin 'http://localhost' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
file.js:51
       POST url net::ERR_FAILED
На сервере ошибка:
INFO: ip:port - "OPTIONS /123 HTTP/1.1" 404 Not Found
CORS попытался настроить в .py

Python:
router = APIRouter()
app = FastAPI()
app.include_router(router)

origins = [
    "http://localhost",
    "http://127.0.0.1:8080",
]

cors_middleware = CORSMiddleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)
app.add_middleware(cors_middleware)
Тоже не дало результата.

Здесь я отправляю запрос в python ну и жду ответ
JavaScript:
function 123() {
    fetch(`url/123`, {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({ id: Id })
    })

    .then(response => response.json())
    .then(data => {
        if (data.status === 'confirmed') {
            clearInterval(123)
        console.log("Получен ответ confirmed от сервера");
        document.getElementById("123").textContent = "123";
            alert("123");.
            clearInterval(123);
        }
    })
И дополнительно обрабатываю options

Python:
@app.options("/123")
async def 123():
    return JSONResponse(content={}, headers={
        "Access-Control-Allow-Origin": "https://127.0.0.1:8000", "http://localhost"
        "Access-Control-Allow-Methods": "POST, OPTIONS",
        "Access-Control-Allow-Headers": "Content-Type",
    })


Надеюсь что здесь будут люди которые смогут помочь)
 
  • Access-Control-Allow-Origin: http://localhost
  • Access-Control-Allow-Methods: POST, OPTIONS

и с чего ты решил что тут может быть https? - https://127.0.0.1:8000
это ip адрес а не домен либо просто впиши туда http уж тогда
 
Перед POST отправляется OPTIONS, и бэк на OPTIONS должен вернуть 200 и правильные headers, при этом контент (body) может быть любым

Вариант с CORSMiddleware правильный, но попробуй задать allow_origins=["*"], перезапусти бэк и отправь запрос через curl/postman/burp
Чекни ответ который получаешь (статус, 3 заголовка)

Рабочее демо:
JavaScript:
function test() {
    fetch(`http://localhost:8000/test`, {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({ id: 'test' })
    })
    .then(response => response.json())
    .then(data => {
        console.log(data)
    })
}
test()

Python:
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

@app.post("/test")
async def test():
    return {"message": "Hello World"}


Bash:
fastapi dev main.py
 
allow_origins=["*"], allow_credentials=True,
Прошу прощения за оффтоп, но считаю важным озвучить.
То что ты написал это CORS missconfig, при помощи которого потом стянут твои куки. Не делайте так. Если cookie не используются для авторизации, то уберите allow_credentials. В allow_origins не используйте подстановочные знаки.
 
Последнее редактирование:


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх