CORS ແລະລິ້ງທີ່ໝົດອາຍຸ.
ອະນຸຍາດ origins ຢ່າງຊັດເຈນ ແລະຜູກລາຍເຊັນກັບ URL/method/purpose.
1. CORS ສຳລັບ API ທີ່ເລືອກ
ຕິດຕັ້ງ Cors ກ່ອນ route dispatch ແລະກ່ອນ middleware ທີ່ອາດປະຕິເສດ preflight. ໃຊ້ exact HTTPS origins; ບໍ່ມີ wildcard. pathPrefix ກົງກັບ path ນັ້ນແລະ subtree ເທົ່ານັ້ນ. ເປີດ credentials ເມື່ອອອກແບບ session/CSRF ຮອງຮັບແລ້ວ. ຖ້າ request ສົ່ງ Origin ຂອງ same-origin ເອງ ກໍຕ້ອງຢູ່ allowlist. RequestContext/Errors/RequestGuard ຄວນກວດ host, request bounds ແລະ security headers ກ່ອນ Cors; ວາງ Cors ກ່ອນ route authentication ເພື່ອຮັບ preflight. ຕົວຢ່າງນີ້ໃຊ້ໄດ້ໃນແອັບທີ່ທ່ານກຳນົດ bootstrap ເອງ.
use Icom\Middleware\Cors;
$app->use(new Cors(
pathPrefix: '/api/v1',
allowedOrigins: ['https://app.example'],
allowedMethods: ['GET', 'HEAD'],
allowedHeaders: [],
exposedHeaders: ['X-Request-ID'],
credentials: false,
maxAge: 600,
));2. CORS ບໍ່ທົດແທນ authentication
CORS ຄວບຄຸມການອ່ານຂໍ້ມູນຂອງ browser; non-browser client ຍັງສົ່ງ request ໄດ້. ການຜ່ານ preflight ຢືນຢັນ configured policy, ບໍ່ຢືນຢັນວ່າ route ມີຢູ່ຫຼື user ມີສິດ. ຮັກສາ Vary headers ເພື່ອ cache ບໍ່ເອົາຄຳຕອບປົນ origins. CSRF middleware ທີ່ມີຢູ່ຍັງປະຕິເສດ foreign-origin mutation; ການເພີ່ມ CORS ບໍ່ປິດ CSRF. ໃນ 0.10 ຄຳຕອບ error ຈາກ handler ຍັງຮັກສາ Vary ແລະສິດອ່ານຂອງ origin ທີ່ອະນຸຍາດ ຜ່ານ Errors ຊັ້ນນອກ; origin ທີ່ຖືກປະຕິເສດບໍ່ໄດ້ຮັບ grant.
3. ສ້າງລິ້ງມີອາຍຸ
ໃຊ້ raw APP_KEY 32 bytes ຈາກ config ທີ່ decode ແລ້ວ; ຢ່າ hardcode production key. SignedUrl ແຍກ HMAC key ຕາມ purpose, ຜູກ trusted origin, method, path, canonical query ແລະ expiry. ຕົວຢ່າງນີ້ມີອາຍຸ5ນາທີ; maxTtl ຈຳກັດອາຍຸສູງສຸດ.
use Icom\Security\SignedUrl;
use Icom\Middleware\ValidateSignature;
$links = new SignedUrl($rawAppKey, 'https://your-app.example', 'reports', maxTtl: 900);
// First authorize the account/tenant for report 123.
$url = $links->sign('/reports/123', time() + 300);
// $authenticate is your application's authentication middleware.
// ReportController::download must also check the report's owner/tenant.
$app->get('/reports/{id}', [ReportController::class, 'download'])
->middleware(new ValidateSignature($links))
->middleware($authenticate);
// Keep the standard outer application Errors middleware.
// Never print keys or signed links to public logs.4. ຂອບເຂດຂອງລາຍເຊັນ
Query ຮອງຮັບ flat string/int ກັບ ASCII keys; duplicate keys, reserved keys ແລະ ambiguous encoding ຖືກປະຕິເສດ. GET signature ໃຊ້ HEAD ໄດ້; HEAD-only signature ໃຊ້ GET ບໍ່ໄດ້. Method ອື່ນຕ້ອງກົງກັນ. ລາຍເຊັນບໍ່ປົກປິດ query ແລະບໍ່ຜູກ request body. ລິ້ງໃຊ້ຊ້ຳໄດ້ຈົນໝົດອາຍຸ; one-time/revocation ຕ້ອງມີ server state. ValidateSignature ໃຫ້ no-store/no-referrer. ກວດ resource policy ກ່ອນຄືນຂໍ້ມູນສ່ວນຕົວ. ການແກ້ APP_KEY ເຮັດໃຫ້ລິ້ງເກົ່າໃຊ້ບໍ່ໄດ້; ຢ່າ rotate key ໂດຍບໍ່ວາງແຜນ. expires/signature ເປັນ reserved query names. ການສະຫຼັບລຳດັບ query, ໃຊ້ + ແທນ %20 ຫຼື double encoding ເຮັດໃຫ້ verify ບໍ່ຜ່ານ; ຄ່າ query ບໍ່ຮັບ literal %. maxTtl ຄ່າເລີ່ມຕົ້ນແມ່ນ 86,400 ວິນາທີ; ຕັ້ງໄດ້ 1–2,592,000 ວິນາທີ.
5. ຂໍ້ມູນທີ່ລາຍເຊັນຢືນຢັນ
verify($request) ກວດ raw URI ແລະ request target; ບໍ່ຮັບຮອງຄ່າ getQueryParams() ທີ່ adapter ຫຼື middleware ອື່ນປ່ຽນແຍກຈາກ URI. ຢ່າ rewrite path/query ຫຼັງກວດລາຍເຊັນ, ແລະກວດ parser/adapter ໃຫ້ໄດ້ຄ່າກົງ raw query. ຕົວຢ່າງໃຊ້ report ID ຈາກ signed path ແລະກວດ owner/tenant ທຸກຄັ້ງ. ຫ້າມໃຊ້ GET/HEAD ເພື່ອແກ້ຂໍ້ມູນ, ລຶບໄຟລ໌ ຫຼືອະນຸມັດທຸລະກຳ; method ທີ່ຂຽນຂໍ້ມູນຍັງຕ້ອງມີ authentication, CSRF/authorization ແລະ body validation ຂອງມັນ.
6. ຮັກສາລິ້ງເປັນຂໍ້ມູນສ່ວນຕົວ
ValidateSignature ໃຫ້ private, no-store ແລະ no-referrer ທັງ response ປົກກະຕິ, HttpException ແລະ unexpected failure. ໃນ 0.10 ໃຊ້ Errors middleware ຊັ້ນນອກມາດຕະຖານໄດ້ເລີຍ; ບໍ່ຕ້ອງເພີ່ມ Errors ອີກຊັ້ນຫຼັງ ValidateSignature. ກວດ HTTP 401/403/500 ຈິງດ້ວຍ. ຕັ້ງ web-server, reverse proxy, CDN, analytics ແລະ tracing ໃຫ້ບໍ່ເກັບ raw query ຂອງ signed routes; application request logger ບໍ່ເກັບ URL ແຕ່ບໍ່ຄວບຄຸມ access logs ຊັ້ນອື່ນ. ຢ່າໃສ່ secret ຫຼືຂໍ້ມູນສ່ວນຕົວໃນ URL; ລິ້ງອາດຄ້າງໃນ browser history, bookmarks ຫຼືຂໍ້ຄວາມທີ່ຖືກສົ່ງຕໍ່.
7. ທົດສອບກ່ອນເປີດ
ທົດສອບ origin/method/header ທີ່ອະນຸຍາດແລະປະຕິເສດ, cache Vary, CSRF, tampering, expiry, wrong origin/purpose ແລະການປົນ request ໃນ worker. HTTP loopback ຕ້ອງເປີດ allowHttpLoopback ເພື່ອ local test ເທົ່ານັ້ນ; production ໃຊ້ HTTPS.