Verifying reverse DNS lookups
authorDarren <darren@darrenwhitlen.com>
Mon, 9 Dec 2013 23:51:58 +0000 (23:51 +0000)
committerDarren <darren@darrenwhitlen.com>
Mon, 9 Dec 2013 23:51:58 +0000 (23:51 +0000)
server/weblistener.js

index 3f566821856007fe7e002d843ec75e7d0d41c326..c5587e74160bb186cae36428ac5976b77d9de7a7 100644 (file)
@@ -124,7 +124,8 @@ function rangeCheck(addr, range) {
  */
 function initialiseSocket(socket, callback) {
     var request = socket.request,
-        address = request.connection.remoteAddress;
+        address = request.connection.remoteAddress,
+        revdns;
 
     // Key/val data stored to the socket to be read later on
     // May also be synced to a redis DB to lookup clients
@@ -155,15 +156,32 @@ function initialiseSocket(socket, callback) {
 
     try {
         dns.reverse(address, function (err, domains) {
-            if (err || domains.length === 0) {
+            if (!err && domains.length > 0) {
+                revdns = _.first(domains);
+            }
+
+            if (!revdns) {
+                // No reverse DNS found, use the IP
                 socket.meta.revdns = address;
+                callback(null, true);
+
             } else {
-                socket.meta.revdns = _.first(domains) || address;
+                // Make sure the reverse DNS matches the A record to use the hostname..
+                dns.lookup(revdns, function (err, ip_address, family) {
+                    if (!err && ip_address == address) {
+                        // A record matches PTR, perfectly valid hostname
+                        socket.meta.revdns = revdns;
+                    } else {
+                        // A record does not match the PTR, invalid hostname
+                        socket.meta.revdns = address;
+                    }
+
+                    // We have all the info we need, proceed with the connection
+                    callback(null, true);
+                });
             }
-
-            // All is well, authorise the connection
-            callback(null, true);
         });
+
     } catch (err) {
         socket.meta.revdns = address;
         callback(null, true);