<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	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:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Cisilino Site Defense Network - Matteo Cisilino</title>
	<atom:link href="https://www.cisilino.com/en/tag/cisilino-site-defense-network-en/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.cisilino.com/en/</link>
	<description>Guide su WordPress, server e sicurezza</description>
	<lastBuildDate>Fri, 30 Oct 2026 16:06:41 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.4</generator>
	<item>
		<title>Deactivation, uninstallation and personal data</title>
		<link>https://www.cisilino.com/en/2026/10/30/deactivation-uninstallation-personal-data/</link>
					<comments>https://www.cisilino.com/en/2026/10/30/deactivation-uninstallation-personal-data/#respond</comments>
		
		<dc:creator><![CDATA[matteocisilino]]></dc:creator>
		<pubDate>Fri, 30 Oct 2026 16:06:04 +0000</pubDate>
				<category><![CDATA[CSDN manual]]></category>
		<category><![CDATA[Cisilino Site Defense Network]]></category>
		<category><![CDATA[privacy]]></category>
		<guid isPermaLink="false">https://www.cisilino.com/?p=1058</guid>

					<description><![CDATA[<p>What happens when you deactivate or delete Cisilino Site Defense Network, which data stays, and how to list it in your privacy notice.</p>
<p>The post <a href="https://www.cisilino.com/en/2026/10/30/deactivation-uninstallation-personal-data/">Deactivation, uninstallation and personal data</a> first appeared on <a href="https://www.cisilino.com/en/">Matteo Cisilino</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Before you uninstall the plugin CSDN it&#8217;s worth knowing the difference between deactivating it and deleting it, because the consequences differ. Deactivation switches off the rules and keeps the data. Uninstallation deletes the plugin&#8217;s data from your site. At the end you&#8217;ll also find the list of personal data it processes, to mention in your privacy notice.</p>
<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" src="https://www.cisilino.com/wp-content/uploads/2026/10/manuale-csdn-disattivazione-disinstallazione.webp" alt="Diagram of the WordPress Installed Plugins screen to uninstall the plugin CSDN with Deactivate and Delete" width="1200" height="630"/></figure>
<h2>Where it is</h2>
<p>Open <strong>Plugins &gt; Installed Plugins</strong> (point 1 in the image). On the row for <strong>Cisilino Site Defense Network</strong> (point 3) you&#8217;ll find the <strong>Deactivate</strong> link. After deactivation (point 4) the same row shows <strong>Activate</strong> and <strong>Delete</strong>.</p>
<h2>What happens on deactivation</h2>
<p>Deactivating the plugin stops it without touching the data. On deactivation the plugin does four things.</p>
<ol>
<li>it logs the event “Plugin deactivated on this site” and tries to deliver it to the panel, if configured.</li>
<li>it cancels the three scheduled tasks.</li>
<li>it empties both <code>.htaccess</code> blocks, the blocked-IPs one and the hardening one.</li>
<li>it updates WordPress&#8217;s rewrite rules.</li>
</ol>
<p><strong>Warning:</strong> while deactivated, no rule stays in force. Blocked IPs can access the site again, and hardening no longer applies. The plugin isn&#8217;t even loaded, so the other protections don&#8217;t act either. The security headers stop too, though a browser that already received HSTS will remember it for the time that was set.</p>
<p>The database stays intact. If you reactivate the plugin, the <code>.htaccess</code> blocks are rebuilt, and you&#8217;ll find the settings exactly as you left them.</p>
<h2>How to uninstall the plugin</h2>
<p>To uninstall the plugin you need to press <strong>Delete</strong> in <strong>Installed Plugins</strong>, after deactivating it. Before you do, follow these steps.</p>
<ol>
<li>In the <strong>Activity log</strong> tab, check that the “awaiting delivery to the panel” row is at zero, if you use the panel.</li>
<li>In the <strong>Debug log</strong> tab, download any files you need. Then, if you want, press <strong>Delete all files</strong>.</li>
<li>Back up the site, if you haven&#8217;t already.</li>
<li>Deactivate the plugin and press <strong>Delete</strong>.</li>
</ol>
<h2>What gets removed and what stays</h2>
<p>When you choose to uninstall the plugin, it first logs “Plugin uninstalled from this site: local data removed” and tries to deliver that to the panel. Then it deletes everything, whatever happened with delivery.</p>
<p>The following is removed.</p>
<ul>
<li>the four tables <code>csdn_events</code>, <code>csdn_overrides</code>, <code>csdn_rate_hits</code> and <code>csdn_activity</code>.</li>
<li>almost every option whose name starts with <code>csdn_</code>, including the panel credentials, the whitelist and the tab settings. Three remain, listed below.</li>
<li>the rate limiting suspension data on every user.</li>
<li>the plugin&#8217;s temporary data.</li>
<li>the rules in the plugin&#8217;s two <code>.htaccess</code> blocks and the rewrite rules. The <code># BEGIN</code> and <code># END</code> markers stay in the file, empty.</li>
</ul>
<p>The following stays instead.</p>
<ul>
<li>the debug log files in the <code>csdn-debug-*</code> folder inside <code>uploads</code>, because they are your own data: delete them by hand, or with the <strong>Delete all files</strong> button, before uninstalling.</li>
<li>the history already delivered to the panel, which sits on the panel, not on your site.</li>
<li>the lines in <code>.htaccess</code> that sit outside the plugin&#8217;s markers.</li>
<li>three minor options: <code>csdn_registration_lock</code> (the User registration policy), <code>csdn_remote_ban_reasons</code> (the reasons for blocks received) and <code>csdn_trigger_token</code> (the token received from the panel). The user data <code>csdn_registration_blocked_at</code> also stays, if present, along with the temporary <code>csdn_rl_block_*</code> data, which expires on its own. These can be removed by hand from the database.</li>
</ul>
<p><strong>Warning:</strong> uninstalling the plugin also deletes the local activity log. Rows not yet delivered to the panel are lost if the panel doesn&#8217;t respond.</p>
<h2>Personal data processed by the plugin</h2>
<p>The plugin keeps its data on your own site, in the database. Never the password. Here&#8217;s what it processes.</p>
<ul>
<li><strong>Failed logins</strong>: IP address, username tried, number of attempts, first and last occurrence, and block status. There&#8217;s no automatic deletion: they stay in the database until you uninstall the plugin.</li>
<li><strong>Activity log</strong>: date and time, WordPress user (id, login, role), IP, type of action, the object involved (for content, its title) and a short description. In some cases it adds details: for a new user, the email and roles; for a profile edit, the previous and new values of email, login, display name and website. It doesn&#8217;t save the content of posts, comments or files. For options with a suspicious name, such as keys or tokens, it only logs that they changed.</li>
<li><strong>Rate limiting</strong>: the IP and type of submission from guests, kept for one day. Author suspensions sit in the user&#8217;s own data.</li>
<li><strong>IP overrides, whitelist and the blacklist received</strong>.</li>
<li><strong>Debug log</strong>, if you switch it on: files that can contain paths and fragments of data.</li>
</ul>
<p>The local log keeps 30 days by default, and at most 500 rows. You can change both values in the <strong>Activity log</strong> tab.</p>
<h3>What leaves the site</h3>
<p>Only if you connect the panel. Every 15 minutes the plugin sends the failed logins: IP, username, outcome “failed” and date. It sends up to 200 at a time. It adds the customer code and the site&#8217;s URL. It receives the blocked IPs. The activity log, with the details above, is normally sent straight away, at the end of the request, and whatever is left queued goes out with the 15-minute round. It only runs if both the log and the “Send activity to the panel” option are on. Manual overrides are never sent.</p>
<h3>What to write in your privacy notice</h3>
<p>For as long as you haven&#8217;t decided to uninstall the plugin, your site&#8217;s privacy notice should mention at least these points.</p>
<ul>
<li>that the site logs the IP and username of failed login attempts, for security reasons.</li>
<li>that it keeps a log of user actions, with IP addresses, and for how many days it keeps them.</li>
<li>that, if you&#8217;ve connected the panel, some of this data is sent to the external service.</li>
<li>who the data controller is, and how users can exercise their rights.</li>
</ul>
<p>Adapt the text to your own situation, with your advisor if you have one: this manual is no substitute for legal advice. For the basics on plugins, the <a href="https://wordpress.org/documentation/article/manage-plugins/" target="_blank" rel="noopener">official WordPress guide</a> also explains the difference between deactivating and deleting.</p>
<h2>If something goes wrong</h2>
<p>If the site shows an error after deactivation, check <code>.htaccess</code> via FTP and see the chapter <a href="https://www.cisilino.com/en/?p=986">Troubleshooting and frequently asked questions</a>. If you decided to uninstall the plugin by mistake, the local data doesn&#8217;t come back: you&#8217;ll need a site backup.</p>
<p>Previous chapter: <a href="https://www.cisilino.com/en/?p=986">Troubleshooting and frequently asked questions</a>. Back to the index with the <a href="https://www.cisilino.com/en/?p=972">introduction to the CSDN manual</a>.</p><p>The post <a href="https://www.cisilino.com/en/2026/10/30/deactivation-uninstallation-personal-data/">Deactivation, uninstallation and personal data</a> first appeared on <a href="https://www.cisilino.com/en/">Matteo Cisilino</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.cisilino.com/en/2026/10/30/deactivation-uninstallation-personal-data/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Troubleshooting CSDN: FAQ</title>
		<link>https://www.cisilino.com/en/2026/10/30/troubleshooting-csdn-faq/</link>
					<comments>https://www.cisilino.com/en/2026/10/30/troubleshooting-csdn-faq/#respond</comments>
		
		<dc:creator><![CDATA[matteocisilino]]></dc:creator>
		<pubDate>Fri, 30 Oct 2026 16:06:02 +0000</pubDate>
				<category><![CDATA[CSDN manual]]></category>
		<category><![CDATA[Cisilino Site Defense Network]]></category>
		<category><![CDATA[frequently asked questions]]></category>
		<guid isPermaLink="false">https://www.cisilino.com/?p=1057</guid>

					<description><![CDATA[<p>Solutions to the typical problems with Cisilino Site Defense Network: blocks, 500 errors, suspensions, the panel and logs.</p>
<p>The post <a href="https://www.cisilino.com/en/2026/10/30/troubleshooting-csdn-faq/">Troubleshooting CSDN: FAQ</a> first appeared on <a href="https://www.cisilino.com/en/">Matteo Cisilino</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>This troubleshooting CSDN page collects the situations where Cisilino Site Defense Network can cause you trouble, with the fix for each one. You&#8217;ll need it if you&#8217;ve locked yourself out, if the site responds with a 500 error, or if a user can no longer publish. The answers are organised as frequently asked questions.</p>
<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cisilino.com/wp-content/uploads/2026/10/manuale-csdn-risoluzione-problemi.webp" alt="Checklist for troubleshooting CSDN, with the steps to follow" width="1200" height="630"/></figure>
<h2>Troubleshooting CSDN: where to start</h2>
<p>Before hunting for the exact answer, run through this checklist.</p>
<ol>
<li>Can you still open <code>wp-admin</code>? If so, almost everything can be fixed from the plugin&#8217;s Settings page.</li>
<li>Read the notices at the top. The plugin explains the outcome of its actions in coloured boxes.</li>
<li>Remember the last thing you changed: a hardening rule, a policy, a limit.</li>
<li>If there&#8217;s a <strong>Check now</strong> button, use it before guessing.</li>
<li>If you can no longer get into the site, get your FTP access or the hosting&#8217;s file manager ready.</li>
</ol>
<h2>Logins and blocks</h2>
<h3>I&#8217;ve locked myself out: what do I do?</h3>
<p>If you still have access to WordPress, for example from your phone on mobile data, open the <strong>Blocked IPs</strong> tab. Find your IP and press <strong>Unblock</strong>. If your IP isn&#8217;t listed but you&#8217;re still blocked (which can come from the optional security list), go to the <strong>General</strong> tab, “Local IP overrides” section: enter the IP, choose “Always unblock (unban)” and press <strong>Save override</strong>. Then, in the <strong>General</strong> tab, press <strong>Add to whitelist</strong>.</p>
<p>If you&#8217;re blocked from the site too, and see a 403 error, log in via FTP and open <code>.htaccess</code>. Remove the line with your IP, or the whole block between <code># BEGIN Cisilino Site Defense Network</code> and <code># END Cisilino Site Defense Network</code>.</p>
<p><strong>Warning:</strong> the manual edit is temporary. The same source will rewrite the block at the next event: a failed login, a sync, or the 15-minute round. As soon as you&#8217;re back in, use <strong>Unblock</strong> and the whitelist.</p>
<h3>Why didn&#8217;t the whitelist unblock me?</h3>
<p>The whitelist only stops failed logins from being counted. It doesn&#8217;t remove blocks already in place. To remove a block you need <strong>Unblock</strong>, which creates a permanent unblock override on this site.</p>
<h3>A legitimate user has been blocked</h3>
<p>The attempts counter is cumulative per IP and never resets on its own. Even scattered mistakes over weeks can reach the threshold, which defaults to 10. Unblock the IP and whitelist it, or raise the threshold in <strong>Remote settings</strong>, where the field is called “Local block threshold (failed attempts)”.</p>
<h3>An IP&#8217;s block never ends</h3>
<p>A local block doesn&#8217;t expire. A manual block expires after the chosen duration, from 1 hour to 7 days. If you chose “Permanent (until you remove it)”, it doesn&#8217;t expire. A block received from the panel disappears once the panel removes it from the list. A timed unblock, once it expires, brings the block back if the original source is still there. For a definitive unblock use <strong>Unblock</strong>, which is permanent.</p>
<h3>Blocks look odd behind a proxy or a CDN</h3>
<p>The plugin reads the IP only from <code>REMOTE_ADDR</code> and ignores the <code>X-Forwarded-For</code> header, because it can be forged. Look at the line “Your current IP is …” under the <strong>IP address</strong> field in the <strong>General</strong> tab. If it isn&#8217;t your public IP, the plugin is seeing the proxy&#8217;s address. In that case, avoid blocking or whitelisting that address until you&#8217;ve sorted it out with whoever manages the proxy.</p>
<h2>Errors after the .htaccess rules</h2>
<p>This part of troubleshooting CSDN covers rules written to the server&#8217;s own file.</p>
<h3>The site shows a 500 error after saving the hardening rules</h3>
<p>The plugin makes no copy of <code>.htaccess</code> and doesn&#8217;t check the syntax after writing it. An error, or a rule your server doesn&#8217;t accept, shows up straight away as a 500 error.</p>
<ol>
<li>Log in via FTP or the file manager.</li>
<li>Make a copy of <code>.htaccess</code>.</li>
<li>Delete the block between <code># BEGIN Cisilino Site Defense Network - Hardening</code> and <code># END Cisilino Site Defense Network - Hardening</code>.</li>
<li>Reload the site, then correct the settings in the <strong>Hardening / IDS</strong> tab.</li>
</ol>
<p>The hardening block is only rewritten when you save that tab or reactivate the plugin, not by the 15-minute round. Your manual fix therefore stays in place.</p>
<h3>I wrote a custom path and the whole site gives a 403</h3>
<p>In the custom paths box, every line is literal text, with no wildcards. The rule blocks any address containing that string. Writing <code>/</code> or <code>wp</code> blocks everything, including <code>wp-admin</code>. Remove the hardening block via FTP, as above. Then, in the <strong>Hardening / IDS</strong> tab, fix or empty the “Custom paths to block” box and save. If you don&#8217;t fix it, a new save or a plugin reactivation will rewrite the rule, and the site will go back to giving a 403.</p>
<h3>You see “Settings saved, but writing to .htaccess failed”</h3>
<p>The <code>.htaccess</code> file isn&#8217;t writable: check the permissions. The rules in that block aren&#8217;t active. The two switches that act in PHP, meaning XML-RPC and <code>?author=N</code>, stay active regardless.</p>
<h3>The test says the PHP block in uploads doesn&#8217;t work</h3>
<p>In the <strong>Test</strong> tab, the “Check PHP execution block in uploads” box reports whether the test file was executed. Check that your hosting allows <code>.htaccess</code> in that folder, and that there&#8217;s no more specific <code>&lt;Directory&gt;</code> block. On nginx the rules have no effect. The rule only covers the standard <code>uploads</code> folder.</p>
<h3>A plugin or the theme has stopped working</h3>
<p>Switch off the last rule you turned on and save. The most common cases: blocking PHP in <code>uploads</code> breaks plugins that write PHP files there; disabling XML-RPC stops remote apps and functions; blocking executable uploads also rejects files such as <code>.svg</code>.</p>
<h2>Users, authors and visitors</h2>
<h3>An author can no longer publish: “your account is suspended”</h3>
<p>Rate limiting has seen too much content created too quickly. By default the limit is 150 items in 300 seconds, with a 3600-second suspension. From the <strong>Rate limiting</strong> tab, in the suspended users table, press <strong>Revoke suspension</strong>. Otherwise, wait for it to expire.</p>
<p>Switching off “Rate limit active” doesn&#8217;t remove a suspension already under way. Before a large import, raise the limit N or switch off the cap.</p>
<h3>A visitor sees “Too many submissions”</h3>
<p>A guest has sent too many comments or forms too quickly: more than 2 in 60 seconds by default, with a 3600-second block. The block is by IP, so it can hit several people in the same office. Raise the N value in the visitors section. There&#8217;s no list of exceptions.</p>
<h3>I can&#8217;t create an editor or administrator user</h3>
<p>That&#8217;s intentional. The default <strong>User registration</strong> policy is “Low-privilege roles only”, and it makes no exception, not even for you. Switch temporarily to “No restriction”, create the user, then switch back. With “No registration (exclusive)” nobody can create users. Also check the default role under Settings &gt; General in WordPress: if it&#8217;s a forbidden role, registrations are rejected.</p>
<h2>Connecting to the panel</h2>
<h3>The panel connection doesn&#8217;t show</h3>
<p>The status is in the “Panel connection status:” box at the top of the <strong>Remote settings</strong> tab. If the box is missing, the fields were incomplete: you need the Customer code, the API key and the Panel URL. After “Save and verify connection” no separate banner appears.</p>
<ul>
<li>“Panel URL not secure: https is required …”: the address must start with <code>https</code>. The plugin also refuses to save an http URL.</li>
<li>“Authentication rejected by the panel: customer_code or API key incorrect.”: double-check both values.</li>
<li>“Unable to reach the panel: …”: a network, DNS or certificate problem.</li>
<li>“Invalid response from the panel (not JSON).”: the address doesn&#8217;t point to the right panel.</li>
</ul>
<p>If the panel doesn&#8217;t respond, local protection carries on and the queued data is sent on the next round. The plugin works even without the panel.</p>
<h3>Activity isn&#8217;t reaching the panel</h3>
<p>In the <strong>Activity log</strong> tab, look at the diagnostics table and the “awaiting delivery to the panel” row. Press <strong>Try sending now</strong>: the result appears in the diagnostics. The row cap, 500 by default, deletes the oldest ones even if they haven&#8217;t been delivered.</p>
<h2>Debug log, integrity and headers</h2>
<h3>The debug log won&#8217;t turn on</h3>
<p>There are two possible messages. “the uploads folder is not writable”: fix the permissions on <code>uploads</code>. “the files in its folder appear reachable from the internet”: probably a server with no <code>.htaccess</code>, such as nginx. Block access to the <code>csdn-debug-*</code> folder in the server configuration and try again. If the log stopped because of the 200 MB cap, download or delete the files and turn it back on.</p>
<h3>Integrity says “the plugin&#8217;s files do not match”</h3>
<p>If you&#8217;ve edited a plugin file by hand, that&#8217;s normal. Otherwise, treat the site as potentially compromised: reinstall the plugin from a trusted copy and check the rest. If the message says there&#8217;s no reference at all, reactivate the plugin to take a new snapshot.</p>
<h3>HSTS won&#8217;t turn on, or won&#8217;t turn off</h3>
<p>To turn it on you must open the plugin&#8217;s settings over https, otherwise you&#8217;ll see “HSTS was NOT activated”. Always save from an https page. Unticking the box stops the header being sent, but browsers that already received it will remember it for a long time.</p>
<h2>If you can&#8217;t find the answer</h2>
<p>If this troubleshooting CSDN page isn&#8217;t enough, turn on the debug log, reproduce the problem and read the entry. Then open a discussion on the <a href="https://wordpress.org/support/plugin/cisilino-site-defense-network/" target="_blank" rel="noopener">plugin&#8217;s support forum</a>: it&#8217;s the place to get help and see problems already reported. Don&#8217;t paste server paths or sensitive data.</p>
<p>Previous chapter: <a href="https://www.cisilino.com/en/?p=985">Debug log: PHP errors in their own file</a>. Next chapter: <a href="https://www.cisilino.com/en/?p=987">Deactivation, uninstallation and personal data</a>. For the index: <a href="https://www.cisilino.com/en/?p=972">the CSDN manual</a>.</p><p>The post <a href="https://www.cisilino.com/en/2026/10/30/troubleshooting-csdn-faq/">Troubleshooting CSDN: FAQ</a> first appeared on <a href="https://www.cisilino.com/en/">Matteo Cisilino</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.cisilino.com/en/2026/10/30/troubleshooting-csdn-faq/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Debug log: PHP errors in their own file</title>
		<link>https://www.cisilino.com/en/2026/10/30/debug-log-php-errors-their-own-file/</link>
					<comments>https://www.cisilino.com/en/2026/10/30/debug-log-php-errors-their-own-file/#respond</comments>
		
		<dc:creator><![CDATA[matteocisilino]]></dc:creator>
		<pubDate>Fri, 30 Oct 2026 16:05:59 +0000</pubDate>
				<category><![CDATA[CSDN manual]]></category>
		<category><![CDATA[Cisilino Site Defense Network]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[PHP errors]]></category>
		<guid isPermaLink="false">https://www.cisilino.com/?p=1056</guid>

					<description><![CDATA[<p>How to turn on the Debug log tab of the plugin CSDN since version 1.0.15: duration, file size, rotation, downloads and limits.</p>
<p>The post <a href="https://www.cisilino.com/en/2026/10/30/debug-log-php-errors-their-own-file/">Debug log: PHP errors in their own file</a> first appeared on <a href="https://www.cisilino.com/en/">Matteo Cisilino</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>The WordPress debug log is a new feature in the CSDN plugin since version 1.0.15. It logs the site&#8217;s PHP errors into its own file, without touching <code>wp-config.php</code>. You switch it on from the backend, and it switches itself off.</p>
<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cisilino.com/wp-content/uploads/2026/10/manuale-csdn-log-di-debug.webp" alt="Diagram of WordPress with the WordPress debug log tab of the plugin CSDN highlighted" width="1200" height="630"/></figure>
<h2>Where it is</h2>
<p>Go to Settings &gt; Cisilino Site Defense Network (point 1 in the image) and open the <strong>Debug log</strong> tab (point 2). There are three sections:</p>
<ul>
<li>point 3: “Site debug log”, with status and activation.</li>
<li>point 4: “Collected files”.</li>
<li>point 5: “Latest entries”.</li>
</ul>
<h2>What the WordPress debug log is for</h2>
<p>It comes in useful when the site shows a blank page or a critical error, when something breaks after an update, or when your hosting won&#8217;t let you edit <code>wp-config.php</code> or read the logs. The <code>WP_DEBUG</code> and <code>WP_DEBUG_LOG</code> constants are defined before the plugins load, so a plugin can&#8217;t turn them on. This log instead uses a PHP error handler hooked onto the plugin&#8217;s own loading.</p>
<p>This log adds to things, it doesn&#8217;t replace anything. Errors keep arriving wherever they arrived before, meaning <code>debug.log</code> and the server log. It sends nothing to the panel.</p>
<h2>How to use it</h2>
<ol>
<li>Open the <strong>Debug log</strong> tab.</li>
<li>Choose <strong>Stay on for</strong>: <strong>1 hour</strong>, <strong>24 hours</strong> (default) or <strong>7 days</strong>.</li>
<li>Choose <strong>Maximum size per file</strong>.</li>
<li>Press <strong>Turn on the debug log</strong>. You&#8217;ll read “Debug log turned on. It switches itself off when the chosen time runs out; the files stay.”.</li>
<li>Reproduce the problem on the site.</li>
<li>Go back to the tab. Read “Latest entries”, or download the file from the “Collected files” section.</li>
<li>When you&#8217;re done, press <strong>Turn off the debug log</strong>, or wait for it to expire. You&#8217;ll see “Debug log turned off. The files collected are still here below.”.</li>
</ol>
<p>The “Status:” line tells you whether the log is “on, switches off on dd/mm/yyyy hh:mm”, “off (expired on …)” or “off”. While the log is on you can change the size with <strong>Save size</strong>.</p>
<h3>Collected files</h3>
<p>The table lists name, size, and the <strong>Download</strong> and <strong>Delete</strong> buttons. Below you&#8217;ll find <strong>Delete all files</strong>. Before deleting, the plugin asks for confirmation: “Delete this file? This cannot be undone.”. For <strong>Delete all files</strong> the text is “Delete all debug log files? This cannot be undone.”. If there&#8217;s nothing you&#8217;ll read “No files: the log has never been switched on, or it hasn&#8217;t logged anything yet.”.</p>
<h3>Latest entries</h3>
<p>The box shows the 200 most recent entries, newest first. The <strong>All levels</strong> menu lets you filter by Fatal error, Parse error, Recoverable error, Warning, Notice or Deprecated. Then press <strong>Filter</strong>. For anything else, download the files. If the filter finds nothing, you&#8217;ll read “No entries match this filter.”.</p>
<p>An entry has this shape:</p>
<p><code>[2026-10-29 10:15:03 UTC] Warning: message in /path/file.php:12 | GET /page</code></p>
<ul>
<li>The time is in UTC, different from the site time shown in the <a href="https://www.cisilino.com/en/?p=984">Activity log</a>.</li>
<li>After the vertical bar you&#8217;ll find the method and path of the request, without the query string. From the command line or cron you&#8217;ll see “cli/cron”.</li>
<li>A multi-line message, such as a stack trace, stays a single entry, with the following lines indented.</li>
<li>The lines “Info: debug log enabled (user N)” and “Info: debug log disabled (user N)” carry no level: a filter hides them.</li>
</ul>
<h2>Default values and limits</h2>
<ul>
<li>Duration of the WordPress debug log: 1 hour, 24 hours or 7 days. Any other value becomes 24 hours.</li>
<li>Size per file: 1, 5, 10, 25 or 50 MB. The default is 5 MB. The chosen size is saved when you press <strong>Turn on the debug log</strong> or <strong>Save size</strong>. Watch out: <strong>Turn off the debug log</strong> resets the size to 5 MB, because that form doesn&#8217;t include the size menu.</li>
<li>Overall cap: 200 MB, adding up the <code>.log</code> and <code>.zip</code> files together.</li>
<li>Every message is truncated to 4000 characters.</li>
<li>It only logs PHP errors: not slow queries, JavaScript errors or HTTP requests.</li>
</ul>
<h2>Examples</h2>
<ul>
<li>A critical error after a plugin update: turn it on for 1 hour, reload the page, filter “Fatal error”. The entry shows the file and line, for example <code>/…/plugins/xyz/file.php:210 | GET /shop/</code>.</li>
<li>Occasional warnings: 24 hours, filter on Warning or Deprecated. If the file has been rotated, download the zip.</li>
<li>A slow site with no clear cause: 7 days with 25 MB files, then look for Notice and Warning entries that keep repeating.</li>
</ul>
<p>Keep it on for only as long as you need: often 1 hour is enough.</p>
<p><strong>Warning:</strong> the debug log files contain server paths and fragments of data. Don&#8217;t share them publicly. They stay on disk even after switching off and after uninstalling the plugin, which deletes the options but not the files. Delete them yourself when you&#8217;re finished. The overall cap is 200 MB.</p>
<p><strong>Warning:</strong> on an nginx server, turning it on can be refused until the server blocks the <code>csdn-debug-*</code> folder. The message is “Debug log not turned on: the files in its folder appear reachable from the internet (probably a server with no .htaccess support, such as nginx). The logs can contain paths and data: block access to the csdn-debug-* folder in the server configuration and try again.”. If you don&#8217;t manage the server yourself, ask whoever does.</p>
<p><strong>Warning:</strong> the log doesn&#8217;t see errors suppressed with <code>@</code>, nor ones generated before the plugin loads. For example, it doesn&#8217;t see errors from <code>wp-config.php</code>. The plugin&#8217;s WordPress debug log doesn&#8217;t replace the server&#8217;s own logs.</p>
<h2>What happens behind the scenes</h2>
<p>The WordPress debug log saves its files in a folder named <code>wp-content/uploads/csdn-debug-</code> followed by 16 random characters. Inside are an <code>index.php</code>, a <code>.htaccess</code> denying access, and the file in use, <code>csdn-debug.log</code>. On activation the plugin writes a test file and tries to read it over HTTP. If it responds, the plugin refuses to turn the log on.</p>
<p>When the file in use exceeds the chosen size, it is closed, compressed into a <code>.zip</code>, and a new one starts. No entry is lost. The original <code>.log</code> is only deleted once the zip has been verified. If the compression fails, the <code>.log</code> stays. “Latest entries” only reads from the file in use, so after a rotation the older entries sit inside the zip files.</p>
<p>Before rotating, the plugin checks the 200 MB cap. If it&#8217;s reached, the log stops so nothing gets overwritten. The yellow notice reads: “The log has stopped because the files reached the space cap (200 MB): to avoid overwriting data, it stops writing. Download or delete the files, then turn it back on.”. To start again, delete the files and turn the log back on.</p>
<p>On expiry the log switches itself off, but the files stay. The plugin never truncates or deletes them: only you do that, with <strong>Delete</strong> or <strong>Delete all files</strong>. For fatal errors, the entry is written at the end of the request.</p>
<h2>If the WordPress debug log doesn&#8217;t work</h2>
<ul>
<li>“Debug log not turned on: the uploads folder is not writable.”: check the permissions on the <code>wp-content/uploads</code> folder.</li>
<li>The log doesn&#8217;t write: if writing fails, the plugin reports it with an entry “Site debug log: …” in the “Last attempts” of the <a href="https://www.cisilino.com/en/?p=984">Activity log</a> tab.</li>
<li>The log has stopped for the cap: download what you need, delete the files, and turn it back on.</li>
</ul>
<p>The <a href="https://www.cisilino.com/en/?p=972">general guide to the manual</a> explains where this tab fits in. To understand the WordPress constants better, look at the <a href="https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/" target="_blank" rel="noopener">official WordPress debugging guide</a>: it explains <code>WP_DEBUG</code> and <code>WP_DEBUG_LOG</code>, which this plugin cannot replace.</p>
<p>Previous chapter: <a href="https://www.cisilino.com/en/?p=984">Activity log</a>. Next chapter: <a href="https://www.cisilino.com/en/?p=986">Troubleshooting and frequently asked questions</a>.</p><p>The post <a href="https://www.cisilino.com/en/2026/10/30/debug-log-php-errors-their-own-file/">Debug log: PHP errors in their own file</a> first appeared on <a href="https://www.cisilino.com/en/">Matteo Cisilino</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.cisilino.com/en/2026/10/30/debug-log-php-errors-their-own-file/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Activity log WordPress: the CSDN tab</title>
		<link>https://www.cisilino.com/en/2026/10/30/activity-log-wordpress-csdn-tab/</link>
					<comments>https://www.cisilino.com/en/2026/10/30/activity-log-wordpress-csdn-tab/#respond</comments>
		
		<dc:creator><![CDATA[matteocisilino]]></dc:creator>
		<pubDate>Fri, 30 Oct 2026 16:05:53 +0000</pubDate>
				<category><![CDATA[CSDN manual]]></category>
		<category><![CDATA[activity log]]></category>
		<category><![CDATA[audit log]]></category>
		<category><![CDATA[Cisilino Site Defense Network]]></category>
		<guid isPermaLink="false">https://www.cisilino.com/?p=1055</guid>

					<description><![CDATA[<p>How to use the Activity log tab of the plugin CSDN: event groups, filters, retention, the row cap, sending to the panel and clearing it.</p>
<p>The post <a href="https://www.cisilino.com/en/2026/10/30/activity-log-wordpress-csdn-tab/">Activity log WordPress: the CSDN tab</a> first appeared on <a href="https://www.cisilino.com/en/">Matteo Cisilino</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>The activity log WordPress keeps through the CSDN plugin is a local diary of who did what, and when, on your site. It records logins, users, content, plugins, themes and more. It&#8217;s there to help you reconstruct what happened.</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" src="https://www.cisilino.com/wp-content/uploads/2026/10/manuale-csdn-registro-attivita.webp" alt="Diagram of WordPress with the Activity log WordPress tab of the plugin CSDN highlighted" width="1200" height="630"/></figure>
<h2>Where it is</h2>
<p>In the backend go to Settings &gt; Cisilino Site Defense Network (point 1 in the image). Open the <strong>Activity log</strong> tab (point 2). From top to bottom you&#8217;ll find these sections:</p>
<ul>
<li>point 3: “Activity log settings”.</li>
<li>point 4: the status row above the form, with the row counters.</li>
<li>point 5: “Panel delivery diagnostics”.</li>
<li>point 6: “Logged activity”, the table with the filters.</li>
<li>point 7: “Clear the local log”.</li>
</ul>
<h2>What the activity log WordPress keeps is for</h2>
<p>It helps you answer questions like “who deactivated that plugin?” or “which IP did that user log in from?”. Every event is a row in the site&#8217;s database table.</p>
<p>Don&#8217;t confuse it with the per-IP failed-login counter, which decides the blocks. They are two separate pieces of data, with different retention rules. A failed login attempt, though, also shows up here, one row per attempt.</p>
<p>For a long history and for serious searches, the panel is better. The local log also works without the panel. The connection is set up in <a href="https://www.cisilino.com/en/?p=974">Remote settings</a>.</p>
<h2>How to use it</h2>
<ol>
<li>Open the tab and look at the row “Rows in the local log: N — awaiting delivery to the panel: M”.</li>
<li>In the form, choose the settings described below.</li>
<li>Press <strong>Save log settings</strong>. You&#8217;ll see “Activity log settings saved.”.</li>
<li>To read the events go to “Logged activity”. Choose a group from the <strong>All groups</strong> menu, or type into the <strong>User, object or IP</strong> field, then press <strong>Filter</strong>.</li>
</ol>
<h3>The form settings</h3>
<ul>
<li>“Log activity on this site”: turn it off and no new rows are written. Old ones stay.</li>
<li>“Local retention (days)”: from 0 to 3650. With 0, nothing is deleted for age.</li>
<li>“Rows kept cap”: from 0 to 1,000,000. With 0 there&#8217;s no cap.</li>
<li>“Send activity to the panel”: requires the connection set up in Remote settings.</li>
<li>“Immediate delivery”: sending starts at the end of the request, without making the visitor wait. Turn it off, and sending happens only with the 15-minute synchronisation.</li>
<li>“What to log”: one box for each of the 18 event groups.</li>
</ul>
<h3>The event groups</h3>
<p>The groups carry these labels, identical in the “What to log” boxes and in the <strong>All groups</strong> menu: Logins (login, logout, failed attempts); Users (creation, profile edits, roles, deletion); Content (posts, pages, custom post types); Categories and tags; Comments; Media (attachments); Plugins (activation, deactivation, installation, update); Themes (theme switch, update, customisation); WordPress updates; WordPress settings; Navigation menus; Widgets; Theme/plugin file editor from wp-admin; Content export; File uploads (including those outside the media library); Plugin file integrity; Plugin settings (including this plugin&#8217;s own); Plugin lifecycle (deactivation, uninstallation, log clearing).</p>
<p>For WordPress settings only a selection of the main options is logged, for example <code>blogname</code>, <code>siteurl</code>, <code>admin_email</code>, <code>default_role</code> and <code>active_plugins</code>. For other plugins, only settings declared with <code>register_setting()</code> or saved through <code>options.php</code> are visible. The file editor logs the attempt, not the outcome.</p>
<h3>How to read the table</h3>
<p>The columns are When, User, IP, Group, Action, Detail and Sent. There are 50 rows per page, most recent first. Use <strong>Previous</strong> and <strong>Next</strong> to move around. If there&#8217;s nothing, you&#8217;ll read “No activity recorded (with these filters).”.</p>
<p>Group and Action appear with their raw name, for example <code>plugins</code> and <code>deactivated</code>. Anyone not logged in shows as “(not authenticated)”. In the Sent column you&#8217;ll find the panel&#8217;s confirmation date, or “—” if the row is still queued. The technical details field isn&#8217;t visible here: it&#8217;s read on the panel.</p>
<p>An example row: 12/10/2026 09:14:02, user mario (administrator), IP <code>203.0.113.5</code>, group <code>plugins</code>, action <code>deactivated</code>.</p>
<h3>Examples of reading it</h3>
<ul>
<li>The “Logins (login, logout, failed attempts)” group and a suspicious IP: a run of <code>failed</code> followed by a <code>success</code> can mean someone has guessed the password.</li>
<li>A <code>users</code> row with action <code>role_changed</code> and an unexpected user: check whether it&#8217;s a privilege escalation.</li>
<li>A row in the Uploads group with a block warning: someone tried to upload a dangerous file.</li>
</ul>
<h2>Default values for the activity log WordPress keeps</h2>
<ul>
<li>Logging on, sending to the panel on, immediate delivery on, every group active.</li>
<li>Retention: 30 days. The age-based deletion runs once a day.</li>
<li>Row cap: 500. The check runs every 100 inserts, so the table can exceed it by about 100 rows.</li>
<li>If you save with no group ticked, the log stays on but writes nothing.</li>
<li>It doesn&#8217;t log normal visits, and it doesn&#8217;t export data.</li>
</ul>
<p><strong>Warning:</strong> a failed login saves the username typed. If someone types their password into the username field, that text stays in the log, which can go to the panel. The plugin doesn&#8217;t filter it out. Keep this in mind when you share or read the log.</p>
<p><strong>Warning:</strong> the row cap (default 500) deletes the oldest rows even if they haven&#8217;t been sent to the panel yet. The cap takes priority over the delivery guarantee. On sites with a lot of unauthenticated traffic (failed logins, comments, file submissions), 500 rows can run out quickly. If you need the full history, raise the cap, but bear in mind that setting it to 0 removes the limit on disk space.</p>
<p><strong>Warning:</strong> “Clear activity log” is irreversible locally. It first asks for confirmation: “Clear the whole local activity log? This cannot be undone.”.</p>
<h2>What isn&#8217;t saved</h2>
<p>Plain-text passwords are never logged. When a profile is edited, only the fact that the password changed is saved. The plugin&#8217;s “API Key” field is shown as <code>***</code>. Options from other plugins whose name contains words like key, secret, token, password, auth, salt, nonce, license or credential have their value replaced with “*** (value not logged)”. Option values are truncated to 200 characters.</p>
<h2>Panel delivery diagnostics</h2>
<p>The section at point 5 is useful when activity isn&#8217;t reaching the panel. A failed send shows no visible error: the rows stay queued and retry. The only symptom is the “awaiting” counter that doesn&#8217;t drop.</p>
<p>The table shows, among other things, “Panel connection”, “Activity log”, “Sending to the panel”, “Immediate delivery”, “Rows queued”, “error_log() destination” and “Last send attempt”. Problem values are in red. If the last attempt shows fewer rows accepted than sent, you&#8217;ll see “Rows rejected by the panel”: those rows aren&#8217;t retried.</p>
<p>There are three buttons:</p>
<ul>
<li><strong>Try sending now</strong>: makes a test send immediately. The result appears in the table.</li>
<li><strong>Enable detailed logging</strong> (then <strong>Disable detailed logging</strong>): also logs successful sends.</li>
<li><strong>Clear diagnostic log</strong>: clears only the “Last attempts” list, which holds at most 25 entries. It only appears if there are entries.</li>
</ul>
<h2>What happens behind the scenes</h2>
<p>At the end of the request the plugin closes the response to the visitor, where the server allows it, and sends the rows to the panel in batches of at most 200, oldest first. A row counts as delivered only once the panel confirms receiving it. A synchronisation every 15 minutes acts as a safety net.</p>
<p>Age-based retention deletes old rows once a day. If sending is on and the panel is configured, it only deletes rows already confirmed. Otherwise it deletes purely by age.</p>
<p>Clearing the log first tries to send the backlog, then deletes everything. It logs the clearing event, which becomes the first row of the new log. It sends no delete command to the panel: the history already sent stays there. After clearing you&#8217;ll read “Local activity log cleared. History already sent to the panel was not touched.”. If there were rows never delivered, a bold warning tells you how many were lost.</p>
<h2>If the activity log WordPress keeps won&#8217;t send</h2>
<ul>
<li>The “awaiting” counter doesn&#8217;t drop: open the diagnostics, check the last attempt and the HTTP code, then press “Try sending now”.</li>
<li>A yellow box on the panel that doesn&#8217;t confirm: the panel may be out of date. The rows stay queued and nothing is lost.</li>
<li>Connection “NOT configured”: without a customer code, API key and URL nothing is sent. Go back to <a href="https://www.cisilino.com/en/?p=974">Remote settings</a>.</li>
</ul>
<p>For a wider guide to good logging practice, read the <a href="https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html" target="_blank" rel="noopener">OWASP logging guide</a>: it explains what&#8217;s worth logging and what to avoid.</p>
<p>Back to <a href="https://www.cisilino.com/en/?p=972">chapter 1, the index of the manual</a>. Previous chapter: <a href="https://www.cisilino.com/en/?p=983">Rate limiting</a>. Next chapter: <a href="https://www.cisilino.com/en/?p=985">Debug log</a>.</p><p>The post <a href="https://www.cisilino.com/en/2026/10/30/activity-log-wordpress-csdn-tab/">Activity log WordPress: the CSDN tab</a> first appeared on <a href="https://www.cisilino.com/en/">Matteo Cisilino</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.cisilino.com/en/2026/10/30/activity-log-wordpress-csdn-tab/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Rate limiting: limits on authors and visitors</title>
		<link>https://www.cisilino.com/en/2026/10/30/rate-limiting-limits-authors-visitors/</link>
					<comments>https://www.cisilino.com/en/2026/10/30/rate-limiting-limits-authors-visitors/#respond</comments>
		
		<dc:creator><![CDATA[matteocisilino]]></dc:creator>
		<pubDate>Fri, 30 Oct 2026 16:05:51 +0000</pubDate>
				<category><![CDATA[CSDN manual]]></category>
		<category><![CDATA[Cisilino Site Defense Network]]></category>
		<category><![CDATA[rate limiting]]></category>
		<category><![CDATA[user suspension]]></category>
		<guid isPermaLink="false">https://www.cisilino.com/?p=1054</guid>

					<description><![CDATA[<p>How to use the Rate limiting tab of the plugin CSDN: limits on authors and visitors, default values, suspensions and revoking them.</p>
<p>The post <a href="https://www.cisilino.com/en/2026/10/30/rate-limiting-limits-authors-visitors/">Rate limiting: limits on authors and visitors</a> first appeared on <a href="https://www.cisilino.com/en/">Matteo Cisilino</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Rate limiting WordPress offered by CSDN puts a cap on write abuse. On one side are authors who publish too much content in too little time, for example through a compromised account. On the other are visitors who send too many comments or contact forms. Each cap switches on and adjusts itself.</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" src="https://www.cisilino.com/wp-content/uploads/2026/10/manuale-csdn-rate-limiting.webp" alt="Diagram of WordPress with the Rate limiting WordPress tab of the plugin CSDN highlighted" width="1200" height="630"/></figure>
<h2>Where it is</h2>
<p>Go to <strong>Settings</strong> and choose <strong>Cisilino Site Defense Network</strong> (point 1 in the image). Open the “Rate limiting” tab (point 2). Saving requires the <code>manage_options</code> permission; on multisite you need <code>manage_network_options</code>.</p>
<p>There are four sections. Point 3 is “How it works, in practice: what gets counted”. Point 4 is “1. Authors: publishing too often”. Point 5 is “2. Visitors: comments and contact forms”. Point 6 is “Currently suspended users”. All time values are in seconds.</p>
<h2>What it&#8217;s for</h2>
<p>The cap on authors stops an account publishing at full speed before it fills the site with content. The cap on visitors slows anyone flooding comments and forms. The code also knows a third cap, the mandatory email. You&#8217;ll find it in the “User registration” tab, described in the <a href="https://www.cisilino.com/en/?p=982">previous chapter</a>.</p>
<h2>How to use it</h2>
<h3>What gets counted (point 3)</h3>
<p>The info box explains the rules. For authors, the check fires when WordPress saves a post or a page. The plugin counts how many posts and pages by that author have a creation or publication date within the last T seconds. If there are more than N, the author is suspended. The save that crosses the threshold goes through fine: the suspension blocks the ones that follow.</p>
<p>Plugins and themes don&#8217;t count, nor do logins, edits to content older than the window, auto-drafts, revisions, the trash, media, comments or other content types. Temporary environments, like the Plugin Check test one, are ignored.</p>
<p><strong>Warning:</strong> the example written in that info box still quotes N=3. It&#8217;s old text. The real default value is 150 items in 5 minutes, from version 1.0.13.</p>
<h3>Authors (point 4)</h3>
<ol>
<li>Tick “Rate limit active” to limit authors&#8217; publishing.</li>
<li>Decide whether to keep “Email alert”: you get a mail when an author is suspended.</li>
<li>Set “N: allowed items”, from 1 to 1000. Default 150.</li>
<li>Set “T: window (seconds)”, from 10 to 86400. Default 300, meaning 5 minutes.</li>
<li>Set “S: suspension (seconds)”, from 60 to 2592000. Default 3600, meaning 1 hour.</li>
<li>Press <strong>Save rate limiting settings</strong>.</li>
</ol>
<p>The mail goes to the admin address set under Settings &gt; General. It contains the user, the content within the window, the expiry, and a list of up to 20 recent items to check. The suspension doesn&#8217;t change that content.</p>
<h3>Visitors (point 5)</h3>
<ol>
<li>Tick “Rate limit active” to limit guest submissions.</li>
<li>“Email alert” is off by default. On an exposed site it could generate a lot of mail. It goes to the same admin address under Settings &gt; General, once per block.</li>
<li>“N: allowed submissions”, from 1 to 100. Default 2.</li>
<li>“T: window (seconds)”, from 5 to 3600. Default 60.</li>
<li>“S: IP block (seconds)”, from 60 to 2592000. Default 3600.</li>
</ol>
<p>This cap only concerns people who aren&#8217;t logged in. It counts submissions by IP and by type, comments or forms. A block on comments doesn&#8217;t block forms. The contact forms covered are Contact Form 7&#8217;s. A rejected comment shows “Too many submissions” with a 429 error.</p>
<p>If a value is outside the limits, the plugin moves it to the nearest allowed one. Saving shows “Rate limiting settings saved. Values outside the allowed limits have been moved to the nearest one.”</p>
<h2>Rate limiting WordPress: suspensions and blocks</h2>
<p>A suspended author keeps their role and can still use the rest of the admin panel. They lose, though, the permission to create and publish posts and pages. “Add New Post” and the pages menu items disappear, and opening those screens gives “permission denied”. An unclosable notice appears in the dashboard.</p>
<p><strong>Warning:</strong> author suspension affects administrators too. A suspended administrator loses the ability to create and publish, but can still open Settings and revoke their own suspension. There&#8217;s no list of exceptions for users, roles or IPs: the IP whitelist in the General tab doesn&#8217;t exempt anyone from rate limiting.</p>
<p><strong>Warning:</strong> the visitor block is by IP. Several people behind the same IP, such as an office, can be blocked together. In that case raise N. The plugin only reads the connecting address (<code>REMOTE_ADDR</code>) and not proxy or CDN headers: behind a reverse proxy or a CDN every visitor can appear with the same IP and end up blocking each other.</p>
<h3>How to revoke a suspension</h3>
<p>You have two routes.</p>
<ol>
<li>Wait. The suspension ends on its own after S seconds.</li>
<li>In the section at point 6, “Currently suspended users”, press <strong>Revoke suspension</strong> on the user&#8217;s row. You&#8217;ll see “Suspension revoked: the user can create and publish content again.” If the table is empty, you&#8217;ll read “No suspended users.”</li>
</ol>
<p>The table shows at most 100 users. The dashboard notices carry the links “Revoke the suspension” and “Check and revoke”, which lead to the same tab.</p>
<p>Switching off “Rate limit active” doesn&#8217;t remove a suspension already in progress. To remove it you have to revoke it, or wait for it to expire.</p>
<h2>What happens behind the scenes</h2>
<p>The suspension is information saved on the user, with an expiry date. For guests, every submission is logged for 24 hours in a plugin table, then counted within the window. If two requests arrive together, one extra may slip through. Suspensions and blocks land in the Activity log, if it&#8217;s on and if the Users and Comments groups are enabled.</p>
<p><strong>Warning:</strong> a legitimate bulk import can trip the cap on authors. Before a migration, switch off the cap or raise N.</p>
<h2>Examples of rate limiting WordPress</h2>
<ul>
<li>A blog with a single author: you can lower N to 10 or 20 with T=300. You&#8217;ll catch a compromised account sooner. These are trial values, not a rule of the plugin.</li>
<li>A newsroom that duplicates or imports pages: keep 150/300 or higher.</li>
<li>Offices with a shared IP: raise visitors&#8217; allowed submissions to 3 or 5.</li>
</ul>
<p>Useful conversions: 300 seconds is 5 minutes, 3600 is 1 hour, 86400 is 1 day. To learn more about the general topic, read the OWASP guide on <a href="https://owasp.org/www-community/controls/Blocking_Brute_Force_Attacks" target="_blank" rel="noopener">Blocking Brute Force Attacks</a>, which explains why limiting repeated attempts matters.</p>
<p>Previous: <a href="https://www.cisilino.com/en/?p=982">User registration: who can create accounts</a>. Next: <a href="https://www.cisilino.com/en/?p=984">Activity log: what happened on the site</a>. For the general index go to <a href="https://www.cisilino.com/en/?p=972">chapter 1 of the manual</a>.</p><p>The post <a href="https://www.cisilino.com/en/2026/10/30/rate-limiting-limits-authors-visitors/">Rate limiting: limits on authors and visitors</a> first appeared on <a href="https://www.cisilino.com/en/">Matteo Cisilino</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.cisilino.com/en/2026/10/30/rate-limiting-limits-authors-visitors/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>User registration: who can create accounts</title>
		<link>https://www.cisilino.com/en/2026/10/30/user-registration-who-can-create-accounts/</link>
					<comments>https://www.cisilino.com/en/2026/10/30/user-registration-who-can-create-accounts/#respond</comments>
		
		<dc:creator><![CDATA[matteocisilino]]></dc:creator>
		<pubDate>Fri, 30 Oct 2026 16:05:49 +0000</pubDate>
				<category><![CDATA[CSDN manual]]></category>
		<category><![CDATA[Cisilino Site Defense Network]]></category>
		<category><![CDATA[user registration]]></category>
		<category><![CDATA[WordPress roles]]></category>
		<guid isPermaLink="false">https://www.cisilino.com/?p=1053</guid>

					<description><![CDATA[<p>How to use the User registration tab of the plugin CSDN: policy, allowed roles, mandatory email and the limits of this protection.</p>
<p>The post <a href="https://www.cisilino.com/en/2026/10/30/user-registration-who-can-create-accounts/">User registration: who can create accounts</a> first appeared on <a href="https://www.cisilino.com/en/">Matteo Cisilino</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>The “User registration” tab decides who can create new accounts on your site, and with which role. It&#8217;s the defence against hidden administrators, meaning accounts created secretly to get back onto the site after an attack. User registration WordPress is governed from here. In this chapter you&#8217;ll see the registration policy, the allowed roles and the mandatory email address.</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" src="https://www.cisilino.com/wp-content/uploads/2026/10/manuale-csdn-registrazione-utenti.webp" alt="Diagram of WordPress with the User registration WordPress tab of the plugin CSDN highlighted" width="1200" height="630"/></figure>
<h2>Where it is</h2>
<p>In the WordPress menu open <strong>Settings</strong> and then <strong>Cisilino Site Defense Network</strong> (point 1 in the image). Choose the “User registration” tab (point 2). Saving requires the <code>manage_options</code> permission; on multisite you need <code>manage_network_options</code>.</p>
<p>There are three sections. Point 3 is “Registration policy”. Point 4 is “Allowed roles (only at the &#8220;low-privilege roles&#8221; level)”. Point 5 is “Mandatory email”.</p>
<h2>What it&#8217;s for</h2>
<p>The policy applies to every route of account creation: the wp-admin panel, the REST API, XML-RPC, WP-CLI, and any plugin or theme using WordPress&#8217;s own functions to create users. The check is done in PHP, without touching the <code>.htaccess</code> file.</p>
<h2>How to use it</h2>
<h3>Registration policy (point 3)</h3>
<p>Choose a single level out of three. They don&#8217;t add up.</p>
<ul>
<li>“No restriction (disabled)”: the module is off and WordPress behaves as usual.</li>
<li>“Low-privilege roles only (never administrator/editor/author)”: this is the default level. The allowed roles at point 4 apply.</li>
<li>“No registration (exclusive)”: no new user can be created at all.</li>
</ul>
<h3>Allowed roles (point 4)</h3>
<p>This only applies at the low-privilege roles level. You can tick <code>subscriber</code> (ticked by default), <code>contributor</code> and <code>customer</code> (useful with WooCommerce). The <code>administrator</code>, <code>editor</code>, <code>author</code> and <code>shop_manager</code> boxes are always disabled, marked “never allowed”.</p>
<h3>Mandatory email (point 5)</h3>
<p>The box “Don&#8217;t create users without a valid email address” is on by default. It stops users being created without a valid email, through any route. It doesn&#8217;t touch users who already exist. This setting is saved together with the rate limiting ones, but is managed here.</p>
<p>At the end, press <strong>Save registration policy</strong>. You&#8217;ll see “User registration policy saved.” The save lands in the Activity log, under the label “User registration”.</p>
<h2>User registration WordPress: default values and limits</h2>
<ul>
<li>The default policy is “Low-privilege roles only”, active even if you&#8217;ve never saved anything.</li>
<li>The starting allowed role is <code>subscriber</code> alone.</li>
<li>Forbidden roles are always discarded, even if someone tries to submit them by hand.</li>
<li>The list of roles is fixed: it doesn&#8217;t show your site&#8217;s custom roles.</li>
<li>There are no email domain lists, captchas or anti-spam checks on registrations.</li>
</ul>
<p><strong>Warning:</strong> with “No registration (exclusive)” nobody can create users, not even the administrator. The “Add New User” item disappears from the menu, and opening <code>user-new.php</code> by hand gives a 403 error. If, at the low-privilege roles level, you untick every role, the list stays empty and no user is allowed at all. Here, though, the menu item and the page stay visible: the 403 error only arrives when you try to create the user.</p>
<p>With the default level you can&#8217;t create an editor or an author, not even as an administrator. The plugin makes no exception for someone already logged in. To create a user with a high role, switch temporarily to “No restriction”, create the user, and then switch back.</p>
<p>Also check the “New user default role” under Settings &gt; General in WordPress. If it&#8217;s a forbidden role, such as Editor, every registration without an explicit role is rejected.</p>
<h2>What happens behind the scenes</h2>
<p>The main check acts on the <code>pre_insert_user_data</code> filter, only when a user is created. Changes to existing users always go through. A rejected attempt shows the title “Registration not allowed” with a 403 error. On the REST API you get a 403 JSON error instead of the page.</p>
<p>With any policy active, the plugin removes the XML-RPC method <code>wp.newUser</code>. With the exclusive policy it also forces WordPress&#8217;s “Anyone can register” option to false. At the low-privilege level, that option stays whatever you chose.</p>
<p>There&#8217;s also a safety net after creation. If an account is somehow created in violation of the policy, the plugin immediately strips its role and writes an event to the Activity log. The account isn&#8217;t deleted, so you can examine it.</p>
<p><strong>Warning:</strong> a compromised plugin or theme writing straight to the users table with a database INSERT doesn&#8217;t pass through any filter. No PHP plugin can stop that. The user registration WordPress protection in this tab is a strong barrier, but it isn&#8217;t absolute.</p>
<h2>Examples</h2>
<ul>
<li>A showcase site with no public users: choose “No registration (exclusive)”.</li>
<li>A site with subscribers or comments: leave the default level with <code>subscriber</code>.</li>
<li>A shop with WooCommerce: add <code>customer</code>.</li>
<li>You need to add a collaborator with a high role: use “No restriction” only for as long as needed.</li>
</ul>
<h2>If something goes wrong</h2>
<p>If a sign-up is rejected with the message about a role not being allowed, check WordPress&#8217;s default role and the roles ticked at point 4. The Activity log tells you if an account has had its role stripped by the safety net. To understand the roles better, read the page on <a href="https://wordpress.org/documentation/article/roles-and-capabilities/" target="_blank" rel="noopener">roles and capabilities in the WordPress documentation</a>. It lists what each role can do.</p>
<p>Previous: <a href="https://www.cisilino.com/en/?p=981">Paranoic Hardening: security headers and the admin session</a>. Next: <a href="https://www.cisilino.com/en/?p=983">Rate limiting: limits on authors and visitors</a>. For the general index go to <a href="https://www.cisilino.com/en/?p=972">chapter 1 of the manual</a>.</p><p>The post <a href="https://www.cisilino.com/en/2026/10/30/user-registration-who-can-create-accounts/">User registration: who can create accounts</a> first appeared on <a href="https://www.cisilino.com/en/">Matteo Cisilino</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.cisilino.com/en/2026/10/30/user-registration-who-can-create-accounts/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Paranoic Hardening: headers and autologout</title>
		<link>https://www.cisilino.com/en/2026/10/30/paranoic-hardening-headers-autologout/</link>
					<comments>https://www.cisilino.com/en/2026/10/30/paranoic-hardening-headers-autologout/#respond</comments>
		
		<dc:creator><![CDATA[matteocisilino]]></dc:creator>
		<pubDate>Fri, 30 Oct 2026 16:05:46 +0000</pubDate>
				<category><![CDATA[CSDN manual]]></category>
		<category><![CDATA[Cisilino Site Defense Network]]></category>
		<category><![CDATA[HSTS]]></category>
		<category><![CDATA[security headers]]></category>
		<guid isPermaLink="false">https://www.cisilino.com/?p=1052</guid>

					<description><![CDATA[<p>How to use the Paranoic Hardening tab of the plugin CSDN: HTTP headers, HSTS, the check and autologout, with the recommended order and risks.</p>
<p>The post <a href="https://www.cisilino.com/en/2026/10/30/paranoic-hardening-headers-autologout/">Paranoic Hardening: headers and autologout</a> first appeared on <a href="https://www.cisilino.com/en/">Matteo Cisilino</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>The “<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Paranoic Hardening” tab of the CSDN plugin brings together the most delicate options: the HTTP security headers, HSTS and the automatic logout of inactive administrators. Here you change the behaviour of the visitor&#8217;s browser, not just the server&#8217;s. That&#8217;s why it&#8217;s all off by default.</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" src="https://www.cisilino.com/wp-content/uploads/2026/10/manuale-csdn-paranoic-hardening.webp" alt="Diagram of WordPress with the Paranoic Hardening tab of the plugin CSDN highlighted" width="1200" height="630"/></figure>
<h2>Where it is</h2>
<p>In the WordPress side menu go to <strong>Settings</strong> and choose <strong>Cisilino Site Defense Network</strong> (point 1 in the image). Open the “<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Paranoic Hardening” tab (point 2). Saving requires the <code>manage_options</code> permission; on multisite you need <code>manage_network_options</code>.</p>
<p>The tab has four sections. At point 3 you&#8217;ll find “Paranoic Hardening — HTTP security headers”. At point 4 there&#8217;s “HTTP Strict Transport Security (HSTS)”. Point 5 is “Security header check”. Point 6 is “Autologout of inactive administrators”.</p>
<h2>What it&#8217;s for</h2>
<p>Headers are instructions the site sends the browser along with every page. The plugin sends them through WordPress&#8217;s <code>send_headers</code> hook, without touching the <code>.htaccess</code> file. So you don&#8217;t risk a 500 error, and they work even without <code>mod_headers</code>.</p>
<p>The headers only cover the public site. They are never sent in the admin area. The plugin offers no Content-Security-Policy, and it doesn&#8217;t send X-XSS-Protection.</p>
<h2>How to use Paranoic Hardening</h2>
<h3>HTTP security headers (point 3)</h3>
<ul>
<li><strong>X-Content-Type-Options</strong> sends <code>nosniff</code>. The browser stops “guessing” a file&#8217;s type. The risk here is practically nil.</li>
<li><strong>X-Frame-Options</strong> sends <code>SAMEORIGIN</code>. The site can no longer be embedded in an <code>&lt;iframe&gt;</code> on another domain. If a partner site shows your pages, it will stop doing so.</li>
<li><strong>Referrer-Policy</strong> sends <code>strict-origin-when-cross-origin</code>. Towards other domains only the domain travels, not the path. Third-party statistics tools wanting the full referrer won&#8217;t get it.</li>
</ul>
<p>Tick the boxes you need and press <strong>Save Paranoic Hardening</strong>. You&#8217;ll see the notice “Paranoic Hardening settings saved and applied.” Boxes you don&#8217;t tick are saved as off.</p>
<h3>HSTS (point 4)</h3>
<p>HSTS tells the browser to always use https with your domain. There are three boxes: “Enable HSTS”, “includeSubDomains” and “Preload”. The header sent carries <code>max-age=31536000</code>, meaning one year. The value is fixed and cannot be changed.</p>
<p>The plugin refuses to activate it if the page wasn&#8217;t opened over https. In that case it saves the rest and shows a red warning: “Settings saved, but HSTS was NOT activated: this request did not arrive over https. Open the panel over https and try again.” If the page is over http, the three boxes are also disabled.</p>
<p>If you turn off “Enable HSTS”, on saving “includeSubDomains” and “Preload” are reset too. If you turn HSTS back on, you&#8217;ll need to tick them again.</p>
<h3>Security header check (point 5)</h3>
<p>Press <strong>Check now</strong>. The plugin makes a real request to the site&#8217;s home page and checks which headers genuinely arrive. The result appears in the box, with the date of the last test.</p>
<ul>
<li>Green: “All the expected headers are present in the site&#8217;s real response.”</li>
<li>Red: the active headers that didn&#8217;t arrive. This can be a proxy, a CDN or another plugin removing them. HSTS shows as missing even if the home address is http rather than https, because the plugin only sends it on https requests.</li>
<li>Blue: “No active header to check: enable at least one option above and save.”</li>
<li>Red with “Check request failed”: the request didn&#8217;t succeed.</li>
</ul>
<p>The test checks whether a header is present, not its value. It doesn&#8217;t run on its own: you have to press it.</p>
<h3>Autologout of administrators (point 6)</h3>
<p>This section of Paranoic Hardening has its own button, <strong>Save autologout for administrators</strong>. Tick “Enable” to log out inactive administrators. Then set the “Inactivity timeout (seconds)”. If the browser blocks <code>localStorage</code> (in a private window, for instance), the check never fires and you&#8217;re never logged out.</p>
<p>The default value is 900, meaning 15 minutes. The minimum is 60 and the maximum is 86400. If you write a number outside those limits, the plugin moves it to the nearest allowed value. For example, 30 becomes 60. The notice stays green, so reread the number in the field after saving.</p>
<p>Only users with the <code>manage_options</code> permission are logged out. Editors and authors aren&#8217;t touched. Inactivity is measured in the browser: mouse, keyboard, scrolling and touch all count. The session closes just as with “Log Out”, and unsaved changes in an open form are lost.</p>
<h2>Recommended order of activation</h2>
<ol>
<li>Open the panel over https.</li>
<li>Turn on X-Content-Type-Options, save and press “Check now”.</li>
<li>Turn on Referrer-Policy, save and check.</li>
<li>Check that no site embeds yours, then turn on X-Frame-Options, save and check.</li>
<li>Turn on autologout with a generous timeout, for example 1800. Lower it only after a few days.</li>
<li>Last of all, consider HSTS, without includeSubDomains and without Preload.</li>
</ol>
<p>Turn on one option at a time. If something breaks, you&#8217;ll know straight away which one did it.</p>
<h2>The risk of HSTS, includeSubDomains and Preload</h2>
<p><strong>Warning:</strong> HSTS can&#8217;t be undone from the site. If you untick it, the plugin stops sending the header, but browsers that already received it will remember it until it expires. The plugin never sends <code>max-age=0</code>, so there&#8217;s no “cancel”. The tab&#8217;s own banner says so too: the effects can stay visible for weeks or months.</p>
<p>With HSTS on, the browser refuses any non-https connection to the domain. If the certificate expires or breaks, the browser no longer even shows the “proceed anyway” screen. The site becomes unreachable from that browser.</p>
<ul>
<li><strong>includeSubDomains</strong> extends the rule to every subdomain. A single subdomain without valid https, even a test one or a future one, becomes unreachable for anyone who has already visited the site. Only turn it on if every subdomain is, and will remain, https.</li>
<li><strong>Preload</strong> only adds the <code>preload</code> flag to the header. On its own it doesn&#8217;t register the site: submitting it to the browsers&#8217; list is done by hand on hstspreload.org. The list sits inside the browsers, and getting out of it takes weeks. Treat Preload as a final, one-way decision.</li>
</ul>
<p>Always save from the https version of the panel. Disabled boxes aren&#8217;t sent by the browser: saving from an http page switches off HSTS and its sub-options.</p>
<h2>What happens behind the scenes</h2>
<p>The Paranoic Hardening settings are WordPress options, not server rules. Autologout prints a script only on admin pages. The script records the last activity in the browser&#8217;s <code>localStorage</code> and checks the timeout every 5 seconds. On expiry it asks <code>admin-ajax.php</code> to log you out and takes you to the login page. The save only lands in the Activity log if you actually changed something.</p>
<h2>If something goes wrong</h2>
<ul>
<li>The box turns red after “Check now”: a proxy, a CDN or another plugin is stripping the headers. Check their configuration.</li>
<li>A partner site no longer shows your pages: untick X-Frame-Options and save.</li>
<li>You can&#8217;t turn on HSTS: reopen the panel with the https address.</li>
<li>To check the headers by hand, use your browser&#8217;s developer tools or <code>curl -I</code> on the site&#8217;s https address.</li>
</ul>
<p>To understand HSTS better, read the page on <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Strict-Transport-Security" target="_blank" rel="noopener">Strict-Transport-Security on MDN</a>. It explains max-age, includeSubDomains and preload precisely.</p>
<p>Previous: <a href="https://www.cisilino.com/en/?p=980">Test tab: checking that the protections work</a>. Next: <a href="https://www.cisilino.com/en/?p=982">User registration: who can create accounts</a>. For the general index go to <a href="https://www.cisilino.com/en/?p=972">chapter 1 of the manual</a>.</p><p>The post <a href="https://www.cisilino.com/en/2026/10/30/paranoic-hardening-headers-autologout/">Paranoic Hardening: headers and autologout</a> first appeared on <a href="https://www.cisilino.com/en/">Matteo Cisilino</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.cisilino.com/en/2026/10/30/paranoic-hardening-headers-autologout/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Test tab: checking the protections work</title>
		<link>https://www.cisilino.com/en/2026/10/30/test-tab-checking-protections-work/</link>
					<comments>https://www.cisilino.com/en/2026/10/30/test-tab-checking-protections-work/#respond</comments>
		
		<dc:creator><![CDATA[matteocisilino]]></dc:creator>
		<pubDate>Fri, 30 Oct 2026 16:05:44 +0000</pubDate>
				<category><![CDATA[CSDN manual]]></category>
		<category><![CDATA[Cisilino Site Defense Network]]></category>
		<category><![CDATA[PHP block check]]></category>
		<guid isPermaLink="false">https://www.cisilino.com/?p=1051</guid>

					<description><![CDATA[<p>The Test tab of the plugin CSDN runs two live checks: the PHP block in uploads and the plugin files' integrity. Here's how to use it and read the results.</p>
<p>The post <a href="https://www.cisilino.com/en/2026/10/30/test-tab-checking-protections-work/">Test tab: checking the protections work</a> first appeared on <a href="https://www.cisilino.com/en/">Matteo Cisilino</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>A <strong>WordPress security test</strong> serves one purpose: to know whether a protection genuinely works, not just whether it&#8217;s switched on. The “Test” tab of the CSDN plugin runs two live checks. It changes no settings at all. It checks the site right now.</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" src="https://www.cisilino.com/wp-content/uploads/2026/10/manuale-csdn-test.webp" alt="Diagram of WordPress with the Test tab of the plugin CSDN for a WordPress security test" width="1200" height="630"/></figure>
<h2>Where to find the WordPress security test</h2>
<p>Open <strong>Settings &gt; Cisilino Site Defense Network</strong> (point 1 in the image). Click the <strong>Test</strong> tab (point 2). You&#8217;ll find two boxes:</p>
<ul>
<li>point 3: “Check PHP execution block in uploads”.</li>
<li>point 4: “Plugin file integrity”.</li>
</ul>
<p>After each button the site takes you back to the General tab, with a notice at the top. The result, though, is written in the Test tab. Reopen it to read it.</p>
<h2>Check PHP execution block in uploads</h2>
<p>This box tests the “Block PHP execution in wp-content/uploads” rule from the Hardening / IDS tab, described in the <a href="https://www.cisilino.com/en/?p=978">Hardening / IDS</a> chapter. The text explains that this is the only way to know whether the rule is genuinely effective on this site. A disabled <code>AllowOverride</code>, or a more specific block on the server, could make it useless without telling you.</p>
<h3>How to use it</h3>
<ol>
<li>In the Hardening / IDS tab, turn on the rule and click “Save hardening rules”.</li>
<li>Open the Test tab.</li>
<li>In the “Check PHP execution block in uploads” box, click “Check now”.</li>
<li>Go back to the Test tab and read the result, in the “Last test:” row with its date.</li>
</ol>
<p>If the rule isn&#8217;t active and saved, the button is disabled. The box shows: “Turn on and save the &#8220;Block PHP execution in wp-content/uploads&#8221; rule in the Hardening / IDS tab before you can run this test.”.</p>
<h3>What the test does</h3>
<p>The plugin writes a small test <code>.php</code> file into uploads. It requests it over HTTP, with a 10-second limit. Then it deletes it straight away, whatever happens. The file contains nothing but a check print statement.</p>
<h3>How to read the result</h3>
<ul>
<li>Green: “Block effective: the request to the test file received N.”. The number is 403 or 404.</li>
<li>Red: “WARNING: the test PHP file was EXECUTED (response N).” The rule isn&#8217;t blocking anything. The message suggests checking that <code>AllowOverride</code> allows <code>.htaccess</code> in that folder, and that there&#8217;s no more specific <code>&lt;Directory&gt;</code> block.</li>
<li>Yellow: “Unclear result (response N, body not recognised): check manually with a direct request to the site.”.</li>
<li>Blue: “Rule disabled: turn it on and save it before running the test.”.</li>
<li>Red, for errors: “Unable to determine the uploads folder.”, “Unable to write the test file to uploads (permissions?): test not run.”, or “Check request failed”, with the reason.</li>
</ul>
<p><strong>Warning:</strong> if the site can&#8217;t call itself, for instance because of a firewall, an HTTP password or a local DNS setting, the test returns an error or an unclear result. A 404 counts as a block, but it could be caused by something else. The test only checks the standard uploads folder. For a few seconds a <code>.php</code> file exists in uploads: if the block doesn&#8217;t work it could be executed, but it only contains a check print statement.</p>
<h2>Plugin file integrity</h2>
<p>This is the second part of the WordPress security test. The second box compares the MD5 hashes of the plugin&#8217;s <code>.php</code> files against the ones expected. It looks for files that are changed, missing or added. The check runs on its own once a day. The “Check now” button runs it immediately.</p>
<p>The box states a fixed limit: anyone who already has write access to the files can also rewrite the hashes or switch off the check. It&#8217;s a tamper detector, not a barrier.</p>
<h3>How to use it</h3>
<ol>
<li>Open the Test tab.</li>
<li>In the “Plugin file integrity” box, click “Check now”.</li>
<li>Read the notice: “Integrity check run: the result is in the &#8220;Plugin file integrity&#8221; box.”.</li>
<li>Reopen the Test tab and read the box.</li>
</ol>
<h3>How to read the result</h3>
<p>Green: “All N files checked match. Last check: date.”. If the reference is a snapshot, the box adds that it detects later changes, not a plugin already compromised at installation. Red: “WARNING: the plugin&#8217;s files do not match what is expected.”, with the lists “Changed”, “Missing” and “Unexpected”. Yellow: “No reference available”. In that case, reactivate the plugin.</p>
<p>The manual button doesn&#8217;t write to the activity log. Only the scheduled check does that, and only if it finds a problem or if the files return to normal after an alert. For the details, read the <a href="https://www.cisilino.com/en/?p=979">Upload monitoring and the integrity check</a> chapter.</p>
<p><strong>Warning:</strong> if you&#8217;ve edited a plugin file by hand, the red alert is normal. If you haven&#8217;t, treat the site as potentially compromised: reinstall the plugin from a trusted copy and check the rest of the installation.</p>
<h2>If something goes wrong</h2>
<p>Repeat the WordPress security test after every fix. If the PHP test returns red, the rule isn&#8217;t protecting anything. Ask your hosting provider whether <code>.htaccess</code> is enabled. If the server doesn&#8217;t read <code>.htaccess</code>, nginx for instance, the rule has no effect. Repeat the test after every fix. A 403 is the response you want to see: the page on <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/403" target="_blank" rel="noopener">status code 403</a> on MDN explains what it means.</p>
<p>Previous chapter: <a href="https://www.cisilino.com/en/?p=979">Upload monitoring and the integrity check</a>. Next chapter: <a href="https://www.cisilino.com/en/?p=981">Paranoic Hardening: security headers and the admin session</a>. For the list of chapters go back to the <a href="https://www.cisilino.com/en/?p=972">introduction to the manual</a>.</p><p>The post <a href="https://www.cisilino.com/en/2026/10/30/test-tab-checking-protections-work/">Test tab: checking the protections work</a> first appeared on <a href="https://www.cisilino.com/en/">Matteo Cisilino</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.cisilino.com/en/2026/10/30/test-tab-checking-protections-work/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Upload monitoring and the integrity check</title>
		<link>https://www.cisilino.com/en/2026/10/30/upload-monitoring-integrity-check/</link>
					<comments>https://www.cisilino.com/en/2026/10/30/upload-monitoring-integrity-check/#respond</comments>
		
		<dc:creator><![CDATA[matteocisilino]]></dc:creator>
		<pubDate>Fri, 30 Oct 2026 16:05:41 +0000</pubDate>
				<category><![CDATA[CSDN manual]]></category>
		<category><![CDATA[Cisilino Site Defense Network]]></category>
		<category><![CDATA[file integrity]]></category>
		<category><![CDATA[uploads]]></category>
		<guid isPermaLink="false">https://www.cisilino.com/?p=1050</guid>

					<description><![CDATA[<p>Where to find the upload monitoring form, what it actually blocks, and how to read the outcome of the plugin's integrity check.</p>
<p>The post <a href="https://www.cisilino.com/en/2026/10/30/upload-monitoring-integrity-check/">Upload monitoring and the integrity check</a> first appeared on <a href="https://www.cisilino.com/en/">Matteo Cisilino</a>.</p>]]></description>
										<content:encoded><![CDATA[<p><strong>Upload monitoring</strong> in the CSDN plugin notes down who uploads files to your site, even outside the media library. The integrity check, on the other hand, verifies that the plugin&#8217;s own files haven&#8217;t been touched. These are two different defences, but both are looking for the same scenario: a malicious file getting in where it shouldn&#8217;t.</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" src="https://www.cisilino.com/wp-content/uploads/2026/10/manuale-csdn-caricamenti-integrita.webp" alt="Diagram of WordPress with the General tab of the plugin CSDN and the upload monitoring section" width="1200" height="630"/></figure>
<h2>Where it is</h2>
<p>Watch out for the location: the form isn&#8217;t in the “Hardening / IDS” tab. Open <strong>Settings &gt; Cisilino Site Defense Network</strong> (point 1), stay on the <strong>General</strong> tab (point 2) and scroll right to the bottom. After the whitelist you&#8217;ll find the “Upload monitoring” section (point 3). The integrity check, instead, is read in the Test tab, covered in the <a href="https://www.cisilino.com/en/?p=980">Test tab</a> chapter.</p>
<h2>What upload monitoring is for</h2>
<p>The section says: “Logs files uploaded to the site, including those that don&#8217;t go through the media library: plugin forms, admin-ajax endpoints, arbitrary uploads from a theme.” That is where most webshells get in. A log that only watches the media library won&#8217;t see them.</p>
<h2>How to use it</h2>
<ol>
<li>Open the General tab and scroll down to “Upload monitoring”.</li>
<li>Check the “Monitoring” row: “Log file uploads”.</li>
<li>Check the “Block executable files” row: “Reject uploads with an executable extension (.php, .phtml, .phar, .sh, .htaccess&#8230;)”.</li>
<li>Click “Save upload monitoring”.</li>
<li>Read the notice: “Upload monitoring settings saved.”.</li>
</ol>
<h2>Log file uploads</h2>
<p>This option is <strong>on</strong> by default. The events go into the “File uploads” group of the activity log. For a request with no file, the cost is nil. The plugin notes every request that contains a file, together with the field and the address that received it. The actions you&#8217;ll see in the log are:</p>
<ul>
<li>“File received in a POST request”.</li>
<li>“File uploaded”.</li>
<li>“WARNING: potentially executable file uploaded”.</li>
<li>“Upload BLOCKED”.</li>
</ul>
<p>The local log holds at most 500 rows, unless you change the cap in the activity log settings. How to read it is explained in the <a href="https://www.cisilino.com/en/?p=984">Activity log</a> chapter.</p>
<h2>Block executable files</h2>
<p>This option is <strong>off</strong> by default. It only works if “Log file uploads” is also on: with monitoring off, the block does nothing, even if its box is ticked. If you turn it on, WordPress rejects the file with the message: “File type not allowed on this site (Cisilino Site Defense Network: executable file upload blocked).” The check also catches double extensions, such as <code>image.php.jpg</code>.</p>
<p>The extensions treated as dangerous are: <code>php</code>, <code>php3</code>, <code>php4</code>, <code>php5</code>, <code>php7</code>, <code>php8</code>, <code>phtml</code>, <code>phps</code>, <code>phar</code>, <code>pht</code>, <code>shtml</code>, <code>cgi</code>, <code>pl</code>, <code>py</code>, <code>rb</code>, <code>sh</code>, <code>bash</code>, <code>htaccess</code>, <code>htpasswd</code>, <code>jsp</code>, <code>asp</code>, <code>aspx</code>, <code>exe</code>, <code>so</code>, <code>dll</code>, <code>ini</code>, <code>svg</code> and <code>svgz</code>.</p>
<p><strong>Warning:</strong> the list also blocks <code>.svg</code>, so SVG logos can no longer be uploaded. It also blocks <code>.ini</code>, <code>.py</code>, <code>.exe</code> and <code>.dll</code>, which turn up in attachments and packages. The plugin looks at every part after the first dot. A name such as <code>archive.pl.zip</code> is therefore rejected. The block only applies to uploads handled by WordPress (the wp_handle_upload_prefilter filter). A plugin that saves the file on its own is logged (“File received in a POST request”) but not stopped. Anyone writing straight to disk, without a request that carries a file, leaves no trace in this log.</p>
<h2>The integrity check</h2>
<p>Unlike upload monitoring, here you aren&#8217;t looking at new uploads but at files already present. The plugin compares the MD5 hashes of its <code>.php</code> files against the ones expected. It looks for files that have been changed, are missing, or have been added. It excludes the <code>tests</code> and <code>dist</code> folders. Files that aren&#8217;t PHP aren&#8217;t checked.</p>
<p>The check runs once a day, through the WordPress scheduling system. On a low-traffic site it can slip. The reference is the <code>checksums.json</code> file in the plugin folder, if present. Otherwise the plugin uses a snapshot of the files taken on activation and on every version change.</p>
<h3>How to read the outcome</h3>
<p>You&#8217;ll find it in the Test tab, in the “Plugin file integrity” box, which also has the “Check now” button to run the check immediately. There are four cases:</p>
<ul>
<li>“No check has run yet.”, if it has never started.</li>
<li>Green box: “All N files checked match. Last check: date.”.</li>
<li>Yellow box: “No reference available: cannot verify. Reactivate the plugin to take a new snapshot of the files.”.</li>
<li>Red box: “WARNING: the plugin&#8217;s files do not match what is expected.”, with three lists: “Changed”, “Missing”, “Unexpected”.</li>
</ul>
<p>At most 15 names appear in each list. If you see red and haven&#8217;t touched the files by hand, the plugin tells you to treat the site as potentially compromised. Reinstall the plugin from a trusted copy and check the rest of the installation.</p>
<p>If the reference is the snapshot, the green box says so. That comparison finds changes made afterwards, not a plugin already compromised at the time of installation.</p>
<p><strong>Warning:</strong> integrity is a detector, not a barrier. Anyone who has already written to the files can also rewrite the hashes or switch off the check. Manual changes, or an upload that stops halfway, produce a red alert.</p>
<h2>What happens behind the scenes</h2>
<p>Upload monitoring and integrity share the same log. The daily check writes to the activity log in only two cases: when it finds a problem, and when, after a problem, things return to normal. When all is well it writes nothing. The log is then sent to the panel, so a copy of the alert sits off your server.</p>
<h2>If something goes wrong</h2>
<p>Upload monitoring stays useful even with blocking switched off. If a legitimate plugin stops uploading files, switch off “Block executable files” and try again. To understand which uploads reach the site, leave monitoring on and check the log. For the rules on files in uploads, see also the <a href="https://www.cisilino.com/en/?p=978">Hardening / IDS</a> chapter.</p>
<p>The risk this is trying to reduce is described by OWASP: read the page on <a href="https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload" target="_blank" rel="noopener">unrestricted file upload</a>, useful for understanding why uploads are a weak point.</p>
<p>Previous chapter: <a href="https://www.cisilino.com/en/?p=978">Hardening / IDS: the rules for .htaccess</a>. Next chapter: <a href="https://www.cisilino.com/en/?p=980">Test tab: checking that the protections work</a>. Index: <a href="https://www.cisilino.com/en/?p=972">introduction to the manual</a>.</p><p>The post <a href="https://www.cisilino.com/en/2026/10/30/upload-monitoring-integrity-check/">Upload monitoring and the integrity check</a> first appeared on <a href="https://www.cisilino.com/en/">Matteo Cisilino</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.cisilino.com/en/2026/10/30/upload-monitoring-integrity-check/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Hardening / IDS: the .htaccess rules</title>
		<link>https://www.cisilino.com/en/2026/10/30/hardening-ids-htaccess-rules/</link>
					<comments>https://www.cisilino.com/en/2026/10/30/hardening-ids-htaccess-rules/#respond</comments>
		
		<dc:creator><![CDATA[matteocisilino]]></dc:creator>
		<pubDate>Fri, 30 Oct 2026 16:05:39 +0000</pubDate>
				<category><![CDATA[CSDN manual]]></category>
		<category><![CDATA[.htaccess]]></category>
		<category><![CDATA[Cisilino Site Defense Network]]></category>
		<category><![CDATA[XML-RPC]]></category>
		<guid isPermaLink="false">https://www.cisilino.com/?p=1049</guid>

					<description><![CDATA[<p>The Hardening / IDS tab of the plugin CSDN, rule by rule: what it blocks, what it can break, and why custom paths must be written with care.</p>
<p>The post <a href="https://www.cisilino.com/en/2026/10/30/hardening-ids-htaccess-rules/">Hardening / IDS: the .htaccess rules</a> first appeared on <a href="https://www.cisilino.com/en/">Matteo Cisilino</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>WordPress hardening in the CSDN plugin sits entirely in one tab: “Hardening / IDS”. It&#8217;s five switches and one text field. They are there to close doors that almost no site genuinely uses. They are all off, and you turn them on one at a time.</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" src="https://www.cisilino.com/wp-content/uploads/2026/10/manuale-csdn-hardening-ids.webp" alt="Diagram of WordPress with the Hardening / IDS tab of the plugin CSDN: WordPress hardening" width="1200" height="630"/></figure>
<h2>Where to find WordPress hardening</h2>
<p>Open <strong>Settings &gt; Cisilino Site Defense Network</strong> (point 1 in the image). Then click the <strong>Hardening / IDS</strong> tab (point 2). In the tab you&#8217;ll find three sections, in this order:</p>
<ul>
<li>point 3: under the heading “Hardening / access control (IDS)”, the row “.htaccess rules”.</li>
<li>point 4: “WordPress”.</li>
<li>point 5: “Custom paths to block”.</li>
</ul>
<p>At the top the tab says: “Optional rules applied at server level (.htaccess) or in WordPress. All off by default: only turn them on if you know they won&#8217;t conflict with the site&#8217;s themes or plugins.” At the bottom there&#8217;s a single button: “Save hardening rules”.</p>
<h2>What it&#8217;s for</h2>
<p>The rules reduce the attack surface. Three switches write to the <code>.htaccess</code> file, as does the custom paths field. Two switches are WordPress filters. This isn&#8217;t a firewall and it doesn&#8217;t analyse requests: here “IDS” means rules for accessing files and folders.</p>
<h2>The .htaccess rules (point 3)</h2>
<h3>Block PHP execution in wp-content/uploads</h3>
<p>The full label is “Block PHP execution in wp-content/uploads (protection against shells uploaded as an &#8220;image&#8221;)”. The plugin replies with 403 to any request for a file with extension <code>php</code>, <code>php3</code>, <code>php4</code>, <code>php5</code>, <code>php7</code>, <code>php8</code>, <code>php9</code>, <code>phtml</code>, <code>phps</code>, <code>phar</code> or <code>pht</code> whose address contains <code>/wp-content/uploads/</code>. Capital letters don&#8217;t matter.</p>
<p>It only works with Apache 2.4 (it needs the mod_authz_core module: without it, the rule does nothing and doesn&#8217;t report that). On nginx the <code>.htaccess</code> file is ignored and no rule in this tab has any effect, aside from the WordPress filters. It covers the standard uploads folder, not a custom one. It can break plugins that genuinely serve PHP files from that folder. To know whether it works on your site, use the test in the <a href="https://www.cisilino.com/en/?p=980">Test tab</a> chapter.</p>
<h3>Disable directory listing for folders without an index</h3>
<p>It writes a single line: <code>Options -Indexes</code>. Opening a folder with no index page will now show a 403 error instead of the file listing. If you use a folder as a public list of downloads, that listing disappears.</p>
<h3>Block direct access to wp-config.php, .htaccess, readme.html, debug.log</h3>
<p>The plugin writes a rule for each name and replies with 403. The check is on the file&#8217;s name, not its path. It therefore applies to any file with that name in any folder on the site, even inside other plugins. A plugin that publishes its own <code>readme.html</code> or <code>debug.log</code> will be blocked.</p>
<h2>The WordPress rules (point 4)</h2>
<p>These two WordPress hardening rules are PHP filters. They don&#8217;t touch <code>.htaccess</code>.</p>
<h3>Disable XML-RPC</h3>
<p>The label is “Disable XML-RPC (brute force/pingback, almost never needed on modern sites)”. The <code>xmlrpc.php</code> file stays in place, but WordPress refuses the XML-RPC methods that require login. <strong>Warning:</strong> this stops the WordPress mobile app, part of Jetpack&#8217;s functions, and publishing from external clients. The <code>pingback.ping</code> method doesn&#8217;t require login, and the filter doesn&#8217;t stop it: don&#8217;t rely on this rule to close down pingbacks. Trackbacks don&#8217;t use XML-RPC and aren&#8217;t affected. The plugin&#8217;s connection to the panel doesn&#8217;t use XML-RPC either, so it isn&#8217;t affected.</p>
<h3>Block user enumeration via ?author=N</h3>
<p>If the request contains the <code>author</code> parameter with a value (other than empty or <code>0</code>), the public site shows “Not found.” with a 404 response. <strong>Warning:</strong> this rule doesn&#8217;t protect the REST API. The user list at <code>/wp-json/wp/v2/users</code> stays reachable. Some themes and plugins use <code>?author=</code> to filter archives, and these will be blocked.</p>
<h2>Custom paths to block (point 5)</h2>
<p>This text field is for anyone who wants to close a specific folder, for example <code>/wp-content/uploads/old-backup/</code>. Write one path per line. Empty lines are ignored.</p>
<p>Each line is <strong>literal text</strong>. Capital letters matter, and the part after the <code>?</code> in the address isn&#8217;t compared. The help text under the field talks about “patterns”, but none exist here. There are no wildcards: <code>*</code>, <code>^</code> and <code>$</code> count as plain characters. The plugin blocks with 403 any address that <strong>contains</strong> that string, anywhere within it. That&#8217;s why the path <code>/wp-content/uploads/old-backup/</code> also blocks <code>/blog/wp-content/uploads/old-backup/x</code>.</p>
<p>This field has no switch. The rule is active as soon as the field isn&#8217;t empty and you save.</p>
<p><strong>Warning:</strong> if you write <code>/</code> or <code>wp</code> you block the whole site, admin area included. To get back you would need to fix <code>.htaccess</code> via FTP. Even a string such as <code>/uploads/</code> blocks every image. Avoid the <code>%</code> character in paths.</p>
<h2>Default values</h2>
<p>Five switches off and an empty field. The settings live in the <code>csdn_hardening</code> option.</p>
<h2>How to use it</h2>
<p>Take it slowly: WordPress hardening is done one rule at a time.</p>
<ol>
<li>Make a copy of <code>.htaccess</code> before you start.</li>
<li>Tick a single rule.</li>
<li>Click “Save hardening rules”.</li>
<li>Check that the site opens and that the admin panel works.</li>
<li>Move on to the next rule.</li>
</ol>
<p>After saving you are taken back to the General tab, not the one you saved. At the top you&#8217;ll find the notice. On success it says “Hardening rules saved and applied.”. On failure it says “Settings saved, but writing to .htaccess failed (permissions?). The rules are not active.”. With the failure, the two PHP filters stay active regardless.</p>
<p><strong>Warning:</strong> the plugin makes no backup of <code>.htaccess</code> whatsoever. It doesn&#8217;t even check the syntax before writing. A rule that your server doesn&#8217;t support can cause a 500 error across the whole site. On a multisite network the file belongs to the network: the error hits every site.</p>
<h2>What happens behind the scenes</h2>
<p>The plugin writes between two markers: <code># BEGIN Cisilino Site Defense Network - Hardening</code> and the matching <code># END</code>. The rest of the file is untouched. A second, separate block holds the blocked IPs. If you deactivate the plugin, both blocks are emptied. If you turn everything off and save, the hardening block stays empty.</p>
<h2>If something goes wrong</h2>
<p>If the site shows a 500 error after WordPress hardening, open <code>.htaccess</code> via FTP. Delete the lines between the two hardening markers. Then try again with fewer rules. If nothing is written to the file, check the permissions on <code>.htaccess</code>.</p>
<p>For a wider view of good practice, read the official guide to <a href="https://developer.wordpress.org/advanced-administration/security/hardening/" target="_blank" rel="noopener">hardening WordPress</a>: it explains other measures that sit outside the plugin.</p>
<p>Previous chapter: <a href="https://www.cisilino.com/en/?p=977">Blocked IPs tab: reading the blacklist</a>. Next chapter: <a href="https://www.cisilino.com/en/?p=979">Upload monitoring and the integrity check</a>. For the full list of chapters go back to the <a href="https://www.cisilino.com/en/?p=972">introduction to the manual</a>.</p><p>The post <a href="https://www.cisilino.com/en/2026/10/30/hardening-ids-htaccess-rules/">Hardening / IDS: the .htaccess rules</a> first appeared on <a href="https://www.cisilino.com/en/">Matteo Cisilino</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.cisilino.com/en/2026/10/30/hardening-ids-htaccess-rules/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
