---
title: "Muhammad Ali Mughal (@ali978123) | Hashnode"
description: "Muhammad Ali Mughal (@ali978123) writes on Hashnode. Read their latest articles and follow their work."
url: "https://hashnode.com/@ali978123"
---

@ali978123

# Muhammad Ali Mughal

@ali978123 · Joined September 2026

## Comments

[Thanks Damiano, the frame-ancestors pairing is a great addition: Permissions-Policy limits what my embeds can do, frame-ancestors limits who can embed me, and clickjacking lives entirely in the second one. One nuance on the top-document point: a deny-all like camera=() does apply to the top document too, so even a tag-manager script running in your origin gets a policy error on getUserMedia. Where you're right is the moment you allow (self): that script runs as you, so the header can't tell it apart from your own code. At that point script governance (strict CSP script-src, SRI, keeping third parties off your origin) is the only real control. Two headers, two threat models, plus script hygiene for whatever you allow as self.](https://hashnode.com/posts/permissions-policy-lock-down-camera-mic-geo/6af042addf2b54a9a3c678e8/comment/6af049b18d248d57ac6c5bf2#reply-6af056da0cb1f95cfd076010)

Reply · Article · 4d ago · [Permissions-Policy: Lock Down Camera, Mic & Geo](https://hashnode.com/posts/permissions-policy-lock-down-camera-mic-geo/6af042addf2b54a9a3c678e8)

[Thanks Ahmet — that's a real hole in the snippet. Cache::add keyed only on host + path + date means the first response of the day wins, so a later call on the same path with an earlier Sunset (or a second pinned version that shares the path) never gets logged. I'd tighten the key the way you suggest: include the configured API version and a hash of the Deprecation, Sunset, and Link values. Each distinct notice still logs once; identical repeats stay quiet. A small aggregator can then roll those distinct keys up for the owner instead of one line per request. A fixture that hits the same path twice with two different Sunset dates is exactly the right regression: both obligations should reach the register, and matching headers should still dedupe.](https://hashnode.com/posts/third-party-api-deprecations-catch-them-before-prod/6aef1c75fbc11263e07871b4/comment/6aefedbd79d2cc6736b2bf6c#reply-6aeff44ded2d82a0b04d7580)

Reply · Article · 4d ago · [Third-Party API Deprecations: Catch Them Before Prod](https://hashnode.com/posts/third-party-api-deprecations-catch-them-before-prod/6aef1c75fbc11263e07871b4)

[For a subdomain that needs a different CA, publish a CAA set on that subdomain (or on the delegated zone apex) listing only that party's CA. CAs walk from the requested name upward and stop at the first CAA set, so the subdomain record overrides the apex for that name without loosening apex policy. Two caveats: if you CNAME \_acme-challenge elsewhere, accounturi / dns-01 restrictions only help if you control that target zone; and keep TTL short while you change things so a mistaken widen rolls back quickly. Agree on the monitoring point too — alert when CT shows an issuer outside the effective CAA set for that name.](https://hashnode.com/posts/caa-records-and-ct-logs-control-who-issues-your-certs/6ae8258b83f0245a0bc745e6/comment/6ae8453f1653169a5ec1e6f2#reply-6aedf0d6b0c4cbbd70b6b387)

Reply · Article · 6d ago · [CAA Records and CT Logs: Control Who Issues Your Certs](https://hashnode.com/posts/caa-records-and-ct-logs-control-who-issues-your-certs/6ae8258b83f0245a0bc745e6)

[Agreed — TOFU is the real ceiling. The article already flags the first-fetch weak spot, but you're right that the FAQ's DANE comparison should call out the refresh window too: once max\_age expires, the next policy fetch is another TOFU moment. That's exactly why stage 4 bumps max\_age only after enforce looks clean, and why DANE's DNSSEC anchor is a different trust story. I'll tighten that FAQ line. Thanks for spelling it out.](https://hashnode.com/posts/mta-sts-and-tls-rpt-enforce-tls-for-inbound-email/6ae9ae3d92606ae0be99e04a/comment/6ae9b493df2fb62ef87d1634#reply-6ae9c0eb8d6d660ccf00c929)

Reply · Article · Nov 3 · [MTA-STS and TLS-RPT: Enforce TLS for Inbound Email](https://hashnode.com/posts/mta-sts-and-tls-rpt-enforce-tls-for-inbound-email/6ae9ae3d92606ae0be99e04a)

[Thanks Ramsha, glad that point landed. I'd put Cloudways or Kinsta style hosts in the middle tier: they're a managed layer on top of a VPS, so provisioning, patching, backups and staging are handled, while you still own app config, queues, workers and scaling decisions. Ops time drops sharply and cost stays closer to a raw VPS than a full PaaS. Laravel Cloud sits nearer a true PaaS for Laravel, with managed scaling, queues and databases and no server access, so it costs more per unit but needs almost no ops. My rule of thumb: price your ops hours honestly first. A managed host usually wins for small teams with steady traffic, a PaaS for spiky traffic or teams with no ops capacity, and a raw VPS only when someone already owns ops.](https://hashnode.com/posts/vps-vs-managed-paas-for-laravel-node-saas-real-tco/6ae03cae0130645d01b3080c/comment/6ae5f13f8f1da46456ac1ffb#reply-6ae611210478ccae7360ba58)

Reply · Article · Oct 31 · [VPS vs Managed PaaS for Laravel & Node SaaS: Real TCO](https://hashnode.com/posts/vps-vs-managed-paas-for-laravel-node-saas-real-tco/6ae03cae0130645d01b3080c)

[Thanks, that's a solid checklist. One more nginx gotcha that bites a lot of header audits: add\_header directives are only inherited from the parent level if the current location block defines none of its own, so adding a single header inside a location can silently drop HSTS and CSP set at the server level. Adding the always flag also matters, otherwise the headers are skipped on 4xx and 5xx responses. Running curl -I against a few error pages as well as the homepage catches both.](https://hashnode.com/posts/how-to-audit-http-security-headers-csp-hsts-more/6addb85676ce72f6a3cf7b89/comment/6ae523083053abf345b04570#reply-6ae5304aac3dd9a37fc334c6)

Reply · Article · Oct 31 · [How to Audit HTTP Security Headers (CSP, HSTS & More)](https://hashnode.com/posts/how-to-audit-http-security-headers-csp-hsts-more/6addb85676ce72f6a3cf7b89)

[Thanks, that's the test I lean on most too. When two teams would price the same document very differently, the gap is almost always in unstated assumptions: third-party integrations, data migration, who supplies content, and what counts as accepted. Writing those down as explicit assumptions and exclusions is usually what turns a guess into a quote that holds up. On your question, I'd keep the exclusions as their own clearly labeled section inside the scope document, so they're read and signed off together with what's included. Thanks for the thoughtful comment.](https://hashnode.com/posts/software-project-estimation-scoping-quotes-that-hold-up/6ae0b943e879534b54e52c51/comment/6ae15f41e02beacc483e1137#reply-6ae4b402a536be2ed7cf8fae)

Reply · Article · Oct 30 · [Software Project Estimation: Scoping Quotes That Hold Up](https://hashnode.com/posts/software-project-estimation-scoping-quotes-that-hold-up/6ae0b943e879534b54e52c51)

[Exactly, that one catches a lot of audits. Nginx only inherits add\_header from the parent level when the current block defines none, so adding a single Cache-Control header in a static-assets location quietly drops every security header there. To answer your question: I sample separately, not just the final 200. What's worked for me is keeping the security headers in one include snippet and pulling it into every block that uses add\_header, adding the always parameter so they're also sent on 4xx and 5xx responses, and auditing a static asset, a PHP/FastCGI route, a 404 and a redirect. Good point on HSTS only counting on the HTTPS response, and on the edge needing to emit the same set. Thanks for spelling it out.](https://hashnode.com/posts/how-to-audit-http-security-headers-csp-hsts-more/6addb85676ce72f6a3cf7b89/comment/6ae4aefe7d7c70bb372775b3#reply-6ae4b3f1a536be2ed7cf8edf)

Reply · Article · Oct 30 · [How to Audit HTTP Security Headers (CSP, HSTS & More)](https://hashnode.com/posts/how-to-audit-http-security-headers-csp-hsts-more/6addb85676ce72f6a3cf7b89)
