<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:georss="http://www.georss.org/georss" 
	>
<channel>
	<title>
	Comments on: LH Beacon	</title>
	<atom:link href="https://lhero.org/portfolio/lh-beacon/feed/" rel="self" type="application/rss+xml" />
	<link>https://lhero.org/portfolio/lh-beacon/</link>
	<description>Helping Organisations get organised!</description>
	<lastBuildDate>Sun, 11 Oct 2026 05:18:19 +0000</lastBuildDate>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>
		By: Peter Shaw		</title>
		<link>https://lhero.org/portfolio/lh-beacon/#comment-1537192</link>

		<dc:creator><![CDATA[Peter Shaw]]></dc:creator>
		<pubDate>Sun, 11 Oct 2026 05:18:19 +0000</pubDate>
		<guid isPermaLink="false">https://lhero.org/?post_type=lh-portfolio&#038;p=149600#comment-1537192</guid>

					<description><![CDATA[Refused beacons are now written to the debug log, so a missing or expired nonce shows up there like other nonce failures. Until now a refusal was a silent 403: LH WP Die Logger only reports nonce failures when wp_die() runs, which a REST refusal never does, and WordPress does not even announce a missing nonce. Each refusal is logged as a Warning tagged [lh_beacon] in the standard LH format: event beacon_refused, a reason (too_large, origin, rate_limited, invalid_shape, nonce_missing or nonce_invalid), the site, the Origin and Referer headers and the body size. Nonce refusals add the user ID from the login cookie and the beacon keys, and rate-limit refusals add the IP address. Payloads and the nonce itself are never logged. Logging only happens when WP_DEBUG is on, and can be switched off with the lh_beacon_return_plugin_debugging_status filter.]]></description>
			<content:encoded><![CDATA[<p>Refused beacons are now written to the debug log, so a missing or expired nonce shows up there like other nonce failures. Until now a refusal was a silent 403: LH WP Die Logger only reports nonce failures when wp_die() runs, which a REST refusal never does, and WordPress does not even announce a missing nonce. Each refusal is logged as a Warning tagged [lh_beacon] in the standard LH format: event beacon_refused, a reason (too_large, origin, rate_limited, invalid_shape, nonce_missing or nonce_invalid), the site, the Origin and Referer headers and the body size. Nonce refusals add the user ID from the login cookie and the beacon keys, and rate-limit refusals add the IP address. Payloads and the nonce itself are never logged. Logging only happens when WP_DEBUG is on, and can be switched off with the lh_beacon_return_plugin_debugging_status filter.</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: Peter Shaw		</title>
		<link>https://lhero.org/portfolio/lh-beacon/#comment-1537191</link>

		<dc:creator><![CDATA[Peter Shaw]]></dc:creator>
		<pubDate>Sun, 11 Oct 2026 05:08:10 +0000</pubDate>
		<guid isPermaLink="false">https://lhero.org/?post_type=lh-portfolio&#038;p=149600#comment-1537191</guid>

					<description><![CDATA[Every beacon must now carry a valid nonce, for logged-out visitors as well as logged-in ones. LH Beacon prints a nonce into the page with its settings and sends it in the request body. The collect route verifies it against the visitor the login cookie identifies (user 0 when logged out) and refuses the request with a 403 (lh_beacon_invalid_nonce) when it is missing or invalid; nothing is dispatched. The nonce goes in the body rather than the X-WP-Nonce header so that a stale one is refused by LH Beacon with its own error, not by the REST API&#039;s cookie check. This is defence in depth on top of the existing same-origin, size and rate checks: a beacon now has to come from a page this site served to that visitor within the nonce&#039;s lifetime. That lifetime is 12 to 24 hours, so pages must not be served from cache for longer than 12 hours: on LocalHero the LiteSpeed public cache TTL was cut from 7 days to 12 hours alongside this release. A beacon from a page left open past its nonce&#039;s lifetime is refused, so a little long-tail data is lost. The lh_beacon_require_nonce filter can switch the check off in an emergency. The lh_beacon_get_user_id filter now runs after the nonce has been checked against the real cookie user, so anonymising the ID no longer affects verification.]]></description>
			<content:encoded><![CDATA[<p>Every beacon must now carry a valid nonce, for logged-out visitors as well as logged-in ones. LH Beacon prints a nonce into the page with its settings and sends it in the request body. The collect route verifies it against the visitor the login cookie identifies (user 0 when logged out) and refuses the request with a 403 (lh_beacon_invalid_nonce) when it is missing or invalid; nothing is dispatched. The nonce goes in the body rather than the X-WP-Nonce header so that a stale one is refused by LH Beacon with its own error, not by the REST API&#8217;s cookie check. This is defence in depth on top of the existing same-origin, size and rate checks: a beacon now has to come from a page this site served to that visitor within the nonce&#8217;s lifetime. That lifetime is 12 to 24 hours, so pages must not be served from cache for longer than 12 hours: on LocalHero the LiteSpeed public cache TTL was cut from 7 days to 12 hours alongside this release. A beacon from a page left open past its nonce&#8217;s lifetime is refused, so a little long-tail data is lost. The lh_beacon_require_nonce filter can switch the check off in an emergency. The lh_beacon_get_user_id filter now runs after the nonce has been checked against the real cookie user, so anonymising the ID no longer affects verification.</p>
]]></content:encoded>
		
			</item>
	</channel>
</rss>
