بعد از این درس دقیقاً چه بلدی؟
- موضوع «HMAC signature» را با زبان ساده برای فرد دیگری توضیح میدهی.
- مثال همین درس را خطبهخط میخوانی و خروجی آن را پیشبینی میکنی.
- کد را تغییر میدهی، نتیجه یا ساختار آن را بررسی میکنی و خطا را مرحلهای اصلاح میکنی.
نامه سفارشی با مهر و شماره پیگیری
مهر فرستنده را ثابت میکند و شماره پیگیری جلوی ثبت دوباره همان نامه را میگیرد.
Webhook درخواست ورودی از سرویس دیگر است و ممکن است تکرار یا با تأخیر برسد. امضا اصالت، Idempotency تکرار و OpenAPI قرارداد API را مدیریت میکند.
چرا مهم است؟ این مفهوم یکی از آجرهای مسیر حرفهای PHP است. فعلاً لازم نیست همه جزئیات را حفظ کنی؛ باید دلیل استفاده و اثر هر خط را بفهمی.
اولین تمرین تو: سرور بدنه خام را با امضا بررسی، event_id را اتمی ثبت و سپس وضعیت سفارش را فقط یکبار تغییر میدهد.
اول بفهم، بعد کد بنویس
HMAC signature
با Secret مشترک یکپارچگی و اصالت پیام را بررسی میکند.
Event ID
شناسه یکتا برای تشخیص تحویل تکراری است.
OpenAPI
مسیر، ورودی و پاسخ API را ماشینخوان مستند میکند.
تأیید پرداخت
سرور بدنه خام را با امضا بررسی، event_id را اتمی ثبت و سپس وضعیت سفارش را فقط یکبار تغییر میدهد.
قطعهها را به ترتیب درست بچین
روی هر قطعه بزن تا وارد پاسخ شود؛ برای برگرداندن دوباره روی آن بزن. با دکمههای جابهجایی هم میتوانی بدون کشیدن و رهاکردن ترتیب را اصلاح کنی.
کد را کامل کن و ساختار آن را بررسی کن
این درس وارد قابلیتهای سروری یا حرفهای شده است. برای امنیت سایت، کد دلخواه روی سرور اجرا نمیشود؛ بررسیگر، وجود اجزای ضروری و منطق مورد انتظار را کنترل میکند و راهنمای اصلاح میدهد.
کد را کامل کن و «بررسی ساختار» را بزن.
این مثال خطبهخط چه میگوید؟
فعلاً حفظ نکن؛ هر خط را به یک جمله ساده تبدیل کن.
- 1
<?phpاز اینجا مفسر PHP شروع به خواندن کد میکند.
- 2
$body = file_get_contents("php://input");یک مقدار با نام $body نگهداری میشود تا در خطهای بعد دوباره استفاده شود.
- 3
$expected = hash_hmac("sha256", $body, $_ENV["WEBHOOK_SECRET"]);یک مقدار با نام $expected نگهداری میشود تا در خطهای بعد دوباره استفاده شود.
- 4
$received = $_SERVER["HTTP_X_SIGNATURE"] ?? "";یک مقدار با نام $received نگهداری میشود تا در خطهای بعد دوباره استفاده شود.
- 5
if (! hash_equals($expected, $received)) {یک پرسش درست/نادرست بررسی میشود و مسیر اجرای بعدی را تعیین میکند.
- 6
http_response_code(401);این خط بخشی از منطق اصلی مثال است؛ نامها و علامتها را از راست به چپ، بخشبهبخش بخوان.
- 7
exit;این خط بخشی از منطق اصلی مثال است؛ نامها و علامتها را از راست به چپ، بخشبهبخش بخوان.
- 8
}مرز یک بلوک یا فراخوانی در اینجا باز یا بسته میشود.
- 9
// event_id باید با محدودیت یکتا ثبت شود.این خط توضیح برنامهنویس است و اجرا نمیشود.
راهنماییها مرحلهای هستند؛ اول خودت پیام خطا را بخوان.
Timestamp امضا و محدودیت زمانی Replay را اضافه و Schema رویداد را در OpenAPI بنویس.
از ساده به چالشی، بدون پرش
یکی از مقدارهای مثال را عوض کن، خروجی را روی کاغذ حدس بزن و سپس بررسی کن.
Timestamp امضا و محدودیت زمانی Replay را اضافه و Schema رویداد را در OpenAPI بنویس.
سناریوی «تأیید پرداخت» را با نامهای واضحتر و یک حالت تازه گسترش بده.
این سه اشتباه را انجام نده
مقایسه امضا با ==
پردازش قبل از بررسی امضا
نداشتن Event ID یکتا برای تکرار
5 پرسش کوتاه؛ مطمئن شو واقعاً یاد گرفتهای
برای هر پرسش یک پاسخ انتخاب کن. بعد از هر انتخاب، دلیل پاسخ را همانجا میبینی.
چرا hash_equals استفاده میشود؟
کدام توضیح، «HMAC signature» را دقیقتر بیان میکند؟
بهترین قدم بعد از خواندن مثال این درس چیست؟
کدام روش نشان میدهد این درس را واقعاً فهمیدهای؟
کدام رفتار احتمال خطا را در همین موضوع بیشتر میکند؟
درس را فقط وقتی تمام کن که کد را تغییر دادهای
دیدن آموزش کافی نیست؛ یک مقدار را تغییر بده، خروجی را پیشبینی کن و بعد اجرا بزن.