<?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>Core Hosting: News &amp; Blog</title>
	<atom:link href="https://blog.core.eu/en/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.core.eu</link>
	<description>Domains &#124; Shared Hosting &#124; VPS &#124; SSL Certificates &#124; Colocation</description>
	<lastBuildDate>Thu, 22 Oct 2026 12:40:53 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://blog.core.eu/wp-content/uploads/2024/12/cropped-android-chrome-512x512-3-32x32.png</url>
	<title>Core Hosting: News &amp; Blog</title>
	<link>https://blog.core.eu</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>PHP2Shell on ispmanager and CloudLinux: what didn’t go by the book</title>
		<link>https://blog.core.eu/en/php2shell-ispmanager-cloudlinux-2/</link>
		
		<dc:creator><![CDATA[Core]]></dc:creator>
		<pubDate>Thu, 22 Oct 2026 12:40:51 +0000</pubDate>
				<category><![CDATA[Hosting]]></category>
		<category><![CDATA[Security]]></category>
		<guid isPermaLink="false">https://blog.core.eu/?p=1249</guid>

					<description><![CDATA[On 21 October 2026 the PHP project released 8.5.12, 8.4.27, 8.3.36 and 8.2.35, fixing two critical vulnerabilities, CVE-2026-109618 and CVE-2026-109619 (CVSS v4.0 9.2). Both allow unauthenticated remote code execution, and the vulnerable component is not a plugin but the interpreter itself: every PHP site, from WordPress to custom code. On a regular server the story [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">On 21 October 2026 the PHP project released 8.5.12, 8.4.27, 8.3.36 and 8.2.35, fixing two critical vulnerabilities, CVE-2026-109618 and CVE-2026-109619 (CVSS v4.0 9.2). Both allow unauthenticated remote code execution, and the vulnerable component is not a plugin but the interpreter itself: every PHP site, from WordPress to custom code.</p>



<p class="wp-block-paragraph">On a regular server the story is short: update the package and restart PHP. On hosting servers with ispmanager and CloudLinux it turned out to be more interesting. Over one night and morning we patched all our servers and stepped on almost every rake that neither the PHP advisory nor the panel documentation mentions.</p>



<p class="wp-block-paragraph">This is not a retelling of the advisory but a list of what didn&#8217;t go by the book and how we solved it. If you run a server with ispmanager, especially on CloudLinux, check each point on your own system: some of these problems stay invisible until you look in the right place.</p>



<h2 class="wp-block-heading">Temporary measures before the patches</h2>



<p class="wp-block-paragraph">Until packages are available you cannot fully close the vulnerabilities, only cut off the known attack paths. The public exploits that appeared before the release used the file upload progress handler, which runs on any <code>multipart/form-data</code> request, even if the site has no upload form at all.</p>



<p class="wp-block-paragraph">We did two things:</p>



<ol class="wp-block-list">
<li><strong>Disabled <code>session.upload_progress.enabled</code></strong> in all PHP versions. This is the PHP project&#8217;s own recommendation; almost nobody uses the feature, and sites are not affected. Important: the value must be set in <code>php.ini</code> or in the pool configuration, not via <code>ini_set()</code> or <code>.user.ini</code>, otherwise it applies too late.</li>



<li><strong>Blocked <code>multipart</code> at the nginx level</strong> for all sites. In ispmanager every vhost includes <code>/etc/nginx/vhosts-includes/*.conf</code>, so a single file covers the whole server:</li>
</ol>



<pre class="wp-block-code"><code>if ($http_content_type ~* "multipart") {
    return 403;
}</code></pre>



<p class="wp-block-paragraph">The price of the second measure: file uploads through forms, webmail attachments and imports in phpMyAdmin stop working. So this is a measure for hours, not days.</p>



<p class="wp-block-paragraph">Two places that are easy to miss:</p>



<ul class="wp-block-list">
<li><strong>The default <code>server</code> in <code>/etc/nginx/nginx.conf</code>.</strong> It catches requests by IP or with an unknown <code>Host</code> and, in ispmanager, proxies them to Apache, but it does not include <code>vhosts-includes</code>. Without a separate <code>include</code> there, an attack by IP bypasses the block.</li>



<li><strong>Apache on a public address.</strong> If Apache listens on a public IP rather than <code>127.0.0.1</code>, a request can be sent straight to it, bypassing nginx. Check: <code>ss -ltnp | grep httpd</code>.</li>
</ul>



<h2 class="wp-block-heading">The CageFS trap: the panel setting never reaches the sites</h2>



<p class="wp-block-paragraph">During the day we disabled <code>session.upload_progress.enabled</code> the standard way: &#8220;Web server settings → PHP → version → settings&#8221;. The panel showed the value as saved. In the evening, a check from inside the CageFS cage showed it was still enabled for the sites.</p>



<p class="wp-block-paragraph">The reason is how alt-php works on CloudLinux:</p>



<ul class="wp-block-list">
<li>ispmanager wrote the value into <code>/opt/alt/phpXX/etc/php.d.all/session.ini</code>, the ini file of the session extension;</li>



<li>in alt-php the session extension is built in and is not loaded through PHP Selector, so nobody inside the cage reads that ini file;</li>



<li>inside the cage PHP reads the main <code>/opt/alt/phpXX/etc/php.ini</code> and the user&#8217;s <code>alt_php.ini</code> from <code>/opt/alt/phpXX/link/conf</code>, which is a different directory from what root sees.</li>
</ul>



<p class="wp-block-paragraph">Hence the main lesson: <strong>check PHP settings as the user inside the cage, not as root</strong>:</p>



<pre class="wp-block-code"><code>su -s /bin/bash -c "/opt/alt/php83/usr/bin/php -r 'var_dump(ini_get(\"session.upload_progress.enabled\"));'" CLIENT_LOGIN</code></pre>



<p class="wp-block-paragraph">What worked:</p>



<ol class="wp-block-list">
<li>Append the directive to the end of the <code>php.ini</code> each version actually loads (the path is shown by <code>php --ini</code>, line <code>Loaded Configuration File</code>).</li>



<li>Run <code>cagefsctl --rebuild-alt-php-ini</code> to rebuild the users&#8217; <code>alt_php.ini</code> files.</li>



<li>Run <code>cagefsctl --update</code>: the native PHP inside the cage has its own copy of <code>/etc/php.ini</code> in the CageFS skeleton, and without updating the skeleton the change never reaches the sites.</li>



<li>Don&#8217;t forget the per-site <code>php.ini</code> files for CGI mode: ispmanager keeps them in <code>/var/www/USER/data/php-bin*/php.ini</code>.</li>



<li>Restart httpd and FPM.</li>
</ol>



<p class="wp-block-paragraph">One more detail: that same night at 03:37 something rebuilt the <code>php.ini</code> of every alt-php version from a template. If your change lives only in <code>php.ini</code>, back it up with a cron job that checks and restores the line until the patches arrive. We did exactly that, and cron did restore it several times, for example after the alt-php packages were updated.</p>



<h2 class="wp-block-heading">The multipart block breaks the panel login</h2>



<p class="wp-block-paragraph">A couple of hours after the block went in, a client wrote that they could not log in to the panel: the login request got a 403 and the interface showed a loading spinner forever. Nobody had blocked the client&#8217;s IP.</p>



<p class="wp-block-paragraph">The ispmanager panel runs on its own web server, ihttpd, on port 1500, and when you log in directly on that port nginx is indeed not involved. But if the <code>nginx_proxy</code> module is enabled, the panel is also reachable over 443 at <code>https://HOST/ispmgr</code>, and the login form is sent as <code>multipart/form-data</code>. Our block answered 403 in nginx, and the panel frontend cannot display that error.</p>



<p class="wp-block-paragraph">The module is included only in the vhost of the panel host (<code>/etc/nginx/modules-includes/nginx_proxy/</code>), and all its paths go to ihttpd, not to PHP. So it is safe to make an exception for the combination of host and path:</p>



<pre class="wp-block-code"><code>set $cve_mp 0;
if ($http_content_type ~* "multipart") { set $cve_mp 1; }
set $cve_hu "$host:$uri";
if ($cve_hu ~* "^panel\.example\.com:/(ispmgr|mancgi|manimg|long|shell|notify)(/|$)") { set $cve_mp 0; }
if ($cve_mp = 1) { return 403; }</code></pre>



<p class="wp-block-paragraph">An exception by path alone, without the host, would be a mistake: a request to <code>client-site/ispmgr</code> would go to Apache, WordPress would rewrite it to <code>index.php</code>, and PHP would parse the multipart body. On the panel host this path is guaranteed to go to ihttpd.</p>



<p class="wp-block-paragraph">Take the list of paths from the module itself (<code>grep location /etc/nginx/modules-includes/nginx_proxy/*.conf</code>), not from memory. And don&#8217;t test right after reloading nginx: the first requests may still be served by an old worker with the old configuration.</p>



<h2 class="wp-block-heading">The forgotten Roundcube and phpMyAdmin</h2>



<p class="wp-block-paragraph">When the alt-php patches came out, we updated the packages and removed the block. Only then did we remember that webmail and phpMyAdmin in ispmanager run <strong>not on the PHP version you selected for the sites</strong>. Updating alt-php does not touch them.</p>



<p class="wp-block-paragraph">Both applications are included through <code>vhosts-includes</code>, which means they are reachable on every domain on the server (<code>/roundcube</code>, <code>/webmail</code>, <code>/phpmyadmin</code> or a path with a random prefix). Which PHP runs them is shown by <code>fastcgi_pass</code> in these files:</p>



<pre class="wp-block-code"><code>grep -E 'location|fastcgi_pass' /etc/nginx/vhosts-includes/*roundcube*.conf /etc/nginx/vhosts-includes/*phpmyadmin*.conf</code></pre>



<p class="wp-block-paragraph">We found several variants across our servers:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Application</th><th>Via nginx</th><th>Via Apache</th></tr></thead><tbody><tr><td>Roundcube <code>/roundcube</code></td><td>native PHP-FPM (<code>php-fpm.apache.sock</code>) or isp-php74</td><td>isp-php74 via its own socket</td></tr><tr><td>Roundcube <code>/webmail</code></td><td>native PHP-FPM</td><td>mod_php</td></tr><tr><td>phpMyAdmin</td><td>native PHP-FPM</td><td>mod_php</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">The second column matters as much as the first. Apache receives these requests in two cases:</p>



<ul class="wp-block-list">
<li>a request by IP or with an unknown <code>Host</code> goes through the nginx default server straight to Apache, where <code>Alias /webmail</code> and <code>/phpmyadmin</code> are global;</li>



<li>the nginx configuration for <code>/webmail</code> and <code>/phpmyadmin</code> has <code>error_page 404 @apache</code> and <code>error_page 502 = @apache</code>. A URL with PATH_INFO such as <code>/webmail/index.php/x</code> does not match <code>location ~ \.php$</code>, gets a 404 and goes to Apache, where mod_php executes it.</li>
</ul>



<p class="wp-block-paragraph">On one of the servers the native PHP was 5.4 from CentOS 7, which will never receive fixes. While we were moving these applications to alt-php, the multipart block stayed only on their paths, and the sites already worked without restrictions:</p>



<pre class="wp-block-code"><code>if ($uri !~* "^/(roundcube|webmail|phpmyadmin)(/|$)") { set $cve_mp 0; }</code></pre>



<p class="wp-block-paragraph">During that time clients could not attach files in webmail, and they noticed almost immediately.</p>



<h2 class="wp-block-heading">Why the version number doesn&#8217;t change on CloudLinux</h2>



<p class="wp-block-paragraph">CloudLinux released fixes for all alt-php branches at once, from 5.4 to 8.5, but not as 8.3.36 or 8.4.27. They are new builds of the existing versions: <code>alt-php83-8.3.35-6</code>, <code>alt-php84-8.4.26-5</code>, <code>alt-php85-8.5.11-5</code> and so on. The patch is applied to the installed version, and only the package release number goes up.</p>



<p class="wp-block-paragraph">So check scripts that compare <code>PHP_VERSION</code> with 8.3.36 will keep reporting &#8220;vulnerable&#8221; after the update. And clients who look at the panel will see the same numbers and ask why nothing was updated. There are two reliable indicators.</p>



<p class="wp-block-paragraph"><strong>The package changelog.</strong> For the old branches CloudLinux additionally removed the upload progress handler entirely:</p>



<pre class="wp-block-code"><code>for p in $(rpm -qa --qf '%{NAME}\n' 'alt-php&#91;0-9]*' | grep -E '^alt-php(5&#91;4-9]|&#91;78]&#91;0-9])$' | sort -V); do
  printf '%-10s %-16s ' $p "$(rpm -q --qf '%{VERSION}-%{RELEASE}' $p)"
  rpm -q --changelog $p | head -10 | grep -c 'CVE-2026-10961&#91;89]'
done</code></pre>



<p class="wp-block-paragraph"><strong>Build Date in phpinfo().</strong> The fixed builds show 21 October 2026, the previous ones earlier dates. This is what you can tell clients: anyone can check it without server access.</p>



<p class="wp-block-paragraph">Native PHP has the same story from the other side. On RHEL 9 and its rebuilds the fixed 8.0 version is <code>php-8.0.30-8.el9_8.1</code> (Red Hat advisory RHSA-2026:87151), and in the changelog the CVE numbers ended up attached to the last item of the list, which has a completely different description. Without the advisory it is easy to mistake this for a routine update.</p>



<p class="wp-block-paragraph">The ispmanager packages (<code>isp-phpXX</code>) have a template changelog with a single 2019 entry. The indicators there are indirect: the build number (for us 1781 for 8.2-8.5, 1782 for 7.4, 1786 for 7.1) and a <code>Build Date</code> of 22 October.</p>



<h2 class="wp-block-heading">Pitfalls of the update itself</h2>



<p class="wp-block-paragraph"><strong><code>dnf --best --allowerasing</code> on an ispmanager server.</strong> On CloudLinux 9, <code>dnf update</code> printed a long list of conflicts: the repository contains native PHP 8.3.36 from a module stream, and dnf considers it the best candidate for the installed 8.0. But the ispmanager Apache module (<code>isp-httpd-mod_php</code>) strictly requires PHP 8.0.x, and <code>coremanager-pkg-php</code> and <code>ispmanager-pkg-php</code>, that is the panel itself, depend on it. The dnf hint to add <code>--best --allowerasing</code> is dangerous here: it would remove the panel packages. The conflict is harmless, and dnf ends with <code>Nothing to do</code>. To silence it until the 8.0 build arrives: <code>dnf update --exclude='php,php-*'</code>.</p>



<p class="wp-block-paragraph"><strong>ispmanager has its own Apache PHP module.</strong> It is loaded from <code>modules/isp-libphp8.so</code> and belongs to the <code>isp-httpd-mod_php</code> package, not to the system <code>php</code> package. The fixes for these CVEs live in the PHP core, that is inside the module itself, and updating the <code>php</code> package does not change it. Check:</p>



<pre class="wp-block-code"><code>grep -rhE 'LoadModule\s+php' /etc/httpd/conf.modules.d/ /etc/httpd/conf.d/
rpm -qf /etc/httpd/modules/isp-libphp8.so
strings /etc/httpd/modules/isp-libphp8.so | grep -m1 -E '&#91;A-Z]&#91;a-z]{2} &#91; 0-9]&#91;0-9] 20&#91;0-9]{2}'</code></pre>



<p class="wp-block-paragraph">If the module was built before 21 October, every site in &#8220;Apache module&#8221; mode stays vulnerable. To find them: <code>grep -lE 'SetHandler\s+application/x-httpd-php\s*$' /etc/httpd/conf/vhosts/*/*</code>. We moved such sites to alt-php, and where that was impossible (an interface that needs access outside CageFS), we restricted access by IP.</p>



<p class="wp-block-paragraph"><strong>Disabled PHP is worse than enabled PHP.</strong> Some former mod_php sites turned out to be static, so we disabled PHP for them. On one of them, next to the placeholder page, there were 61 files of an old site, and with PHP disabled their source code, including a config with the database password, was served as plain text. Before disabling PHP, check: <code>find DOCROOT -name '*.php*' | wc -l</code>.</p>



<p class="wp-block-paragraph"><strong>SSH dropping in the middle of a transaction.</strong> Updating 160 alt-php packages took several minutes, and the connection dropped. Luckily the transaction completed, but you have to verify: <code>dnf history list</code>, <code>dnf check</code> (on CentOS 7: <code>package-cleanup --problems</code>, <code>package-cleanup --dupes</code>). Run long updates inside <code>tmux</code>.</p>



<p class="wp-block-paragraph"><strong>Quiet ispmanager rebuilds.</strong> The fixed <code>isp-php</code> packages arrived one at a time over a day: first 8.2-8.5, then 7.4, then 7.1. For CentOS 7 the 7.4 build had not appeared at the time of writing. It makes sense to check <code>dnf check-update 'isp-php*'</code> several times a day.</p>



<h2 class="wp-block-heading">How to move Roundcube and phpMyAdmin to alt-php</h2>



<p class="wp-block-paragraph">On the server with native PHP 5.4 we moved the service FPM pool <code>apache</code> to alt-php56 while keeping the same socket. That way the nginx configuration does not change, and rolling back means simply starting the old service. Choosing 5.6 over 7.4 was simple: Roundcube 1.4 and the old phpMyAdmin ran on 5.4, 5.6 is the closest, and CloudLinux released a backport for it.</p>



<p class="wp-block-paragraph">Steps:</p>



<ol class="wp-block-list">
<li><strong>A dedicated ini directory.</strong> Outside CageFS, alt-php run by root loads only a minimal set of extensions; the rest live in <code>php.d.all</code>. We built a single <code>extensions.ini</code> from the required modules (session, json, dom, xml*, mbstring, intl, gd, mcrypt, zip, pdo, nd_mysql*). The CloudLinux ini files pull in their own dependencies, so duplicate <code>extension=</code> lines have to be removed.</li>



<li><strong>An FPM config</strong> with an <code>apache</code> pool on <code>/var/run/php-fpm.apache.sock</code>, the same <code>user</code>, <code>group</code> and <code>listen.owner</code>, and an explicit <code>session.save_path</code>, because it was not set in the native <code>php.ini</code>.</li>



<li><strong>A check before switching:</strong> <code>PHP_INI_SCAN_DIR=… php -m</code> without errors and <code>php-fpm -t -y …</code> reporting <code>test is successful</code>.</li>



<li><strong>A systemd unit</strong> with <code>Environment=PHP_INI_SCAN_DIR=…</code> and <code>ExecStart=… php-fpm --nodaemonize -y …</code>.</li>



<li><strong>The switch:</strong> rename <code>/etc/php-fpm.d/apache.conf</code>, restart the native FPM (it keeps the <code>www</code> pool), start the new one. A few seconds of downtime.</li>



<li><strong>Point Apache to the same socket.</strong> In <code>roundcube-webmail.conf</code> and <code>phpmyadmin-httpd.conf</code> replace <code>SetHandler application/x-httpd-php</code> with <code>SetHandler "proxy:unix:/var/run/php-fpm.apache.sock|fcgi://localhost/"</code>, and in <code>roundcube-isp.conf</code> replace the isp-php74 socket. Make sure <code>SetHandler</code> is inside <code>&lt;FilesMatch "\.php$"></code>, otherwise static files will go to FPM too.</li>
</ol>



<p class="wp-block-paragraph">Removing duplicate extensions from step 1:</p>



<pre class="wp-block-code"><code>awk '/^&#91;&#91;:space:]]*(zend_)?extension&#91;&#91;:space:]]*=/ { k=$0; gsub(/&#91;&#91;:space:]]/,"",k); if (seen&#91;k]++) next } { print }' $FILES &gt; conf.d/extensions.ini</code></pre>



<p class="wp-block-paragraph">Checking which PHP actually runs on each path, including a direct request to Apache and PATH_INFO:</p>



<pre class="wp-block-code"><code>echo '&lt;?php echo PHP_VERSION, " ", php_sapi_name();' &gt; /usr/share/roundcubemail/_v.php
curl -s -H 'Host: nonexistent.invalid' http://127.0.0.1:8080/webmail/_v.php
curl -sk https://DOMAIN/webmail/_v.php/x
rm -f /usr/share/roundcubemail/_v.php</code></pre>



<p class="wp-block-paragraph">Every line should say <code>5.6.40 fpm-fcgi</code>. After that the nginx block can be removed.</p>



<p class="wp-block-paragraph">Two downsides of this approach: on the Apache path the <code>open_basedir</code> restrictions from the mod_php configs are lost, and <code>roundcube-isp.conf</code> is marked by ispmanager as overwritten on package updates. After panel updates, check that the sockets have not reverted and that <code>/etc/php-fpm.d/apache.conf</code> has not reappeared.</p>



<h2 class="wp-block-heading">Checklist for an ispmanager server</h2>



<p class="wp-block-paragraph">If you run a server with ispmanager and are not yet sure you have fully closed PHP2Shell, go through this list:</p>



<ul class="wp-block-list">
<li>All alt-php branches in use are updated, and the changelog mentions CVE-2026-109618/109619 or the <code>Build Date</code> is 21 October 2026 or later.</li>



<li>The <code>isp-php*</code> packages are updated and the <code>php-fpm*</code> services restarted (after a unit file change, run <code>systemctl daemon-reload</code> first).</li>



<li>The OS native PHP is updated or serves nothing (check the pools in <code>/etc/php-fpm.d/</code> and who connects to their sockets).</li>



<li>The Apache module <code>isp-libphp8.so</code> was built after 21 October, or no site runs in &#8220;Apache module&#8221; mode.</li>



<li>Roundcube and phpMyAdmin run on patched PHP both via nginx and via Apache.</li>



<li>PHP settings were checked as the user inside CageFS, not as root.</li>



<li>The CageFS skeleton is updated (<code>cagefsctl --update</code>).</li>



<li>Temporary nginx blocks are removed, including the line in the default <code>server</code> in <code>nginx.conf</code>.</li>



<li>Sites with PHP disabled contain no <code>.php</code> files.</li>



<li>Clients know why the version number in the panel did not change.</li>
</ul>



<p class="wp-block-paragraph">The main takeaway from that night is simple: on a hosting server with a control panel, &#8220;update PHP&#8221; means not one package but five or six different PHP builds from three vendors (upstream via CloudLinux, ispmanager, the distribution), and some of them serve not the sites but the panel&#8217;s own applications. It pays to know in advance which PHP sits behind which path, before you need to find out at night.</p>



<h2 class="wp-block-heading">Sources</h2>



<ul class="wp-block-list">
<li><a href="https://www.php.net/archive/2026.php" target="_blank" rel="noopener">PHP: Security advisory, 21 Oct 2026</a></li>



<li><a href="https://cloudlinux.zendesk.com/hc/en-us/articles/31194180517916-PHP-CVE-2026-109618-CVE-2026-109619-reported-pre-disclosure-RCEs-updated-package-availability" target="_blank" rel="noopener">CloudLinux KB: updated package availability</a></li>



<li><a href="https://blog.cloudlinux.com/php-cve-2026-109618-and-cve-2026-109619" target="_blank" rel="noopener">CloudLinux blog: Imunify360 Ruleset 8.83</a></li>



<li><a href="https://access.redhat.com/errata/RHSA-2026:87151" target="_blank" rel="noopener">Red Hat RHSA-2026:87151 (PHP 8.0, RHEL 9)</a></li>



<li><a href="https://ispmanager.com/docs/ispmanager/php-settings-on-cloudlinux" target="_blank" rel="noopener">ispmanager: PHP settings on CloudLinux</a></li>



<li><a href="https://www.opennet.ru/opennews/art.shtml?num=66516" target="_blank" rel="noopener">OpenNet: PHP vulnerability (in Russian)</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to Register a Domain: From Choosing a Name to Renewal</title>
		<link>https://blog.core.eu/en/how-to-register-a-domain-from-choosing-a-name-to-renewal/</link>
		
		<dc:creator><![CDATA[Core]]></dc:creator>
		<pubDate>Sun, 07 Jun 2026 14:19:24 +0000</pubDate>
				<category><![CDATA[Domains]]></category>
		<guid isPermaLink="false">https://blog.core.eu/?p=1223</guid>

					<description><![CDATA[A domain is the address of your website and email on the internet. Without it there is no website, no business email, and no real online presence. Registering a domain is straightforward, but there are a few things worth knowing in advance to avoid problems later. Which Zones We Cover We register domains in several [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">A domain is the address of your website and email on the internet. Without it there is no website, no business email, and no real online presence. Registering a domain is straightforward, but there are a few things worth knowing in advance to avoid problems later.</p>



<h2 class="wp-block-heading">Which Zones We Cover</h2>



<p class="wp-block-paragraph">We register domains in several hundred zones, including national ones (.ee, .fi, .lv, .is, .de, .uk and others), generic ones (.com, .net, .org, .eu, .info, .biz), and newer gTLDs (.online, .store, .tech, .shop and many more). The current list with pricing is always available on <a href="https://my.core.hosting/cart.php?a=add&amp;domain=register" target="_blank" rel="noreferrer noopener nofollow">our domain search page</a>.</p>



<h2 class="wp-block-heading">How to Find an Available Domain</h2>



<p class="wp-block-paragraph">There are several ways to search.</p>



<p class="wp-block-paragraph"><strong>On our website </strong><a href="https://corehosting.eu/#domain-search" target="_blank" rel="noreferrer noopener nofollow">https://corehosting.eu/</a><strong>.</strong> Enter the name you want on the domain search page and the system will check availability across multiple zones at once. Useful if you have not yet decided on a zone.</p>



<p class="wp-block-paragraph"><strong>Directly in the Customer Portal </strong><a href="https://my.core.hosting/" target="_blank" rel="noreferrer noopener nofollow">https://my.core.hosting/</a><strong>.</strong> If you already have an account, you can order a domain straight from the control panel without leaving it.</p>



<p class="wp-block-paragraph"><strong>AI generator.</strong> If you have not settled on a name yet, describe your business or project and the system will suggest ideas. Useful when the obvious names are already taken.</p>



<p class="wp-block-paragraph"><strong>Classic search.</strong> If you know exactly what you want, just type the name and check.</p>



<h2 class="wp-block-heading">What to Consider When Choosing a Name</h2>



<p class="wp-block-paragraph">A domain is a long-term decision: the only way to change it is to register a new one. It is worth taking the choice seriously.</p>



<p class="wp-block-paragraph"><strong>Length and readability.</strong> Shorter names are easier to remember. Avoid words that people often spell differently, and names that are hard to read aloud or easy to mistype.</p>



<p class="wp-block-paragraph"><strong>Allowed characters.</strong> A domain may contain letters (a-z), digits (0-9), and hyphens. A hyphen cannot appear at the beginning or end of the name. Spaces, punctuation, and special characters are not allowed.</p>



<p class="wp-block-paragraph"><strong>Reserved and prohibited names.</strong> Some names are blocked at the registry level: geographic names, well-known brand names, technical words. If a domain is unavailable for no obvious reason, it is most likely reserved or blocked by the registry.</p>



<p class="wp-block-paragraph"><strong>Zone-specific rules.</strong> Each registry has its own requirements: registrant eligibility, local presence, mandatory identification. Before registering in an unfamiliar zone, it is worth checking the requirements.</p>



<h2 class="wp-block-heading">Domain Contact Details: The Most Important Thing People Forget</h2>



<p class="wp-block-paragraph">When registering a domain, you provide contact information: name, address, phone number, and most importantly, an email address. This is where renewal notices, registry communications, data change confirmations, and other critical messages are sent.</p>



<p class="wp-block-paragraph">A common mistake is providing a personal work email. The person leaves the company, the mailbox is closed or stops being read, and a year later the domain is not renewed because nobody is receiving the messages.</p>



<p class="wp-block-paragraph"><strong>The right approach for businesses:</strong> create a dedicated shared address such as domains@, hostmaster@, or admin@, accessible to several responsible employees. This kind of mailbox is not tied to any one person and will not disappear if someone leaves.</p>



<p class="wp-block-paragraph"><strong>For individuals:</strong> use an email address you actually read and plan to keep for a long time. A Gmail account or similar is a better choice than an address on the domain you are registering, which may itself expire.</p>



<p class="wp-block-paragraph">One more thing: after registration, the registry typically requires you to confirm the contact email. Keep an eye on your inbox right after registering, or the domain may be suspended.</p>



<h2 class="wp-block-heading">Keep Your Contact Details Up to Date</h2>



<p class="wp-block-paragraph">Contact information needs to be not only correct at the time of registration, but kept current over time. If your email, phone number, address, or company name changes, update the details in the control panel.</p>



<p class="wp-block-paragraph">We recommend reviewing your contact details at least once a year. When a domain renewal reminder arrives, it is a good moment to also check that everything is still correct.</p>



<h2 class="wp-block-heading">Do Not Leave Renewal to the Last Minute</h2>



<p class="wp-block-paragraph">An expired domain does not simply stop working. The freed name is instantly picked up by brokers and automated services that target expiring domains with a history. Popular names can be gone within minutes of being released. Buying your own domain back from a reseller costs significantly more than a regular renewal, if it is possible at all.</p>



<p class="wp-block-paragraph">After the registration period ends, the domain is not deleted immediately: first comes a grace period during which it can still be renewed, then a redemption period at an additional cost. It is better not to let it get that far. Renew early, do not wait until the last day.</p>



<h2 class="wp-block-heading">How We Notify You</h2>



<p class="wp-block-paragraph">We send reminders well in advance: the first notification goes out a month before expiration, then again at 14 days and 2 days before. Notifications are sent to the email in your domain contact record; invoices are issued to your billing account.</p>



<p class="wp-block-paragraph">If you do not plan to renew, simply leave the invoice unpaid. If you do plan to renew, do not ignore the messages.</p>



<p class="wp-block-paragraph">Have questions about registration or choosing a zone? Contact our support team, we will be happy to help.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Meet AIShopStaff — your webshop team in one app</title>
		<link>https://blog.core.eu/en/meet-aishopstaff-your-webshop-team-in-one-app/</link>
		
		<dc:creator><![CDATA[Core]]></dc:creator>
		<pubDate>Fri, 22 May 2026 10:56:09 +0000</pubDate>
				<category><![CDATA[News]]></category>
		<guid isPermaLink="false">https://blog.core.eu/?p=1214</guid>

					<description><![CDATA[We built an AI assistant for online store owners. Here&#8217;s what it does and why. Running an online store means writing constantly. Product descriptions, Instagram posts, review replies, About Us pages, email sequences — it never stops. And most store owners aren&#8217;t writers. They&#8217;re sellers. That&#8217;s why we built AIShopStaff. What is it? AIShopStaff is [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><strong>We built an AI assistant for online store owners. Here&#8217;s what it does and why.</strong></p>



<p class="wp-block-paragraph">Running an online store means writing constantly. Product descriptions, Instagram posts, review replies, About Us pages, email sequences — it never stops. And most store owners aren&#8217;t writers. They&#8217;re sellers.</p>



<p class="wp-block-paragraph">That&#8217;s why we built <strong><a href="https://aishopstaff.com/" target="_blank" rel="noreferrer noopener">AIShopStaff</a></strong>.</p>



<p class="wp-block-paragraph"><strong>What is it?</strong></p>



<p class="wp-block-paragraph"><a href="https://aishopstaff.com/" target="_blank" rel="noreferrer noopener">AIShopStaff</a> is an AI-powered assistant that handles content writing for online stores. You describe your store once — your niche, tone, audience, language — and every tool uses that context automatically. No prompting from scratch each time.</p>



<figure class="wp-block-gallery has-nested-images columns-4 wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://blog.core.eu/wp-content/uploads/2026/05/Product-Descriptions-—-AIShopStaff.png" target="_blank"><img fetchpriority="high" decoding="async" width="803" height="502" data-id="1202" src="https://blog.core.eu/wp-content/uploads/2026/05/Product-Descriptions-—-AIShopStaff.png" alt="" class="wp-image-1202" srcset="https://blog.core.eu/wp-content/uploads/2026/05/Product-Descriptions-—-AIShopStaff.png 803w, https://blog.core.eu/wp-content/uploads/2026/05/Product-Descriptions-—-AIShopStaff-300x188.png 300w, https://blog.core.eu/wp-content/uploads/2026/05/Product-Descriptions-—-AIShopStaff-768x480.png 768w" sizes="(max-width: 803px) 100vw, 803px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://blog.core.eu/wp-content/uploads/2026/05/Social-Media-Posts-—-AIShopStaff.png" target="_blank"><img decoding="async" width="803" height="578" data-id="1203" src="https://blog.core.eu/wp-content/uploads/2026/05/Social-Media-Posts-—-AIShopStaff.png" alt="" class="wp-image-1203" srcset="https://blog.core.eu/wp-content/uploads/2026/05/Social-Media-Posts-—-AIShopStaff.png 803w, https://blog.core.eu/wp-content/uploads/2026/05/Social-Media-Posts-—-AIShopStaff-300x216.png 300w, https://blog.core.eu/wp-content/uploads/2026/05/Social-Media-Posts-—-AIShopStaff-768x553.png 768w" sizes="(max-width: 803px) 100vw, 803px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://blog.core.eu/wp-content/uploads/2026/05/Store-Pages-and-Emails-—-AIShopStaff.png" target="_blank"><img decoding="async" width="803" height="490" data-id="1204" src="https://blog.core.eu/wp-content/uploads/2026/05/Store-Pages-and-Emails-—-AIShopStaff.png" alt="" class="wp-image-1204" srcset="https://blog.core.eu/wp-content/uploads/2026/05/Store-Pages-and-Emails-—-AIShopStaff.png 803w, https://blog.core.eu/wp-content/uploads/2026/05/Store-Pages-and-Emails-—-AIShopStaff-300x183.png 300w, https://blog.core.eu/wp-content/uploads/2026/05/Store-Pages-and-Emails-—-AIShopStaff-768x469.png 768w" sizes="(max-width: 803px) 100vw, 803px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://blog.core.eu/wp-content/uploads/2026/05/Review-Replies-—-AIShopStaff.png" target="_blank"><img loading="lazy" decoding="async" width="803" height="533" data-id="1200" src="https://blog.core.eu/wp-content/uploads/2026/05/Review-Replies-—-AIShopStaff.png" alt="" class="wp-image-1200" srcset="https://blog.core.eu/wp-content/uploads/2026/05/Review-Replies-—-AIShopStaff.png 803w, https://blog.core.eu/wp-content/uploads/2026/05/Review-Replies-—-AIShopStaff-300x199.png 300w, https://blog.core.eu/wp-content/uploads/2026/05/Review-Replies-—-AIShopStaff-768x510.png 768w" sizes="auto, (max-width: 803px) 100vw, 803px" /></a></figure>
</figure>



<p class="wp-block-paragraph"><strong>What it does:</strong></p>



<ul class="wp-block-list">
<li>Generates product descriptions from a CSV upload — entire catalogues in minutes</li>



<li>Writes Instagram and Facebook posts in your store&#8217;s voice</li>



<li>Replies to customer reviews professionally</li>



<li>Creates store pages and email templates: About Us, Delivery &amp; Returns, FAQ, welcome and promo emails</li>
</ul>



<p class="wp-block-paragraph"><strong>Who is it for?</strong></p>



<p class="wp-block-paragraph">Small and mid-sized online store owners who spend hours on writing tasks that should take minutes. Shopify, WooCommerce, PrestaShop, Etsy — it doesn&#8217;t matter what platform you&#8217;re on. If you sell online and write content, AIShopStaff saves you time.</p>



<p class="wp-block-paragraph">Content is generated in English, Estonian, Russian, Latvian, and Finnish.</p>



<p class="wp-block-paragraph"><strong>Why did we build it?</strong></p>



<p class="wp-block-paragraph">We <a href="https://corehosting.eu/" target="_blank" rel="noreferrer noopener">run hosting for hundreds of online stores</a>. We kept hearing the same thing: setting up a store is manageable, but keeping up with the content is exhausting. Product pages stay thin, social media goes quiet, review replies get copy-pasted.</p>



<p class="wp-block-paragraph">We wanted to fix that — not with another generic AI tool, but with something that actually understands what a store owner needs.</p>



<p class="wp-block-paragraph"><strong>Launching a new store?</strong></p>



<p class="wp-block-paragraph">There&#8217;s a separate one-time product — the <a href="https://aishopstaff.com/launch-kit" target="_blank" rel="noreferrer noopener">Store Launch Kit</a> — that generates everything you need before going live: About Us, FAQ, Delivery policy, welcome emails, social media bio, and launch posts. One payment, no subscription.</p>



<p class="wp-block-paragraph"><strong>Try it free</strong></p>



<p class="wp-block-paragraph">AIShopStaff comes with a 14-day free trial, no credit card required.</p>



<p class="wp-block-paragraph"><a href="https://aishopstaff.com/" target="_blank" rel="noreferrer noopener">aishopstaff.com</a></p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Free plugin: restrict wp-admin by country</title>
		<link>https://blog.core.eu/en/free-plugin-restrict-wp-admin-by-country/</link>
		
		<dc:creator><![CDATA[Core]]></dc:creator>
		<pubDate>Thu, 21 May 2026 09:42:34 +0000</pubDate>
				<category><![CDATA[Hosting]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Security]]></category>
		<guid isPermaLink="false">https://blog.core.eu/?p=1197</guid>

					<description><![CDATA[We&#8217;d like to share a useful tool for anyone running WordPress sites. Protect your WordPress admin from logins outside your country We built a free plugin that blocks access to the admin panel for IP addresses from countries not on your allowed list. What the plugin does The plugin blocks access to wp-admin and wp-login.php [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">We&#8217;d like to share a useful tool for anyone running WordPress sites.</p>



<h2 class="wp-block-heading">Protect your WordPress admin from logins outside your country</h2>



<p class="wp-block-paragraph">We built a free plugin that blocks access to the admin panel for IP addresses from countries not on your allowed list.</p>



<h3 class="wp-block-heading">What the plugin does</h3>



<p class="wp-block-paragraph">The plugin blocks access to <strong>wp-admin</strong> and <strong>wp-login.php</strong> for IP addresses from countries not in the allowed list. Frontend visitors, online store customers, and members area users are not affected — only the admin panel is restricted.</p>



<h3 class="wp-block-heading">Download</h3>



<p class="wp-block-paragraph"><a href="https://downloads.core.hosting/wp-plugins/block-access-to-admin-by-country/block-access-to-admin-by-country.zip" target="_blank" rel="noreferrer noopener nofollow">block-access-to-admin-by-country.zip</a></p>



<h3 class="wp-block-heading">Installation</h3>



<ol class="wp-block-list">
<li>Download the zip archive using the link above</li>



<li>In your WordPress dashboard, go to <strong>Plugins → Add New → Upload Plugin</strong></li>



<li>Select the downloaded archive and click <strong>Install Now</strong>, then <strong>Activate</strong></li>



<li>Go to <strong>Settings → Admin Country Block</strong> and set your allowed countries</li>
</ol>



<h3 class="wp-block-heading">Settings</h3>



<ul class="wp-block-list">
<li><strong>Allowed countries</strong> — country codes, one per line (e.g. EE, FI, LV). Only IPs from these countries will have access to the admin panel.</li>



<li><strong>Exception IPs</strong> — IP addresses that always have access regardless of country. Add your own IP here to avoid locking yourself out.</li>



<li><strong>Cache TTL</strong> — how long the lookup result is cached per IP address (default: 24 hours).</li>
</ul>



<h3 class="wp-block-heading">For Core Hosting customers</h3>



<p class="wp-block-paragraph">On Core Hosting <a href="https://my.core.hosting/" target="_blank" rel="noreferrer noopener">servers</a>, the plugin automatically uses a local MaxMind GeoLite2 database — no external requests, fast and reliable. The database is updated weekly. No additional configuration is needed.</p>



<h3 class="wp-block-heading">For sites on other hosting providers</h3>



<p class="wp-block-paragraph">he plugin uses a free geolocation API (freeipapi.com). You can also specify any other compatible API in the <strong>API URL</strong> field. Results are cached, so the number of API requests stays minimal.</p>



<p class="wp-block-paragraph">The plugin supports automatic updates — new versions will appear in the standard WordPress updates section.</p>



<p class="wp-block-paragraph">The plugin is free and open to everyone. If you run into any issues during installation or have questions, feel free to contact our support team.</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Transfer your .EE domain to us</title>
		<link>https://blog.core.eu/en/transfer-your-ee-domain-to-us/</link>
		
		<dc:creator><![CDATA[Core]]></dc:creator>
		<pubDate>Tue, 17 Mar 2026 16:56:03 +0000</pubDate>
				<category><![CDATA[Domains]]></category>
		<category><![CDATA[News]]></category>
		<guid isPermaLink="false">https://blog.core.eu/?p=1187</guid>

					<description><![CDATA[We now register and manage .EE domains. If your domain is currently registered with another registrar, you can transfer it to us and manage both your domain and hosting in one place. .EE domain transfer is free.We can handle the transfer for you. All we need is your confirmation. Renewal — €7 per year (excluding [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">We now register and manage <strong>.EE domains</strong>. If your domain is currently registered with another registrar, you can transfer it to us and manage both your domain and hosting in one place.</p>



<p class="wp-block-paragraph"><strong>.EE domain transfer is free.</strong><br />We can handle the transfer for you. All we need is your confirmation.</p>



<p class="wp-block-paragraph"><strong>Renewal — €7 per year (excluding VAT).</strong><br />A simple fixed price with no hidden fees.</p>



<p class="wp-block-paragraph"><strong>Important:</strong><br />If your domain has already been renewed for several years, <strong>that period remains unchanged.</strong><br />When transferring a domain, the paid registration period does not disappear and no immediate renewal is required.</p>



<p class="wp-block-paragraph">For example, if the domain is paid until 2029, it will remain valid until 2029 after the transfer.</p>



<p class="wp-block-paragraph"><strong>Why move your domain to the same provider as your hosting</strong></p>



<p class="wp-block-paragraph">When the domain and hosting are managed by the same provider, many technical tasks become simpler and faster:</p>



<ul class="wp-block-list">
<li>DNS changes can be made immediately without accessing external control panels</li>



<li>moving a website to another server can be done without additional actions from the client</li>



<li>in most cases there is no need to request access or confirmations from another registrar</li>
</ul>



<p class="wp-block-paragraph">In the coming months we will continue upgrading our infrastructure and migrating client accounts to new servers. If the domain is managed by us, such work can usually be completed faster and <strong>without needing to involve the website owner.</strong></p>



<p class="wp-block-paragraph"><strong>How to transfer a domain</strong></p>



<p class="wp-block-paragraph"><strong>1. Request the EPP code from your current registrar</strong><br /><strong>2. Fill in the transfer form and confirm the request:</strong><br /><a href="https://my.core.hosting/cart.php?a=add&amp;domain=transfer" target="_blank" rel="noreferrer noopener">https://my.core.hosting/cart.php?a=add&amp;domain=transfer</a></p>



<p class="wp-block-paragraph"><strong>Alternatively</strong></p>



<p class="wp-block-paragraph">If you prefer not to handle the transfer yourself, simply send us the name of your .EE domain. We will prepare the transfer and let you know what needs to be confirmed.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
