瀏覽代碼

Student Version

Jose Ortiz 9 年之前
當前提交
281071f3ae
共有 10 個檔案被更改,包括 737 行新增0 行删除
  1. 498
    0
      README.md
  2. 20
    0
      domains.txt
  3. 19
    0
      emails.txt
  4. 19
    0
      gmail_emails.txt
  5. 21
    0
      ip_4integers.txt
  6. 26
    0
      ip_4like.txt
  7. 52
    0
      regex-tester.py
  8. 26
    0
      usernames.txt
  9. 26
    0
      usernames_swletter.txt
  10. 30
    0
      usernames_swletter_dotted.txt

+ 498
- 0
README.md 查看文件

@@ -0,0 +1,498 @@
1
+[English](#markdown-header-regular-expressions-input-validation) | [Español](#markdown-header-expresiones-regulares-validacion-de-entradas)
2
+
3
+# Expresiones Regulares - Validación de entradas
4
+
5
+##Objetivos
6
+
7
+1. Practicar la implementación de expresiones regulares para sanitizar los datos de entrada.
8
+
9
+
10
+## Pre-Modulo:
11
+
12
+Antes de trabajar en este módulo el estudiante debe
13
+
14
+1. Haber repasado la construcción de expresiones regulares.
15
+2. Haber repasado la implementación de expresiones regulares en python.
16
+
17
+## Validación de entradas usando expresiones regulares
18
+
19
+La validación de entradas es escencial en el desarrollo de aplicaciones seguras ya que es la primera línea de defensa de todas las aplicaciones.  La gran mayoría de las vulnerabilidades en aplicaciones es debido a pobre validación de las entradas de las aplicaciones. Ejemplo de vulnerabilidades explotadas por pobre validación de entradas lo son:
20
+
21
+1. Desbordamiento del Búfer 
22
+2. Cross Site Scripting
23
+3. Inyección de SQL, XML u otros lenguajes
24
+4. Recorrido de directorios
25
+5. Acceso a archivos privados
26
+
27
+Los atacantes utilizan errores en la validación de entradas para acceder a información privilegiada, para acceder a los sistemas, o para causar negación de servicios.
28
+
29
+Utilizando expresiones regulares la aplicación puede validar y solo aceptar datos de entradas que sean aceptadas por la especificación de una expresión regular.  Como por ejemplo se puede restringir a que la entrada consista solo de dígitos, o como vamos a hacer en este módulo, que las entradas sigan especificaciones estrictas de nombres de usuario, correos electrónicos, dominios y direcciones de IP versión 4.
30
+
31
+**Descargo de responsabilidad** Las expresiones regulares para los usuarios, correos electrónicos, ni dominios que se van a construir en este módulo incluyen todas las especificaciones según la definicion en el RFC[2].
32
+
33
+## Instrucciones generales
34
+
35
+En este módulo utilizaremos la librería `re` (regular expression) para a través de definiciones de expresiones regulares validar cadenas de entradas almacenadas en archivos.
36
+
37
+En general por cada ejercicio el estudiantes va a definir una expresion regular para validar una cadena de caracteres de entrada y una aplicación de python va a validar las cadenas y desplegar si la cadena es valida según la expresion regular provista.
38
+
39
+La expresión regular se va a definir en la variable `REGEXP` que se encuentra en las primeras líneas de código del script `regex-tester.py`.
40
+
41
+Luego de definir la expresión regular el estudiante debe correr el script con el archivo de entrada del ejercicio. Por ejemplo:
42
+
43
+```
44
+python regex-tester.py emails.txt
45
+```
46
+
47
+ejecuta el script `regex-tester.py` con el archivo de entrada `emails.txt`
48
+
49
+**Note** que toda expresión regular que el estudiante defina, va a ser finalmente entregada al instructor, así que anote todos las expresiones regulares usadas en los ejercicios.
50
+
51
+## Ejercicio 1: Expresiones regulares para nombres de usuarios.
52
+
53
+1. En el archivo `regex-tester.py` cambie el contenido de la variable `REGEXP` por la siguiente expresión regular: [a-zA-Z0-9]+
54
+    
55
+    Como debe notar esta expresión regular reconoce cualquier cadena de caracteres compuesta de uno o mas (+) letras [a-zA-Z] o digitos [0-9].
56
+
57
+2. Corre el script `regex-tester.py` con el archivo `usernames.txt`.
58
+    
59
+    ```python regex-tester.py usernames.txt```
60
+
61
+    Como resultado debe ver que todas las pruebas pasaron:
62
+    
63
+    ```26 strings passed, 0 strings failed``` y que nombres de usuarios como:
64
+
65
+    23bolitas y 123pescao pasaron la prueba.
66
+
67
+3. Modifique la expresión regular para que solo acepte nombres de usuarios que comiencen con una letra y no acepte usuarios como 23bolitas y 123pescao.
68
+
69
+4. Corra el script `regex-tester.py` con el archivo `usernames.txt`.
70
+
71
+    ```python regex-tester.py usernames.txt```
72
+
73
+    Como resultado debe ver que todas las pruebas pasaron menos 23bolitas y 123pescao:
74
+    
75
+    ```24 strings passed, 2 strings failed```
76
+
77
+5. Corra el script `regex-tester.py` con el archivo `usernames_swletter.txt`
78
+
79
+    ```python regex-tester.py usernames_swletter.txt```
80
+
81
+    Como resultado debe ver que todas las pruebas pasaron:
82
+    
83
+    ```26 strings passed, 0 strings failed```
84
+
85
+6. Corra el script `regex-tester.py` con el archivo `usernames_swletter_dotted.txt`
86
+
87
+    ```python regex-tester.py usernames_swletter_dotted.txt```
88
+
89
+    Como resultado debe ver:
90
+
91
+    ```10 strings passed, 20 strings failed``` 
92
+
93
+    debido a que 16 de los nombres de usuarios en ese archivo estan compuestos de nombres de usuarios con puntos entre medio o debido a que los nombres comienzanan con digitos o puntos.
94
+
95
+7. Modifique la expresión regular para que solo acepte nombres de usuarios que tengan puntos entre medio y cuyos nombres a los lados de los puntos comienzen con una letra.  Ejemplos: nombre.apellido, nombre1.apellido1, nombre1.apellido1.apellido2, ...
96
+
97
+8. Corra el script `regex-tester.py` con el archivo `usernames_swletter_dotted.txt`
98
+
99
+    ```python regex-tester.py usernames_swletter_dotted.txt```
100
+
101
+    Como resultado debe ver que todas las pruebas pasaron menos 4:
102
+
103
+    ```26 strings passed, 4 strings failed``` 
104
+
105
+    debido que las ultimos 4 líneas tienen nombres de usuario que o tienen puntos al princio o al final de nombre de usuario, o que los nombres a los lados de los puntos comienzan con digitos.
106
+
107
+**Note** que debe tener apuntado las expresiones regulares de los pasos 3 y 7.
108
+
109
+## Ejercicio 2: Expresiones regulares para nombres de dominios.
110
+
111
+1. En el archivo `regex-tester.py` cambie el contenido de la variable `REGEXP` por la siguiente expresión regular: [a-zA-Z0-9]+\.(com|edu|net|org)
112
+
113
+    Como debe notar esta expresión regular reconoce cualquier cadena de caracteres compuesta de uno o mas (+) letras [a-zA-Z] o digitos [0-9] seguidos por un punto y uno de los siguientes dominios de nivel superior com, edu, net, org.
114
+
115
+2. Corre el script `regex-tester.py` con el archivo `domains.txt`.
116
+
117
+    ```python regex-tester.py domains.txt```
118
+
119
+    Como resultado debe ver que 10 pruebas pasaron y 10 fallaron:
120
+    
121
+    ```10 strings passed, 10 strings failed```. 
122
+
123
+    Esta expresión regular solo acepta nombres de dominios de que consisten de un nivel superior com, edu, net, org y un segundo nivel de dominio como gmail.com, facebook.com, y twitter.com, pero no dominios con mas niveles como www.facebook.com y mail.gmail.com.
124
+
125
+3. Modifique la expresión regular para que acepte dominios con más de dos niveles incluyendo los dominio de nivel superior com, edu, net, org.
126
+
127
+4. Corre el script `regex-tester.py` con el archivo `domains.txt`.
128
+
129
+    ```python regex-tester.py domains.txt```
130
+
131
+    Como resultado debe ver que 16 pruebas pasaron y 4 fallaron:
132
+
133
+    ```16 strings passed, 4 strings failed```.  
134
+
135
+    Esto debido a que hay dominios de nivel superior mil (airforce.mil), gov (whitehouse.gov), y dominios de nivel superio de códigos de país (www.isla.com.pr), y un dominio de nivel superior invalido pur (www.isla.net.pur).
136
+
137
+5. Modifique la expresión regular para que acepte dominios con más de dos niveles, pero en adición incluya los dominios gov, mil, biz, y cualquier dominio de nivel superior de códigos de país.  Los dominios de nivel superior de códigos de país se componen de dos letras al final del dominio. Por ejemplo us (United States), pr (Puerto Rico), ca (Canada), ar (Argentina).  En otras palabras el dominio de nivel superior puede ser com, edu, net, org, gov, mil, biz, o cualquier combinación de dos letras (solo dos letras).
138
+
139
+6. Corre el script `regex-tester.py` con el archivo `domains.txt`.
140
+
141
+    ```python regex-tester.py domains.txt```
142
+
143
+    Como resultado debe ver que todas las pruebas pasaron menos la del dominio invalido pur. 
144
+
145
+    ```19 strings passed, 1 strings failed```. 
146
+
147
+**Note** que debe tener apuntado las expresiones regulares de los pasos 3 y 5.
148
+
149
+## Ejercicio 3: Expresiones regulares para correos electrónicos
150
+
151
+1. En el archivo `regex-tester.py` cambie el contenido de la variable `REGEXP` por la siguiente expresión regular: [a-zA-Z0-9]+\@gmail.com
152
+
153
+    Como debe notar esta expresión regular reconoce cualquier cadena de caracteres compuestas de nombres de usuarios de uno o mas (+) letras [a-zA-Z] o digitos [0-9] seguido de @ y el dominio gmail.com.
154
+
155
+2. Corre el script `regex-tester.py` con el archivo `gmail_emails.txt`.
156
+
157
+    ```python regex-tester.py gmail_emails.txt```
158
+
159
+    Como resultado debe ver que 5 pruebas pasaron y 14 fallaron:
160
+    
161
+    ```5 strings passed, 14 strings failed```. 
162
+
163
+    Esto debido a que a pesar que todos los correos electrónicos son de gmail, la expresion regular para los nombres de usuarios no permite nombres de usuarios que contienen punto entre medio.
164
+
165
+3. Modifique la expresión regular para que como en el Ejercicio 1.7 los usuarios de los correos electrónicos puedan contener puntos entre medio de nombres que comienzan con una letra.
166
+
167
+4. Corre el script `regex-tester.py` con el archivo `gmail_emails.txt`.
168
+
169
+    ```python regex-tester.py gmail_emails.txt```
170
+
171
+    Como resultado debe ver que todas las pruebas pasaron: 
172
+
173
+    ```19 strings passed, 0 strings failed```.
174
+
175
+5. Modifique la expresión regular para que como en el Ejericios 2.5 los correos electrónicos puedan tener dominios con más de dos niveles y el dominio de nivel superior pueda ser com, edu, net, org, gov, mil, biz, o cualquier combinación de dos letras (solo dos letras).
176
+
177
+6. Corre el script `regex-tester.py` con el archivo `emails.txt`
178
+
179
+    ```python regex-tester.py emails.txt```
180
+
181
+    Como resultado debe ver que todas las pruebas pasaron: 
182
+    
183
+    ```19 strings passed, 0 strings failed```.
184
+
185
+**Note** que debe tener apuntado las expresiones regulares de los pasos 3 y 5.
186
+
187
+### Ejercicio 4: Expresiones regulares para direcciones IP versión 4.
188
+
189
+Una dirección de IP version 4 consiste de 4 bytes en representación decimal donde los 4 bytes estan separados por un punto.  Por ejemplo: `10.12.20.5`,   consiste de 4 números decimales 10, 12, 20 y 5 separados por un punto.  Los números decimales van desde 0 hasta 255 ya que cada uno representa un byte.  Por lo tanto la siguiente cadena de caracteres no es una dirección de IP `10.244.260.21` por que tiene el número decimal 260 que es mayor que 255.
190
+
191
+1. En el archivo `regex-tester.py` cambie el contenido de la variable `REGEXP` por la siguiente expresión regular: (\d+\.)+\d+
192
+
193
+    Como debe notar esta expresión regular reconoce cualquier cadena de caracteres compuestas de uno o mas digitos divididos por puntos y terminando con uno o más digitos.  
194
+
195
+2. Corre el script `regex-tester.py` con el archivo `ip_4like.txt`.
196
+
197
+    ```python regex-tester.py ip_4like.txt```
198
+
199
+    Como resultado debe ver que todas las pruebas pasaron:
200
+
201
+    ```26 strings passed, 0 strings failed``` 
202
+
203
+    y que IPs como 10.0.1 y 10.1.1.1.1 son aceptados aún cuando a uno le falta un decimal y al otro le sobran.
204
+
205
+3. Modifique la expresión regular para que acepte solo IPs cuatro números decimales divididos por un punto.
206
+
207
+4. Corre el script `regex-tester.py` con el archivo `ip_4like.txt`.
208
+    ```python regex-tester.py ip_4like.txt```
209
+
210
+    Como resultado debe ver que todas las pruebas pasaron menos dos:
211
+
212
+    ```24 strings passed, 2 strings failed``` 
213
+
214
+    y que los IPs 10.0.1 y 10.1.1.1.1 ya no son aceptados.  Pero todavía IPs de cuatro números decimales como 256.10.11.1, 10.0.0.300,  10.1000.10.1 son aceptados aún cuando tienen números decimales mayores que 255.
215
+
216
+    Note que utilizando la regla \d{1,3} podemos restringir a números de 1 a 3 digitos.  Pero esto aún permitiría los IPs 256.10.11.1, 10.0.0.300.
217
+
218
+5.  Modifique la expresión regular para que solo acepte 4 números decimales de 1 a 3 dígitos separados por puntos.
219
+
220
+6. Corre el script `regex-tester.py` con el archivo `ip_4like.txt`.
221
+
222
+    ```python regex-tester.py ip_4like.txt```
223
+
224
+    Como resultado debe ver que 23 pruebas pasaron y 3 fallaron:
225
+
226
+    ```23 strings passed, 3 strings failed``` debido a que ahora tampoco acepta el IP 10.1000.10.1.
227
+
228
+7. Como último desafío, modifique la expresión regular para que solo acepte IP versión 4 validos.  Esto es de 4 **bytes** en representación decimal divididos por puntos.
229
+
230
+8. Corre el script `regex-tester.py` con el archivo `ip_4like.txt`.
231
+
232
+    ```python regex-tester.py ip_4like.txt```
233
+
234
+    Como resultado debe ver que 21 pruebas pasaron y 5 fallaron:
235
+
236
+    ```21 strings passed, 5 strings failed```
237
+
238
+**Note** que debe tener apuntado las expresiones regulares de los pasos 3, 5 y 
239
+
240
+### Entregas
241
+
242
+Entregue las expresiones regulares construidas en los ejercicios: 1.3, 1.7, 2.3, 2.5, 3.3, 3.5, 4.3, 4.5, 4.7 al instructor.
243
+
244
+### Referencias
245
+
246
+[1] Python Regular Expression Library, https://docs.python.org/2/library/re.html
247
+[2] Internet Message Format, Address Specification, http://tools.ietf.org/html/rfc5322#section-3.4
248
+
249
+----
250
+
251
+[English](#markdown-header-regular-expressions-input-validation) | [Español](#markdown-header-expresiones-regulares-validacion-de-entradas)
252
+
253
+# Regular Expressions - Input Validation
254
+
255
+##Objectives
256
+
257
+1. Practice the implementation of regular expressions to sanitize input data.
258
+
259
+## Pre-Module:
260
+
261
+Before working in this module the student must
262
+
263
+1. Have reviewed the construction of regular expressions.
264
+2. Have reviewed the implementation of regular expressions in python.
265
+
266
+## Input validation using regular expressions
267
+
268
+Input validation is esential in the development of secure applications because it is the first line of defense of every application.  The vast majority of vulnerabilities in applications is due to poor input validation of the applications.  Example of vulnerabilities explited by poor input validation are:
269
+
270
+1. Buffer overflows
271
+2. Cross Site Scripting
272
+3. SQL, XML or other languages injection
273
+4. Directory Traversal
274
+5. Access to private files
275
+
276
+The attackers use errors in input validation to gain access to priviledged information, to gain access to systems, or to cause denial of services.
277
+
278
+Using regular expressions the application can validate and only accept input data accepted by the specification of a regular expression.  For instance we can restrict the input to consist of digits only, or as we will do in this module, that the input follow strict specifications of usernames, emails, domains, and IP version 4 addresses.
279
+
280
+**Disclaimer** The regular expression for users, emails, and domains that will be constructed in this module include the specifications as defined in the RFC[2].
281
+
282
+## General Instructions
283
+
284
+In this module we will use the `re` (regular expression) library to through the definitions of regular expressions validate input strings stored in files.
285
+
286
+In general, for each exercise the students will define a regular expression to validate an input strings and a python application will validate the strings and display if the string is valir as specified by the given regular expression.
287
+
288
+The regular expression will be defined in the variable `REGEXP` which is found in the first lines of the script code in `regex-tester.py`.
289
+
290
+After defining the regular expression the student will run the script with the input file of the exercise.  For example:
291
+
292
+```
293
+python regex-tester.py emails.txt
294
+```
295
+executes the script `regex-tester.py` with the input file `emails.txt`
296
+
297
+**Note** that every regular expression that the student define, will be finally delivered to the instructor, thus take note of all the regular expressions used in the exercises.
298
+
299
+## Exercise 1: Regular expressions for usernames
300
+
301
+1.  In the file  `regex-tester.py` change the content of variable `REGEXP` by the following regular expression: [a-zA-Z0-9]+
302
+
303
+    As you must notice the regular expression recognizes any string composed of one or more (+) letters [a-zA-Z] or digits [0-9].
304
+
305
+2. Run the script `regex-tester.py` with file `usernames.txt`.
306
+    
307
+    ```python regex-tester.py usernames.txt```
308
+
309
+A a result you must see that all the tests passed:
310
+    ```26 strings passed, 0 strings failed``` 
311
+    and the user names like: 23bolitas y 123pescao passed the test.
312
+
313
+3. Modify the regular expression such that it only accepts usernames that begin with one letter and do not accept users like 23bolitas y 123pescao.
314
+
315
+4. Run the script `regex-tester.py` with file `usernames.txt`.
316
+
317
+    ```python regex-tester.py usernames.txt```
318
+
319
+    As a result you must notice that all the tests passed except 23bolitas y 123pescao:
320
+    
321
+    ```24 strings passed, 2 strings failed```
322
+
323
+5. Run the script `regex-tester.py` with file `usernames_swletter.txt`
324
+
325
+    ```python regex-tester.py usernames_swletter.txt```
326
+
327
+    As a result you must notice that all the tests passed:
328
+
329
+    ```26 strings passed, 0 strings failed```
330
+
331
+6. Run the script `regex-tester.py` with file `usernames_swletter_dotted.txt`
332
+
333
+    ```python regex-tester.py usernames_swletter_dotted.txt```
334
+
335
+    As a result you must see:
336
+
337
+    ```10 strings passed, 20 strings failed``` 
338
+
339
+    because 16 of the usernames in that file are composed of usernames with dots in between or because the names begin with digits or dots.
340
+
341
+7. Modify the regular expression such that it only accepts usernames with dots in between and whose names to the sides of the dots begin with one letter.  Examples: name.last, name1.last1, name1.last1.last2, ...
342
+
343
+8. Run the script `regex-tester.py`  with file `usernames_swletter_dotted.txt`
344
+
345
+    ```python regex-tester.py usernames_swletter_dotted.txt```
346
+
347
+    As a result you must notice that all the tests passed except 4:
348
+
349
+    ```26 strings passed, 4 strings failed``` 
350
+
351
+    because the last 4 lines have usernames that either have a dot at the begining or the end of the username, or that the names to the sides of the dots begin with digits.
352
+
353
+**Note** that you most have take note of the regular expression of steps 3 and 7.
354
+
355
+## Exercise 2: Regular expression for domain names.
356
+
357
+1. In file `regex-tester.py` change the content of variable `REGEXP` by the following regular expression: [a-zA-Z0-9]+\.(com|edu|net|org)
358
+
359
+    As you must notice this regular expression recognizes any string compose of one or more (+) letters [a-zA-Z] or digitos [0-9] followed by one dot and one of the following top level domains com, edu, net, org.
360
+
361
+2. Run the script `regex-tester.py` with file `domains.txt`.
362
+
363
+    ```python regex-tester.py domains.txt```
364
+
365
+    As a result you must see 10 tests passed and 10 failed:
366
+
367
+    ```10 strings passed, 10 strings failed```. 
368
+
369
+    This regular expression only accepts domain names that consist of one top level domain com, edu, net, org and a second domain level like gmail.com, facebook.com, and twitter.com, but not domains with more levels such as www.facebook.com and mail.gmail.com.
370
+
371
+3. Modify the regular expression to accept domains with more that two leves including the top level domain com, edu, net, org.
372
+
373
+4. Run the script `regex-tester.py` with file `domains.txt`.
374
+
375
+    ```python regex-tester.py domains.txt```
376
+
377
+    As a result you must notice that 16 tests passed and 4 failed:
378
+
379
+    ```16 strings passed, 4 strings failed```.  
380
+
381
+    This because there are top level domains mil (airforce.mil), gov (whitehouse.gov), and country code top level domains (www.isla.com.pr), and an invalid top level domain pur (www.isla.net.pur).
382
+
383
+5. Modify the regular expression to accept domains with more than two leves, but in addition includes the domains gov, mil, biz, and any country code top level domain.  The country code top level domains are composed of two letters at the end of the domain. For example us (United States), pr (Puerto Rico), ca (Canada), and ar (Argentina).  In other words the top level domains can be com, edu, net, org, gov, mil, biz, o any combination of two letters (only two letters).
384
+
385
+6. Run the script `regex-tester.py` with file `domains.txt`.
386
+    
387
+    ```python regex-tester.py domains.txt```
388
+
389
+    As a result you must notice that all the tests passed except the one with the invalid domain pur.
390
+
391
+    ```19 strings passed, 1 strings failed```. 
392
+
393
+**Note** that you most have take note of the regular expression of steps 3 y 5.
394
+
395
+## Exercise 3: Regular expressions for emails
396
+
397
+1. In file `regex-tester.py` change the content of the variable `REGEXP` by the following regular expression: [a-zA-Z0-9]+\@gmail.com
398
+
399
+    As you must notice this regular expression recognizes any string composed of usernames of one or more (+) letters [a-zA-Z] or digits [0-9] followed by a @ and the domain gmail.com.
400
+
401
+2. Run the script `regex-tester.py` with the file `gmail_emails.txt`.
402
+
403
+    ```python regex-tester.py gmail_emails.txt```
404
+
405
+    As a result you must notice that 5 tests passed and 14 failed:
406
+
407
+    ```5 strings passed, 14 strings failed```. 
408
+
409
+    This is because despite that all the emails are from gmail, the regular expression for the usernames does not permit usernames that contains dots in between.
410
+
411
+
412
+3. Modify the regular expression such that like in Exercise 1.7 the emails usernames can contain dots in between the names that begin with a letter.
413
+
414
+4. Run the script `regex-tester.py` with file `gmail_emails.txt`.
415
+
416
+    ```python regex-tester.py gmail_emails.txt```
417
+
418
+    As a result you must notice that all the tests passed:
419
+
420
+    ```19 strings passed, 0 strings failed```.
421
+
422
+5. Modify the regular expression such that like in Exercise 2.5 the emails can have domain with more than two leves and the top level domain can be com, edu, net, org, gov, mil, biz, or any combination of two letters (only two letters).
423
+
424
+6. Run the script `regex-tester.py` with file `emails.txt`
425
+
426
+    ```python regex-tester.py emails.txt```
427
+
428
+    As a result you must notice that all the tests passed:
429
+
430
+    ```19 strings passed, 0 strings failed```.
431
+
432
+**Note** that you most have take note of the regular expression of steps 3 y 5.
433
+
434
+### Exercise 4: Regular expression for IP version 4 addresses.
435
+
436
+An IP address version 4 consists of 4 bytes in decimal representation where the 4 bytes are separated by a dot.  For example `10.12.20.5`,  consists of the 4 decimal numbers 10, 12, 20, and 5 separated by a dot. The decimal numbers range from 0 to 255 since each of them represent a byte.  Therefore the following string is not an IP address `10.244.260.21` because it has the decimal number 260 which is greater than 255.
437
+
438
+1. In file `regex-tester.py` change the content of the variable `REGEXP` by the following regular expression: (\d+\.)+\d+
439
+
440
+    As you must notice this regular expression recognizes any string composed of one or more digits separated by dots.  
441
+
442
+2. Run the script `regex-tester.py` with file `ip_4like.txt`.
443
+
444
+    ```python regex-tester.py ip_4like.txt```
445
+
446
+    As a result you must notice that all the test passed:
447
+
448
+    ```26 strings passed, 0 strings failed``` 
449
+
450
+    and IPs such as 10.0.1 and 10.1.1.1.1 are accepted even when one of them is missing one decimal and the other has a spare decimal.
451
+
452
+3. Modify the regular expression such that it accepts IPs with four decimal numbers separated by one dot.
453
+
454
+4. Run the script `regex-tester.py` with file `ip_4like.txt`.
455
+
456
+    ```python regex-tester.py ip_4like.txt```
457
+
458
+    As a result you must notice that all the tests passed except two:
459
+
460
+    ```24 strings passed, 2 strings failed``` 
461
+
462
+    and the IPs 10.0.1 and 10.1.1.1.1are no longer accepted. But still IPs of four decimal numbers like 256.10.11.1, 10.0.0.300,  10.1000.10.1 are accepted even when they contain decimal numbers greater than 255.
463
+
464
+    Note that using the rule \d{1,3} we can restrict to numbers of 1 to 3 digits.  But this will still permit the IPs 256.10.11.1, 10.0.0.300.
465
+
466
+5. Modify the regular expressions to accept 4 decimal numbers of 1 to two digits separated by dots.
467
+
468
+6. Run the script `regex-tester.py` with file `ip_4like.txt`.
469
+
470
+    ```python regex-tester.py ip_4like.txt```
471
+
472
+    As a result you must notice that 23 tests passed and 3 failed:
473
+
474
+    ```23 strings passed, 3 strings failed``` 
475
+
476
+    because it now does not accept the IP 10.1000.10.1.
477
+
478
+7. As a last challenge, modify the regular expression such that it only accepts IP valid IP version 4 addresses.  This is addresses of 4 **bytes** in decimal representation separated by dots.
479
+
480
+8. Run the script `regex-tester.py` with file `ip_4like.txt`.
481
+
482
+    ```python regex-tester.py ip_4like.txt```
483
+
484
+    As a result you must notice that 21 tests passed and 5 failed:
485
+    
486
+    ```21 strings passed, 5 strings failed```
487
+
488
+**Note** that you most have take note of the regular expression of steps 3, 5 y 7.
489
+
490
+### Deliverables
491
+
492
+Submit the regular expressions constructed in exercises: 1.3, 1.7, 2.3, 2.5, 3.3, 3.5, 4.3, 4.5, 4.7 to the instructor.
493
+
494
+### References:
495
+
496
+[1] https://docs.python.org/2/library/re.html
497
+
498
+[2] Internet Message Format, Address Specification, http://tools.ietf.org/html/rfc5322#section-3.4

+ 20
- 0
domains.txt 查看文件

@@ -0,0 +1,20 @@
1
+gmail.com
2
+hotmail.com
3
+upr.edu
4
+mit.edu
5
+cmu.edu
6
+ufl.edu
7
+whitehouse.gov
8
+hpcf.upr.edu
9
+www.nba.com
10
+cs.ufl.edu
11
+bom.bom.com
12
+airforce.mil
13
+cs.unc.edu
14
+nyu.edu
15
+greetings123.com
16
+primerahora.com
17
+facebook.com
18
+gmail.google.com
19
+www.isla.com.pr
20
+www.isla.net.pur

+ 19
- 0
emails.txt 查看文件

@@ -0,0 +1,19 @@
1
+jose.ortiz@gmail.com
2
+ortiz.jose@upr.edu
3
+juan.marciano@cs.mit.edu
4
+john.smith@sonian.gov
5
+john.smith.sonian@white.house.gov
6
+grant.hill33@gmail.com.pr
7
+dikembemutombo@hawks.net
8
+thebigbird@sesame.street.com
9
+this.is.how.we.do.it@montel.com
10
+compiladores.computabilidad@cs.upr.edu
11
+ultspo@in.your.face.org
12
+combo.agrandado@gmail.com
13
+big.mac@healthy.com
14
+jordan23.michael@chicago.nba.com
15
+ronaldo@football.com
16
+neymar.brasil@barcelona.futbol.com
17
+arod@yankees.mlb.net
18
+derek.jeter@yankee.mlb.com
19
+big.papi@red.sox.boston.mlb.com

+ 19
- 0
gmail_emails.txt 查看文件

@@ -0,0 +1,19 @@
1
+jose.ortiz@gmail.com
2
+ortiz.jose@gmail.com
3
+juan.marciano@gmail.com
4
+john.smith@gmail.com
5
+john.smith.sonian@gmail.com
6
+grant.hill33@gmail.com
7
+dikembemutombo@gmail.com
8
+thebigbird@gmail.com
9
+this.is.how.we.do.it@gmail.com
10
+compiladores.computabilidad@gmail.com
11
+ultspo@gmail.com
12
+combo.agrandado@gmail.com
13
+big.mac@gmail.com
14
+jordan23.michael@gmail.com
15
+ronaldo@gmail.com
16
+neymar.brasil@gmail.com
17
+arod@gmail.com
18
+derek.jeter@gmail.com
19
+big.papi@gmail.com

+ 21
- 0
ip_4integers.txt 查看文件

@@ -0,0 +1,21 @@
1
+136.145.181.24
2
+10.1.0.1
3
+192.168.1.100
4
+192.255.20.22
5
+192.188.124.244
6
+10.111.112.143
7
+255.255.255.255
8
+0.0.0.0
9
+192.168.100.121
10
+192.244.1.242
11
+10.133.223.12
12
+10.1.1.1
13
+10.0.0.1
14
+192.168.100.29
15
+100.100.100.100
16
+8.8.8.8
17
+10.1.1.23
18
+192.168.100.100
19
+192.168.1.122
20
+10.0.2.1
21
+10.121.232.9

+ 26
- 0
ip_4like.txt 查看文件

@@ -0,0 +1,26 @@
1
+10.0.1
2
+136.145.181.24
3
+10.1.0.1
4
+192.168.1.100
5
+192.255.20.22
6
+192.188.124.244
7
+10.111.112.143
8
+255.255.255.255
9
+0.0.0.0
10
+10.1.1.1.1
11
+192.168.100.121
12
+192.244.1.242
13
+10.133.223.12
14
+10.1.1.1
15
+256.10.11.1
16
+10.0.0.1
17
+192.168.100.29
18
+100.100.100.100
19
+8.8.8.8
20
+10.1.1.23
21
+192.168.100.100
22
+192.168.1.122
23
+10.0.2.1
24
+10.121.232.9
25
+10.0.0.300
26
+10.1000.10.1

+ 52
- 0
regex-tester.py 查看文件

@@ -0,0 +1,52 @@
1
+from reg_exp import *
2
+import re
3
+import sys
4
+
5
+# EDIT THIS REGEXP
6
+REGEXP="REGEXP"
7
+
8
+
9
+# DO NOT CHANGE ANYTHING BELOW THIS LINE
10
+
11
+def validate(value, regexp):
12
+	"""
13
+	Function to validate a string stored in variable value given
14
+	a regular expression in regexp.
15
+	"""
16
+
17
+	val = re.compile(regexp)
18
+	result = val.match(value)
19
+
20
+	if result and value == result.group(0):
21
+		return True
22
+
23
+	return False 
24
+
25
+
26
+
27
+def main():
28
+	try:
29
+		fd = open(sys.argv[1])
30
+		lines = fd.readlines()
31
+	except:
32
+		print "Could not open strings file."
33
+		print "Usage: python %s <strings_file>" % sys.argv[0]
34
+		sys.exit(0)
35
+
36
+	passed = 0
37
+	failed = 0
38
+
39
+	for line in lines:
40
+		line = line.strip()
41
+
42
+		if validate(line, REGEXP):
43
+			print line, "PASS"
44
+			passed+=1
45
+		else:
46
+			print line, "FAIL"
47
+			failed+=1
48
+
49
+
50
+	print "%s strings passed, %s strings failed" % (passed, failed)
51
+
52
+main()

+ 26
- 0
usernames.txt 查看文件

@@ -0,0 +1,26 @@
1
+jose
2
+carro
3
+cat
4
+cow
5
+volkswagen
6
+lucia
7
+carmen
8
+maria
9
+john
10
+joel
11
+bil
12
+bill
13
+sacramento
14
+bahia
15
+stjohn
16
+baseball
17
+basketball
18
+nfl
19
+nsf
20
+security
21
+bolita23
22
+23bolitas
23
+per12coco
24
+ca1ca2ca3
25
+perico23
26
+123pescao

+ 26
- 0
usernames_swletter.txt 查看文件

@@ -0,0 +1,26 @@
1
+jose
2
+carro
3
+cat
4
+cow
5
+volkswagen
6
+lucia
7
+carmen
8
+maria
9
+john
10
+joel
11
+bil
12
+bill
13
+sacramento
14
+bahia
15
+stjohn
16
+baseball
17
+basketball
18
+nfl
19
+nsf
20
+security
21
+bolita23
22
+bolitas
23
+per12coco
24
+ca1ca2ca3
25
+perico23
26
+pescao

+ 30
- 0
usernames_swletter_dotted.txt 查看文件

@@ -0,0 +1,30 @@
1
+jose.orta
2
+carro.gasolina
3
+cat.dog
4
+cow.bull
5
+volkswagen
6
+lucia.andrea
7
+carmen
8
+maria.cintron
9
+john.doe
10
+joel.billy
11
+bil.clinton
12
+bill
13
+sacramento
14
+bahia.urbana
15
+stjohn.bay
16
+baseball.academy23
17
+basketball
18
+nfl
19
+nsf
20
+security.holes
21
+bolita23.morebolitas
22
+bolitas
23
+per12coco
24
+ca1ca2ca3.caca4caca5
25
+perico23.perico23.peri23co
26
+pescao
27
+123pescao.hello
28
+hello.1cat
29
+.hello.cat
30
+cat.hello.