Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(147)

Side by Side Diff: net/tools/testserver/testserver.py

Issue 7246021: Prevent DOS attack on UDP echo servers by distinguishing between an echo request (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 #!/usr/bin/python2.4 1 #!/usr/bin/python2.4
2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2011 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """This is a simple HTTP/FTP/SYNC/TCP ECHO/UDP ECHO/ server used for testing 6 """This is a simple HTTP/FTP/SYNC/TCP/UDP/ server used for testing Chrome.
7 Chrome.
8 7
9 It supports several test URLs, as specified by the handlers in TestPageHandler. 8 It supports several test URLs, as specified by the handlers in TestPageHandler.
10 By default, it listens on an ephemeral port and sends the port number back to 9 By default, it listens on an ephemeral port and sends the port number back to
11 the originating process over a pipe. The originating process can specify an 10 the originating process over a pipe. The originating process can specify an
12 explicit port if necessary. 11 explicit port if necessary.
13 It can use https if you specify the flag --https=CERT where CERT is the path 12 It can use https if you specify the flag --https=CERT where CERT is the path
14 to a pem file containing the certificate and private key that should be used. 13 to a pem file containing the certificate and private key that should be used.
15 """ 14 """
16 15
17 import asyncore 16 import asyncore
18 import base64 17 import base64
19 import BaseHTTPServer 18 import BaseHTTPServer
20 import cgi 19 import cgi
21 import errno 20 import errno
22 import optparse 21 import optparse
23 import os 22 import os
23 import random
24 import re 24 import re
25 import select 25 import select
26 import simplejson 26 import simplejson
27 import SocketServer 27 import SocketServer
28 import socket 28 import socket
29 import sys 29 import sys
30 import struct 30 import struct
31 import time 31 import time
32 import urlparse 32 import urlparse
33 import warnings 33 import warnings
34 import zlib 34 import zlib
35 35
36 # Ignore deprecation warnings, they make our output more cluttered. 36 # Ignore deprecation warnings, they make our output more cluttered.
37 warnings.filterwarnings("ignore", category=DeprecationWarning) 37 warnings.filterwarnings("ignore", category=DeprecationWarning)
38 38
39 import echo_message
39 import pyftpdlib.ftpserver 40 import pyftpdlib.ftpserver
40 import tlslite 41 import tlslite
41 import tlslite.api 42 import tlslite.api
42 43
43 try: 44 try:
44 import hashlib 45 import hashlib
45 _new_md5 = hashlib.md5 46 _new_md5 = hashlib.md5
46 except ImportError: 47 except ImportError:
47 import md5 48 import md5
48 _new_md5 = md5.new 49 _new_md5 = md5.new
(...skipping 1451 matching lines...) Expand 10 before | Expand all | Expand 10 after
1500 1501
1501 1502
1502 class TCPEchoHandler(SocketServer.BaseRequestHandler): 1503 class TCPEchoHandler(SocketServer.BaseRequestHandler):
1503 """The RequestHandler class for TCP echo server. 1504 """The RequestHandler class for TCP echo server.
1504 1505
1505 It is instantiated once per connection to the server, and overrides the 1506 It is instantiated once per connection to the server, and overrides the
1506 handle() method to implement communication to the client. 1507 handle() method to implement communication to the client.
1507 """ 1508 """
1508 1509
1509 def handle(self): 1510 def handle(self):
1510 data = self.request.recv(65536) 1511 """Handles the request from the client and responds back with a response."""
jar (doing other things) 2011/08/15 19:33:50 nit: Avoid two forms of respond (responds + respon
ramant (doing other things) 2011/08/16 00:00:03 Done.
1511 if not data: 1512
1513 data = self.request.recv(65536).strip()
1514 # Verify the "echo request" message received from the client. Send back
1515 # "echo response" message if "echo request" message is valid.
1516 try:
1517 return_data = echo_message.GetEchoResponseData(data)
1518 if not return_data:
1512 return 1519 return
1513 self.request.send(data) 1520 except ValueError:
1521 return
1522
1523 self.request.send(return_data)
1514 1524
1515 1525
1516 class UDPEchoHandler(SocketServer.BaseRequestHandler): 1526 class UDPEchoHandler(SocketServer.BaseRequestHandler):
1517 """The RequestHandler class for UDP echo server. 1527 """The RequestHandler class for UDP echo server.
1518 1528
1519 It is instantiated once per connection to the server, and overrides the 1529 It is instantiated once per connection to the server, and overrides the
1520 handle() method to implement communication to the client. 1530 handle() method to implement communication to the client.
1521 """ 1531 """
1522 1532
1523 def handle(self): 1533 def handle(self):
1534 """Handles the request from the client and responds back with a response."""
1535
1524 data = self.request[0].strip() 1536 data = self.request[0].strip()
1525 socket = self.request[1] 1537 socket = self.request[1]
1526 socket.sendto(data, self.client_address) 1538 # Verify the "echo request" message received from the client. Send back
1539 # "echo response" message if "echo request" message is valid.
1540 try:
1541 return_data = echo_message.GetEchoResponseData(data)
1542 if not return_data:
1543 return
1544 except ValueError:
1545 return
1546 socket.sendto(return_data, self.client_address)
1527 1547
1528 1548
1529 class FileMultiplexer: 1549 class FileMultiplexer:
1530 def __init__(self, fd1, fd2) : 1550 def __init__(self, fd1, fd2) :
1531 self.__fd1 = fd1 1551 self.__fd1 = fd1
1532 self.__fd2 = fd2 1552 self.__fd2 = fd2
1533 1553
1534 def __del__(self) : 1554 def __del__(self) :
1535 if self.__fd1 != sys.stdout and self.__fd1 != sys.stderr: 1555 if self.__fd1 != sys.stdout and self.__fd1 != sys.stderr:
1536 self.__fd1.close() 1556 self.__fd1.close()
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1583 server._device_management_handler = None 1603 server._device_management_handler = None
1584 server.policy_keys = options.policy_keys 1604 server.policy_keys = options.policy_keys
1585 server.policy_user = options.policy_user 1605 server.policy_user = options.policy_user
1586 elif options.server_type == SERVER_SYNC: 1606 elif options.server_type == SERVER_SYNC:
1587 server = SyncHTTPServer(('127.0.0.1', port), SyncPageHandler) 1607 server = SyncHTTPServer(('127.0.0.1', port), SyncPageHandler)
1588 print 'Sync HTTP server started on port %d...' % server.server_port 1608 print 'Sync HTTP server started on port %d...' % server.server_port
1589 print 'Sync XMPP server started on port %d...' % server.xmpp_port 1609 print 'Sync XMPP server started on port %d...' % server.xmpp_port
1590 server_data['port'] = server.server_port 1610 server_data['port'] = server.server_port
1591 server_data['xmpp_port'] = server.xmpp_port 1611 server_data['xmpp_port'] = server.xmpp_port
1592 elif options.server_type == SERVER_TCP_ECHO: 1612 elif options.server_type == SERVER_TCP_ECHO:
1613 # Used for generating the key (randomly) that encodes the "echo request"
1614 # message.
1615 random.seed()
1593 server = TCPEchoServer(('127.0.0.1', port), TCPEchoHandler) 1616 server = TCPEchoServer(('127.0.0.1', port), TCPEchoHandler)
1594 print 'Echo TCP server started on port %d...' % server.server_port 1617 print 'Echo TCP server started on port %d...' % server.server_port
1595 server_data['port'] = server.server_port 1618 server_data['port'] = server.server_port
1596 elif options.server_type == SERVER_UDP_ECHO: 1619 elif options.server_type == SERVER_UDP_ECHO:
1620 # Used for generating the key (randomly) that encodes the "echo request"
1621 # message.
1622 random.seed()
1597 server = UDPEchoServer(('127.0.0.1', port), UDPEchoHandler) 1623 server = UDPEchoServer(('127.0.0.1', port), UDPEchoHandler)
1598 print 'Echo UDP server started on port %d...' % server.server_port 1624 print 'Echo UDP server started on port %d...' % server.server_port
1599 server_data['port'] = server.server_port 1625 server_data['port'] = server.server_port
1600 # means FTP Server 1626 # means FTP Server
1601 else: 1627 else:
1602 my_data_dir = MakeDataDir() 1628 my_data_dir = MakeDataDir()
1603 1629
1604 # Instantiate a dummy authorizer for managing 'virtual' users 1630 # Instantiate a dummy authorizer for managing 'virtual' users
1605 authorizer = pyftpdlib.ftpserver.DummyAuthorizer() 1631 authorizer = pyftpdlib.ftpserver.DummyAuthorizer()
1606 1632
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
1713 'random key if none is specified on the command ' 1739 'random key if none is specified on the command '
1714 'line.') 1740 'line.')
1715 option_parser.add_option('', '--policy-user', default='user@example.com', 1741 option_parser.add_option('', '--policy-user', default='user@example.com',
1716 dest='policy_user', 1742 dest='policy_user',
1717 help='Specify the user name the server should ' 1743 help='Specify the user name the server should '
1718 'report back to the client as the user owning the ' 1744 'report back to the client as the user owning the '
1719 'token used for making the policy request.') 1745 'token used for making the policy request.')
1720 options, args = option_parser.parse_args() 1746 options, args = option_parser.parse_args()
1721 1747
1722 sys.exit(main(options, args)) 1748 sys.exit(main(options, args))
OLDNEW
« chrome/browser/net/network_stats.cc ('K') | « net/tools/testserver/echo_message.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698