--- a/wiki.pl
+++ b/wiki.pl
@@ -2715,6 +2715,11 @@ sub UserIsBanned {
   $host = &GetRemoteHost(0);
   foreach (split(/\n/, $data)) {
     next  if ((/^\s*$/) || (/^#/));  # Skip empty, spaces, or comments
+    if ($_ eq "unknown") { return 1 if ($host =~ /^[\d.]+$/); next; } # Ban unknown hosts
+    if ($_ eq "unknown+unregistered") { # Check whether the user is registered
+      return 1 if ($host =~ /^[\d.]+$/ and &GetParam('username','') eq '');
+      next;
+    }
     return 1  if ($ip   =~ /$_/i);
     return 1  if ($host =~ /$_/i);
   }
@@ -4438,7 +4443,10 @@ sub DoEditBanned {
         "# blocks exact IP address<br>",
         "^123\\.21\\.3\\.9\$<br>",
         "# blocks whole 123.21.3.* IP network<br>",
-        "^123\\.21\\.3\\.\\d+\$<p>";
+        "^123\\.21\\.3\\.\\d+\$<br>",
+        "# the special token 'unknown' blocks all unresolvable addresses<br>",
+        "# using 'unknown+unregistered' blocks unregistered users only<br>",
+        "unknown<p>";
   print &GetTextArea('banlist', $banList, 12, 50);
   print "<br>", $q->submit(-name=>'Save'), "\n";
   print "<hr class=wikilinefooter>\n";
