elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  string.StartsWith
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: string.StartsWith  (Leído 2,999 veces)
TickTack


Desconectado Desconectado

Mensajes: 428


CipherX


Ver Perfil
string.StartsWith
« en: 14 Mayo 2017, 13:08 pm »

Hola,

hay algo que no entiendo.

Estaba haciendo un programa que filtra ips y vi un comportamiento algo raro en StartsWith.

Yo hice este metodo:

Código
  1. public static bool Check(IPAddress ipaddr)
  2.        {
  3.            foreach (String ip in bad_ranges)
  4.                if (ipaddr.ToString().StartsWith(ip))
  5.                {
  6.                    return true;
  7.                }
  8.  
  9.            bool result = false;
  10.            return result;
  11.        }

Y aqui la lista de ips y de comienzos de ips que debe ser filtrada:

Código
  1. private static String[] bad_ranges = new String[]
  2.        {
  3.            "46.16",
  4.            "64.55.",
  5.            "69.22.",
  6.            "69.162.",
  7.            "69.167.",
  8.  
  9.            "128.241.",
  10.            "140.174.",
  11.            "204.2.",
  12.            "206.14.",
  13.            "209.107.",
  14.            "199.255.",
  15.            "31.210.102.38",
  16.            "46.4.62.16",
  17.            "67.221.255.12",
  18.            "74.82.218.250",
  19.            "77.245.78.10",
  20.            "79.168.9.111",
  21.            "83.142.226.101",
  22.            "85.195.76.6",
  23.            "89.217.238.",
  24.            "95.141.",
  25.            "95.142.",
  26.            "95.143.",
  27.            "95.215.",
  28.            "109.74.3.24",
  29.            "124.248.202.119",
  30.            "174.36.47.170",
  31.            "176.227.194.146",
  32.            "188.227.180.2",
  33.            "209.239.120.120",
  34.            "216.185.105.34",
  35.            "108.61.74.99",
  36.            "79.141.165.21",
  37.            "24.99.89.166",
  38.            "199.58.84.",
  39.            "50.116.5.",
  40.            "23.92.22.",
  41.            "64.62.201.",
  42.            "162.210.196.",
  43.            "192.96.203.",
  44.            "199.58.84."
  45.        };
  46.  

Y bueno. Al ingresar esta ip: 46.105.121.37 me la filtra el programa.

Pero porque?

Si en la lista no agregue esa ip ni una ip que empieze con 46.105.

StartsWith tiene otra significacion a parte de empezar por los caracteres dados?

Gracias y saludos


« Última modificación: 14 Mayo 2017, 18:20 pm por Eleкtro » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: string.StartsWith
« Respuesta #1 en: 14 Mayo 2017, 18:31 pm »

StartsWith tiene otra significacion a parte de empezar por los caracteres dados?

No, no lo tiene. La función String.StartsWith() determina si un String comienza con las caracteres de otro String.

Al ingresar esta ip: 46.105.121.37 me la filtra el programa.
Pero porque?
Si en la lista no agregue esa ip ni una ip que empieze con 46.105.

La función Check() que has escrito, al enviarle como argumento la IP 46.105.121.37, da un resultado negativo. Es decir, no la filtra, a diferencia de lo que tú dices estar experimentando al pasarle esa IP.

Deberías mostrarnos la manera en la que instancias la clase IPAddress. Intuyo que debes estar cometiendo el fallo ahí, pues podrías estar usando de forma incorrecta alguno de sus constructores, y como consecuencia daría un resultado imprevisto de validación en la función Check() -> String.StartsWith().

Para lo que quieres hacer, te conviene utilizar la función IPAddress.Parse():
Código
  1. IPAddress ip = IPAddress.Parse("46.105.121.37");
...y entonces el código que has mostrado te debería funcionar correctamente.



Aparte de eso, suponiendo que puedas utilizar LINQ entonces puedes simplificar el bloque de código de la función Check(), a esto otro:
Código
  1. public static bool ValidateIP(IPAddress address, string[] addressRangeBlackList) {
  2.    return (from addressRange in addressRangeBlackList
  3.            where address.ToString().StartsWith(addressRange, StringComparison.Ordinal)
  4.            select true
  5.           ).Any();
  6. }
...Aunque cabe mencionar que esto supondría un inapreciable impacto negativo en el rendimiento, contado en escasos milisegundos de tiempo de ejecución. Siempre que el Array de rangos de ip no contenga miles de elementos ni tampoco se intente validar miles de ips en un determinado intervalo de tiempo demasiado corto, y suponiendo que preferamos la simplificación de código, entonces sería preferible optar por la elegancia de LINQ-to-Objects, que por la velocidad de ejecución.

¡Saludos!


« Última modificación: 14 Mayo 2017, 21:22 pm por Eleкtro » En línea

TickTack


Desconectado Desconectado

Mensajes: 428


CipherX


Ver Perfil
Re: string.StartsWith
« Respuesta #2 en: 15 Mayo 2017, 07:15 am »

Hola Elektro,

Citar
La función Check() que has escrito, al enviarle como argumento la IP 46.105.121.37, da un resultado negativo. Es decir, no la filtra, a diferencia de lo que tú dices estar experimentando al pasarle esa IP.

Pero podes creer que sea tan estupido?
Increible. Por esos errores hago un tema. La verdad que esta vez nome mereci tu ayuda por estupido.

Era asi como tu dijiste. Solucione el problema.

Muchas gracias
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines