Browse Source

Disallow unwanted target addresses: reserved, multicast, link-local, etc

Baptiste Jonglez 10 years ago
parent
commit
f762d1b813
2 changed files with 15 additions and 1 deletions
  1. 9 1
      peerfinder.py
  2. 6 0
      templates/submit_error_forbidden.html

+ 9 - 1
peerfinder.py

@@ -8,7 +8,7 @@ from flask.ext.migrate import Migrate, MigrateCommand
 #from flask import session, request, url_for, redirect, render_template
 
 import netaddr
-from netaddr import IPAddress, IPSet
+from netaddr import IPAddress, IPNetwork, IPSet
 # Hack for python3
 from netaddr.strategy.ipv4 import packed_to_int as unpack_v4
 from netaddr.strategy.ipv6 import packed_to_int as unpack_v6
@@ -37,6 +37,10 @@ def unpack(ip):
 def is_valid_ip(ip):
     return netaddr.valid_ipv4(ip) or netaddr.valid_ipv6(ip)
 
+def is_forbidden_ip(ip):
+    # 0.0.0.0/8 is reserved, but for some reason, is_reserved() returns false
+    return ip.is_link_local() or ip.is_loopback() or ip.is_multicast() or ip.is_reserved() or (ip in IPNetwork('0.0.0.0/8'))
+
 def resolve_name(hostname):
     try:
         return list({s[4][0] for s in socket.getaddrinfo(hostname, None)})
@@ -243,6 +247,10 @@ def submit_job():
             targets = [Target(ip, public) for ip in resolve_name(target)]
         if targets == []:
             return render_template('submit_error.html', target=request.form['target'])
+        # Check for forbidden targets
+        for target in targets:
+            if is_forbidden_ip(target.get_ip()):
+                return render_template('submit_error_forbidden.html', ip=target.get_ip())
         for t in targets:
             db.session.add(t)
         db.session.commit()

+ 6 - 0
templates/submit_error_forbidden.html

@@ -0,0 +1,6 @@
+{% extends "base.html" %}
+
+{% block content %}
+<p><strong>Error:</strong> the target you specified (&quot;{{ ip }}&quot;)
+is invalid.</p>
+{% endblock %}