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

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


  Mostrar Mensajes
Páginas: 1 ... 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 [375] 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 ... 432
3741  Foros Generales / Foro Libre / Re: Piloto de vuelos profesional afirma que la Tierra es plana + experimento Física en: 27 Julio 2017, 08:55 am
Vaya por delante, que yo, creo en OVNIs, creo que existe vida inteligente fuera d ela Tierra (en la Tierra a veces dudo  :laugh: :laugh: :laugh:), creo que existen infinidad de razas alienígenas en mayor variedad y jerarquía que los animales que pueblan nuestro planeta, también creo en Dios... pero me resulta imposible dar por bueno que la Tierra es plana.

Supongamos que la Tierra es plana. Cuál sería la forma del planeta?. Cuadrado, rectangular, hexagonal, irregular (como una isla, por ejemplo) o circular????.

Bien, miremos a la Luna, al Sol, a otros planetas en definitiva... si fueran planos, todos parecen tener una forma circular... y por qué iban a ser todos circulares????.
Más aún, sabemos que se desplazan, luego si fueran planos e incluso circulares por alguna ley desconocida, lo cierto es que al moverse, en algún momento los veríamos de diferente forma a la circular... basta tomar una moneda, y moverla alrededor de diferentes maneras, para ver que siendo plana, ofrece diferentes vistas y por tanto con diferentes formas. Pero si en vez de tomar una moneda tomamos una bola, da igual como la gieremos, siempre tendrá apariencia circular.... justo (que casualidad), como vemos la Luna, el sol y el resto de planetas (si no teneis telescopio, lo siento)... y si todos los que nos rodean tienen un volumen esférico, porqué nuestro planeta va a ser plano????.

No necesito nada muy científico ni medidas con precisiones exageradas, me basta una simple explicación razonada (como esta que doy), pero que apunte a que la Tierra es plana, y tal explicación no tenga flecos, por insuficiencia de lógica y razonamiento. Me basta con eso, explicaciones razonadas que no puedan ser apaleadas, por que la lógica es aplastante.

Una superficie esférica enormememnte grande siempre parecerá plana, porque tal como se reconoce en matemáticas, una curva puede considerarse como una recta dando por centro de esa curva en el infinito. y es que en efecto, la curvatura será tan leve con un radio tan grande, que desde luego resultaría imperceptible de una recta... al menos para los sentidos humanos....

No obstante cuando uno va al mar... y mira al horizonte, el mar se corta, y el barco que se aleja, parece 'caer' hacia abajo... si fuera plana... esto no podría verse así, el barco, se vería cada vez más pequeño, deacuerdo, pero se vería siempre entero (o casi, parte del casco siempre estará sumergido). Y si eres tú quien va en el barco, y llegas a alta mar, y haces partir a otros 4 barcos en sendas direcciones (cualesquiera pero separadas 90º, con todos sucederá lo mismo que cuando se observa desde la playa o el puerto, esto no podría ser así si fuera plana, pero sí, si es esférica...
3742  Informática / Hardware / Re: Duda temperaturas del procesador! en: 27 Julio 2017, 04:35 am
hola,una duda acerca del procesador,e tenido problemas con las temperaturas ...
 en las opciones de energia a un 80º y con esto se soluciono el problema,ahora en Crysis 3 no pasa de 60º,la pregunta es:el hacer esto afecta el rendimiento del procesador?
Port supuesto. Si no hubiera una caída en el rendimiento, los procesadores se pondrían  a un valor más bajo para que no se quemaran...

Esto depende por completo del "Efecto Joule"... que supongo habrás estudiado cuando diste física, ¿no?.
3743  Programación / Programación C/C++ / Re: Ayuda programa de BINGO en C en: 26 Julio 2017, 19:36 pm
Voy a hacerte una somera descripción intentando usar los datos de tu estrucutra cuanto se aposible y útil

De entrada mantenemos la estructura del jugador muy similar. No declaro el tipo de cada datos, hazlo según tu conveniencia.
Código:
Estructura DatosJugador
        Nombre
Apellido
Cedula  //Cada cédula es unica. OK: pero un jugador puede comprar más de un cartón, verdad?... entonces esto no importa.
Monto  //Esto es para pagar el cartón??????
IndexCarton // Cada cartón es único
BolasTachadas //Restan //  Le cambio el nombre, su propósito es confuso con ese nombre.
//Record //  ¿es realmente necesario?. Si sí, añade el soporte para esto cuando lo demás, lo elemental para el juego funcione.
Fin Estructura

Array tipo DatosJugador Jugadores()   //este array contiene a todos los jugadores.

Los cartones, mejor que considerar chorrocientos cartones, es considerar un array muy grande, el cartón nº 1 toma los índices del 0 al 19, el nº 2 del 20 al 39, el cartón nº 3, del 40 al 59...  etc...
Código:
Array tipo Entero Cartones()  //este array contiene los cartones de todos los jugadores.
Array tipo Entero BolasPremio()  // este array contiene las bolas que van saliendo. consideramos las bolas desde 0 a 99.

// Estos valores cámbialos a tu gusto, los que pongo son de ejemplo.
Constante c_MaximoJugadores = 25  //si se alcanza los 25 jugadores, se rechaza añadir más jugadores a la partida.
constante c_MinJugadores = 2   // si hay menos jugadores, no hay ppartida posible.
Constante c_ValoresXCarton = 20    ' 4 filas por 5 columnas, Acertar una fila es =
Entero NumJugadoresPartida //se pone al terminar una partida, y se va actualizando a medida que ingresan los jugadores.

Constante c_PrecioCarton = 25 // bingocoins. Lo que paga un jugador por cada cartón que compra.
Constante c_PremioXLinea = 200 //bingocoins. Lo que recibe un jugador si 'canta línea' .
Constante c_PremioXBingo = 1500 //bingocoins. lo que recibe un jugador si 'canta bingo'.

Evento IngresarJugador(Nombre, Apellido, Cedula, Monto, Mas)

Código:
Funcion CrearInstancia  // Equivale al New
    // Este array lo podemos redimensionar una vez al valor máximo alcanzable (sigue siendo un valor muy manejable). Evita redimensionarlo en cada partida con el número de jugadores en curso.
    Redimensionar Cartones(0 a (c_Maxjugadores * c_ValoresXCarton) -1 )
    Redimensionar BolasPremio(0 a 99) // el array del premio también basta con redimensionarlo una vez cuandos e crea la instancia.
fin Funcion
Ambos arrays podrían ser uno solo, si al array Cartones se le añaden 100 posiciones más al final. Pero resultará más cómodo operar de forma separada.

Código:
// NumJugadores, debiera ser por ejemplo el número de jugadores inscritos en una lista... (interesador en jugar una partida).
//Un jugador puede estar anotado más de una vez, (esto es quiere participar con más de 1 cartón si es en la misma partida).
//El orden de acceso es riguroso... en el orden de anotados en la lista.
Buleano = Funcion NuevaPartida(NumJugadores)
    Si (NumJugadores < c_Minjugadores) luego
        Devolver FALSE
    Fin si
    Si (NumJugadores > c_Maxjugadores) luego
        NumJugadores  = c_Maxjugadores //se trunca al máximo, o se devuelve FALSE
    Fin si
  
    Redimensionar array Jugadores(0 a NumJugadores-1)
  
    Buleano Ingresado=FALSE, Mas=FALSE
    Bucle para k desde 0 a NumJugadores -1
        Hacer  // Añade un jugador en cada ciclo. Damos por hecho que es así, pero si
            Ingresado = IngresarJ(k, Mas)
        Repetir Mientras (Ingresado = FALSE) y (Mas = TRUE)        
    Fin bucle    

    NumJugadoresPartida = (k -1)
    // Volvemos a comprobar que hay jugadores suficientes. Antes eran los interesados, ahora los que pudieron pagar su cartón.
    Si (NumJugadoresPartida < c_Minjugadores) luego
        Devolver FALSE
    Fin si    

    llamada a  Barajar  //barajamos los valores de los cartones y los premios que hayan de salir.
    Devolver TRUE
Fin Funcion

Esta función dispara un evento para solicitar al cliente los datos d elos jugadores inscritos en una lista con intención de jugar...
Chequea si pueden pagar el cartón, si no es así, saltará al siguiente...
No precisa chequear si la cédula existe ya, porque eso evita que un jugador pueda comprar más de un cartón.
Descuenta el preio del cartón al jugador si entra en la partida.
Código:
Buleano = Funcion IngresarJ(Entero K, Buleano Mas)
    // En cada disparo de evento, debiera añadirse un jugador, procedente quizás de una lista de interesados a la espera de una 'mesa y silla' (un hueco en la partida).
    DispararEvento IngresarJugador(Nombre, Apellidos, Cedula, Monto, Mas)
    //Mas, debe devolver si hay más jugadores en la lista apuntados aparte de éste que se ingresa.
    //    esto es devolver TRUE, si no es el último en la lista, Y FALSE cuando sea el último.
    Si (Monto >= c_PrecioCarton) luego  // Si no puede pagar el cartón, no puede jugar???. El jugador no entra en esta partida.        
       //No verificamos que cédula no existe ya, porque esto imposibilita que un jugador pueda comprar más de un cartón
       Jugadores(k).Nombre = Nombre
       Jugadores(k).Apellidos = Apellidos
       Jugadores(k).Cedula = Cedula
       Jugadores(k).IndexCarton = (k * c_ValoresXCarton)   //los valores de su cartón van desde dicho valor hasta 19 más arriba, tenemos 20 valores por cartón.
       Jugadores(k).BolasTachadas = 0
       Monto -= c_PrecioCarton //cobramos el cartón. Monto debe ser pasado por referencia, si no,
          //el monto en origen no habrá cambiado. Solo se cobra si el jugador finalmente entra en la partida.
       Jugadores(k).Monto = Monto // ya hemos descontado el precio del cartón, previamente.
       Devolver TRUE
   Si no
       Devolver FALSE
   Fin si
Fin funcion


Baraja los cartones y luego los premios. En ambos casos se acaba llamando finalmente a una misma función...
Código:
Funcion Barajar
     // Barajar cartones...
    llamada a BarajarCartones2
    // Barajar Premios
    BolasPremio = Barajar100
fin funcion

Esta función es simple, pero tiene un grave problema...
  ...y es que no garantiza que un valor no aparezca más de 1 vez en un mismo cartón.
  Se provee una mejor solución en la siguiente función.
Código:
función la solución óptima.
Funcion BarajarCartones1
     Bucle para k desde 0 hasta Cartones.LimiteMayor-1
         Cartones(k) = Aleatorio(entre 0 y 99)
     Fin bucle
Fin funcion

Esta función baraja los valores de los cartones...
Y garantiza que un valor no aparezca repetido en un mismo cartón.
No existen cartones separados, es un solo array donde un cartón va a continuación del previo...
Código:
Funcion BarajarCartones2
    Array Bolas(0 a 99)
    
    j = 0
    Bucle para k desde 0 hasta NumJugadoresPartida -1
        Bolas = Barajar100
        n = 0
        Bucle para i desde j hasta (j + c_ValoresXCarton - 1) // tomamos las primeras 20 bolas (que ya fueron barajadas. También podría elegirse al azar entre bolas, pero estando ya barajadas es superfluo.
            Cartones(j) = Bolas(n)
            n +=1    //n irá desde 0 a 19...
        Fin Bucle
        j = i   // es equivalente a: j += c_ValoresXCarton, ó también: j += n
    Fin bucle
Fin funcion

Crea un array de 100 elementos donde todos aparecen 1 vez (para garantizar la misma probabilidad a cada jugador-cartón). Luego lo que se baraja es el orden que ocupará cada valor en el array...
Código:
Array = Funcion Barajar100
    Array Bolas(0 a 99)

    //Bucle necesario, porque todos los valores han de tener la misma posibilidad de salir,
    //    luego todos los valores han de constar el mismo número de veces (al caso 1)
    Bucle para k desde 0 hasta 99
        Bolas(k) = k
    Fin bucle

    //Ahora se barajan cambiando el orden que ocupan. ...Pero todos siguen constando 1 sola vez,
    //     luego si se toman x bolas (sean las que sean), todas serán distintas (ninguna aparece repetida).
    Bucle para k desde 99 hasta 1 retrocediendo de 1 en 1
        tmp = Aleatorio(entre k y 1)
        Bolas(tmp) = Bolas(k)
        Bolas(k) = Bolas(tmp)
    Fin bucle

    Devolver Bolas  //entrega el array barajado.
Fin Funcion

Puesto que hay 100 bolas en el bingo (valores 0 a 99), y los cartones tienen solo 20 valores, está garantizado que el bingo a lo sumo se resuelve en tantos bolas sacadas como la salida de la última bola.
Va quedando pués la función que va extrayendo las bolas (recuerda que las bolas que van a salir las hemos barajado ya de antemano, saldrán en un orden aleatorio y todas constan en el bingo y aparecen 1 sola vez.
Esta función llamará a otras de comprobación...
Código:
Funcion IniciarPartida  //Esta función debe invocarse solo tras la función NuevaPartida y solo si aquella devuelve TRUE
    Entero Bolas = 0          //cantidad de valores que se han sacado ya del bingo.
    Entero Bola                  //valor actual que se acaba de sacar del bingo.
    Buleano Bingo = False  //alguien cantó bingo?
    Buleano Linea = False  //alguien cantó Linea?   
    Entero Lineas              //para verificar las diferentes líneas en busca de 'línea'
    Entero Index              //Indice donde localizar en el cartón

    Hacer
        //Sacar la siguiente bola del bingo.
        Bola = BolasPremio(Bolas)  // ya están barajadas.

        Bucle para j desde 0 a NumJugadoresPartida -1
            //Indice apunta al cartón del jugador (índice en el array donde comienza) para el jugador que se va a verificar su cartón.
            Indice = (j * c_ValoresXCarton) 

            Si (Linea = FALSE) luego  //No puede cantarse 'Bingo' sin antes cantarse 'Linea'
                Lineas = 0
                Hacer  // Este bucle verifica las 4 líneas (de un cartón), para al encontrar una, la primera... se 'cante' línea...
                    Linea = VarificarLinea(Indice , Bola, j)
                    Si (Linea = TRUE) luego  //pagar al jugador que obtuvo la línea.
                        Jugadores(j).Monto += c_PremioXLinea
                    Fin si
                    Lineas += 1
                    Indice += 5
                Repetir Mientras (Lineas < 3) y (Linea = FALSE)
            Si no
                Bingo = VerificarBingo(Indice, Bola,j)                
                Si (Bingo = TRUE) luego  // pagar al jugador que obtuvo el bingo, y será fin de la partida...
                    Jugadores(j).Monto += c_PremioXBingo
                Fin si
            Fin si
        Siguiente en bucle
        Bolas += 1
   Repetir Mientras (Bolas < 100) y (Bingo = FALSE)
Fin funcion
Para ser honestos, hay que dar la posibilidad de que haya más de un jugador que cante, "Linea" y "Bingo" en la misma tirada de la bola (y repartir el premio entre todos ellos, no otorgarlo al primero que lo cante (que al caso es el primero que aparece en el array).
... Queda a tu esfuerzo hacer las modificaciones pertienentes para cubrir esa posibilidad....

Hay 4 líneas y cada línea ocupa 5 valores. El '5' podría ser tambén una constante c_LargoLinea=5 y '4' como c_NumLineas=4
Un valor coincidente se puede tachar poniendo su valor a -1. Así se puede contar cuantas bolas s ehan tachado en una línea.
Ojo: Esta función verifica 1 sola línea del cartón, por eso en su llamada se llama varias veces (desde la función que la invoca) hasta cubrir todas las líneas del cartón.
   Por tanto podría optimizarse, Cuando se 'tache' una bola, ya no es preciso comprobar el resto de líneas del cartón (aunque sí, la línea entera).
Código:
Buleano  = Funcion VerificarLinea(Entero Index, Entero Bola, Entero Jugador)
    Entero n

    Bucle para k desde Index a (Index + 4)   // por ejemplo 0,1,2,3,4 ó: 5,6,7,8,9
        Si (Cartones(k) = -1) luego
            n += 1  //contamos las tachadas en esta línea
        Si no
            Si (Cartones(k) = Bola) luego
                Cartones(k ) = -1 // Tachada para la próxima vez
                Jugadores(Jugador).BolasTachadas  +=1
                n += 1
            Fin si
        Fin si
    Fin bucle

    // Si están tachadas todas en la línea devuelve TRUE, obtuvo Linea.
    Devolver (n = 5)
Fin funcion

Es parecida a la previa, pero la cuenta de 'BolasTachadas' determina si se logró el bingo.
Código:
Buleano  = Funcion VerificarBingo(Entero Index, Entero Bola, Entero Jugador)
    Bucle para k desde Index a Index + c_ValoresXCarton-1          
           Si (Cartones(k) = Bola) luego
               Cartones(k ) = -1 // Tachada para la próxima vez
               Jugadores(Jugador).BolasTachadas  +=1
           Fin si
    Fin bucle

    //Si las tachadas = todas las que tiene el cartón devulve TRUE, obtuvo Bingo.
    Devolver (Jugadores(Jugador).BolasTachadas  = c_ValoresXCarton)
Fin funcion

El pseudocódigo lo he escrito sobre la marcha de un plumazo, así que es normal que haya alguna inconsistencia y que haya de ser repasado... pero es más que suficiente para ofrecerte un vistazo claro de la dinámica del juego y por donde van los tiros...

Queda básicamente, la parte de la lista de los interesados en jugar, que debería ser algún tipo de lista... donde los jugadores se inscriben y pueden hacerlo más de una vez. Su inscripción solo debe requerir sus datos: nombre, apellidos, cédula... el monto, jamás debe ser pasado por valor, si no por refernecia, so pena de que una múltiple inscripción, no descontaría del monto real, si no de la copia recibida a cada ocasión... eso, la parte de la interfaz o de consola (si tiras por consla) y entenderlo para pasarlo a C ó al lenguaje que quieras, queda a tu esfuerzo)...

Se me hace raro que uses letras... pero bueno, es cuestión de adaptarlo si esto es imprescindibles. En todo caso con letras los valores irían del 0 al 25 (letras A-Z), luego no parece que tenga mucho sentido tener ¿¿¿¿cartones de 25 letras????... en ese caso usa cartones de 8-12 letras.


-----------------------------------
p.d.: Repasado un poco y mejorada la indentación y añadido algunos comentarios más...
Con cualquier duda pregunta...
3744  Foros Generales / Foro Libre / Re: que decir en una entrevista si no tienes experiencia en ese lenguaje de program? en: 25 Julio 2017, 22:30 pm
Ve. No pierdes nada (o poco) por ir... el 'no', ya lo tienes ahora mismo y si no vas... haz la entrevista y sé sincera.
Dí lo que sabes... has trqabajado con NET, pero no puedes demostrarlo con contratos. Y que además sabes A,B,C...

...A menudo, te contratan para hacer X y al final acabas haciendo Y, porque le das 100 vueltas al que tienen actualmente y eso es más urgente y necesario que X.
3745  Foros Generales / Foro Libre / Re: que decir en una entrevista si no tienes experiencia en ese lenguaje de program? en: 25 Julio 2017, 17:37 pm
La cuestión, no es tanto que decir, si no ¿qué sabes?. Pués eso es lo que has de decir...

Si te llaman como astronauta y tu experiencia es 0, que vas a decir?. Pués eso que tu experiencia es 0, pero que has visto muchas pelis... o dado el caso, que has interpretado el papel de astronauta en alguna peli-obra de teatro, etc...

Mentir por mentir, no sirve de nada, antes de una semana se darán cuenta de si sabes o no lo que hayas dicho saber. Si se exige experiencia si o sí, es otra historia, pero si todas las empresas exigen gente con experiencia y nadie ofrece la oportunidad de tener experiencia, llegado un momento, no existirán programadores con experiencia en nada... El problema es un poco que nadie quiere ser quien da la oportunidad porque se supone que se rinde menos, todos quieren ser quien ya se aprovecha de la experiencia adquirida por la oportunidad que te brindaron otros. Todos quieren el beneificio, ninguno el escaso sacrificio que supone (ofrecer experiencia)...

Si fuera inteligente, la gente debería rechazar trabajar (por sistema), en empresas que exigen experiencia... así cuando no encontraran absolutamente a nadie dispuesto a cubrir sus puestos, tendrían que ceder (todas)...  so pena de no cubrir puestos y por ende, imposible de susbsistir.
3746  Programación / Scripting / Re: keylogger en batch? en: 25 Julio 2017, 17:18 pm
Hola a todos queria saber si se puede hacer un keylogger en batch y que registre todo en un txt.  :huh:

en internet encontre este batch pero es mas que todo puro vbs.
VBScript, es un lenguaje de Script basado en VB. De hecho puedes crear tus propias librerías y una vez compiladas y registradas debidamente podrías usarlas igual que el objeto "File System Object (fso)".

Ahora bien, los vbs están pensados para tareas administrativas o incluso de control en tu propio equipo (mantenimiento básicamente).
La recomendación es que si en tu equipo, no lo usas lo deshabilites, lo cual se hace editando directamente la variable de entorno: PATHEXT (Extensiones ejecutables para que nos entendamos)... por defecto (bajo windows) este es su valor:
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
Pero si uno lo edita y lo deja en:
PATHEXT=.COM;.EXE;.BAT;.CMD
Entonces se está deshabilitando la ejecución de ficheros de scripts (excepto los bat), luego tu keylogger, no servirá de nada si requiere la ejecución de un fichero .vbs.

Hubiera sido deseable que fuera posible ejecutar ficheros de scripts, sólo si yacen en cierta ruta específica y que se requiriera permisos para mover ficheros allí, entonces podría estar semihabilitado, es decir todo, nada o solo para los que yacen en esa carpeta y entonces para tareas de administración podrían tener mucha utilidad. Al no haber punto intermedio, lo mejor es deshabilitarlo para evitar toda posible ejecución de malware.

Puedes consultar rápidamente el valor de PATHEXT, desde la consola msdos, mediante el comando: echo %pathext%
(todas las variables de entorno, se pueden consultar desde ahí, del mismo modo (obviamente remplazando el nombre de la variable, por la que proceda).

Si quieres editar dicho valor, o bien acudes al registro:
HKLM\System\CurrentControlSet\Control\Session Manager\Environment\ PATHEXT ...
O bien desde el:
panel de control/sistema/avanzado/botón variables de entorno/ localizarla en la lista de: 'Variables del sistema"

Esta variable también se usa para establecer la prioridad de ejecución. Cuando por ejemplo ejecutas un fichero basado solo en su nombre, peor hay más de un ejecutable con dicho nombre pero distinta extnsión (ejecutable), el que se ejecute será el primero en la lista de esta variable.
Así si tienes 4 ejecutables (en la misma ruta) llamados copy.bat, Copy.exe, copy.vbs y copy.com el que se ejecute será copy.com, porque cuando se busca en dicha lista, es el primero que aparece, si pretendieras que al escribir en una consola, un comando como: copy c:\*.* d:\*.* se ejecutara con copy.vbs (por ejemplo, porque es un ejecutable tuyo clónico que tiene opciones que no contempla el otro), cambia el orden que ocupan en la lista. Es harto difícil que haya en la misma carpeta, más de un ejecutable con el mismo nombre, pero esto resuelve el caso de qué ejecutable se está invocando, la otra forma es especificar el nombre completo del ejecutable.
3747  Foros Generales / Noticias / Re: Las nuevas generaciones digitales empiezan a pasar de los portátiles en: 24 Julio 2017, 20:17 pm
No creo que hagan falta estadísticas para saber que la razón no es otra que el tamaño y peso del teléfono móvil.

El factor 'aplicación' es algo secundario...
Desde luego la potencia de cualquier PC, frente a las limitaciones de un móvil (y con potencia no me refiero a la capacidad de procesamiento), lo dotan de más apto, pero el tamaño y el peso, permiten poder llevar algo contigo todo el día y consultarlo en cualquier instante.

Una gran desventaja del PC (y es algo que vengo reseñando desde los 80), es la pérdida de tiempo obligada en los arranques y apagones del PC... que por narices sí o sí, con cada versión desde windows 1.0, haya sido necesario y forzado que arranque nunca en menos de 1 minuto y casi lo mismo para apagarlo, le quita muchos méritos, hoy es cuando se hace patente, con el móvil que pulsas un botón garabateas en la pantalla 1-2 segundos y ya está disponible...
Yo no veo mal que se realice un chequeo del hardware, profundo, por ejemplo 1 vez al mes, pero cada vez que prendes el PC, así haya 5 minutos que lo hayas apagado, supone una pérdida de tiempo absurda. Y como mínimo algo opcional igual que puedes parar en el BIOS, podrías reclamarle un cuequeo completo al prenderlo desde un botón alternativo, y si no, que no chequee nada, damos por bueno que está perfecto, como los 3522 días anteriores... y los 8240 arranques previos. Que desdeluego ese chequeo será absolutamente necesario para una central nuclear y para un mando a distancia para disparar misiles, pero no para un PC en casa...

En fin, los jóvenes se perderán la VERSATILIDAD que ofrece un PC (portátil o menos), respecto de la escasa flexibilidad que ofrece un móvil Android.

De todos modos me atrevería a apostar que si Mocosoft, apostara por un símil al win-XP, como una versión para móvil, se comería gran parte del pastel de Google con su Android... (y es que hoy día casi cualquier móvil es más potente que los equipos PC, que venían instalados de fábrica con un win-XP)....y  más aún si fuera completamente compatible y conectable con los equipos de sobremesa.
3748  Foros Generales / Noticias / Re: ¡Adiós 32 bit! Firefox te actualizará automáticamente a la versión de 64 bit en: 24 Julio 2017, 20:03 pm
Viva la obsolescencia progresiva... (si progresiva, no digo programada).
Declaran su ignorancia superlativa mediante la obsolescencia.

Volvamos a los tornillos haxagonales, ejemplo peremne de cosa simple y bien hecha que funciona a perpetuidad. hummm.. si los hubieran creado los "lumbreras" que hay hoy día, a buen seguro ya estábamos por la versión 389 del tornillo... (y cuantas cosas hubieran acabado en la basura cada pocos años, porque ni habría tuercas n itornillos de repuesto).
3749  Programación / .NET (C#, VB.NET, ASP) / Re: C# - Hackear una contrasena de un servidor en: 24 Julio 2017, 19:40 pm
Los he descargado, pero no se ejecutan aquí tengo win-XP (32 bits).

---------------------
Respecto del login... fíjate que recurres a usar una contraseña que yace en un fichero de texto. Así, que en teoría eso lo hace altamente vulnerable. Además, ya te he comentado, que usar una sola y misma contraseña para todos es una malña solución.

--------------------
Si tu chat solo va a admitir un administrador, haz que sea el primero que se loguee, es decir él y solo él prende el servidor, y nadie más pueda loguearse como administrador. Si el administrador no se loguea, no existe el chat, porque no se crea.

Pero para poder loguear como administrador... en  realidad para poder manejar diferentes usuarios con permisos diferentes, hay que separar los roles de usuario. Cuando te puse tiempo atrás un pseudocódigo sobre un chat, realmente allí te puse cosas muy útiles, bien que luego no hayas sabido aplicarlas. Los roles se pueden resumir en sus permisos-privilegios, y se puede reducir a su mínima expresión en una propiedad de tipo string (de solo lectura como cliente, lectura y escritura para los administradores).

Entonces para un usuario, lo mínimo como Rol, es una propiedad de solo lectura con ese nombre Rol y cuyo contenido sea una cadena de texto. Unos simples caracteres, así un ejemplo de los roles de un usuario podría ser algo tan sencillo como esto: cliente.Rol = "LSER", cuyo significado simple podría ser:puede Loguearse (ideal para retirarlo cuando se banea a un usuario), puede crear Salas, puede Enviar mensajes, puede Recibir mensajes.
En cambio el rol de Admin podrá usar muchos más métodos, luego su Rol, tendría un string, mucho más 'largo': Admin.Rol = "LSERXBPVG..."
X = puede eliminar user
B = puede Banear un usuario (al hacerlo se le retira a ese usaurio de su rol, la "L")
P = puede otorgar privilegios de administrador (admin restringido) a usuarios normales y retirar privilegios de administrador...
V = puede reiniciar el serVidor (pero no encender ni apagar)
G = Administrador Global. Ningún usuario puede tener este atributo, excepto el dueño del chat. Es decir el resto de administradores, habrá cosas que no pueden hacer. Solo quien tenga el privilegio G, podría apagar, encender el servidor
... = etc, etc... es cuestión de ver que quieres que haga.

Si un usuario (cliente) invoca un método, se verifica si su rol contiene el 'carácter' asociado a ese método, si es que sí, se permite la ejecución del método, si no, no. algunos métodos, en cambio los valida el servidor...
Al crearse un usuario se le añaden un rol básico... al crear el administrador su rol es completo.

Te pego el pseudocódigo de la clase servidor que te puse la otra vez (algo muy resumido, pero que te puede servir de orientación)... (este foro no admite spoilers, así que los mensajes a veces pueden quedar largos).

Date cuenta, que en este código, aparece Privilegios, como sinónimo de Rol, y por ejemplo: el privilegio "CreateSala" (que lo puse así por claridad), puede ser "S" (como aparece en el ejemplo más arriba), es decir resumido a un sólo carácter...

Código:
Clase Servidor
   // Instancias de clases.
   TablaHash Clientes Privado ConEventos
   TablaHash ClientesOcultos Privado  ConEventos // clientes privilegiados, admins
   TablaHash Salas Privado ConEventos
   Sala SalaRaiz  Privado ConEventos
   Cliente ClienteRaiz  Privado ConEventos

   Buleano Existe

   Entero = Propiedad Sololectura NumClientes Publico
       Numclientes = Clientes.Cantidad
   Fin Propiedad

   Entero = Propiedad SoloLectura NumclientesOcultos Publico // o admins  
       NumClientesOcultos = ClientesOcultos.Cantidad
   Fin Propiedad
  
   Entero = Propiedad SoloLectura NumSalas Publico
       Numsalas = Salas.Cantidad
   Fin Propiedad

   Buleano = Propiedad SePermiteCrearSalas Oculto //lectura y escritura

  
   // Esta función se invoca para crear el servidor, que luego es público y permite la conexión... crea además, la primera sala y el resto de objetos necesarios.
   Funcion Nuevo(x,y,z) Oculta  ' parámetros que requiriese para crear el servidor
       Clientes = Nueva TablaHash
       ClientesOcultos = Nueva TablaHash
       Salas = NuevaTablaHash

       SalaRaiz= Nueva Sala
       ClienteRaiz = Nuevo Cliente(Alias, Invisible, Privilegios)
      
       Salas.Add(SalaRaiz)
       Clientes.Add(ClienteRaiz)
       ClientesOcultos.Add(ClienteRaiz)

       Existe = TRUE
    Fin Funcion
    
    // El ciente cuando se conecta al servidor, se añade a la lista de clientes.
    // Y también se le añade a la salaRaiz, y se le devuelve una referencia a esa sala.
    Sala = Funcion Conectar(Cliente Cli) Publico
        Si SalaRaiz.AdmiteClientes = TRUE luego
          //podría filtrarse aquí comparando con una lista de clientes/IPs, baneadas, pero quizás no sea muy efectiva...
             Si SalaRaiz.Add(cli) = TRUE  // solo debería devolver false si ya existe un cliente con el mismo alias.
                 Devolver SalaRaiz
             Fin si
        Fin si
    Fin Funcion        

    Sala = Funcion CrearSala(Cliente Cli, String NombreSala, Entero MasUsers)
        Si (SePermiteCrearSalas = TRUE) luego
            Si (Clientes.Existe(cli) = TRUE ) luego  // Todos los clientes, incluso los ocultos, constan en la colección Clientes.
                Si (Salas.Existe(NombreSala) = FALSE) luego
                    Sala = Nueva Sala(Cli, Nombresala, MaxUsers, This)
                    Salas.Add(sala)  //allí se dispara un evento de 'SalaCreada(Sala.nombre)' que le llega a todos los clientes.

                    Devolver Sala
                Fin Si
            Fin si
        Fin si


        // Ó si solo se permite a clientes ocultos (admins).
        Si (ClientesOcultos.Existe(cli) = TRUE ) luego ...
        ....

        // Ó si solo se permite a cliente con privilegios
        Si (cli.Privilegios.Contiene("CreateSala")) luego
            Si (Clientes.Existe(cli) = TRUE ) luego ...
            ....
        Fin si
    Fin Funcion

    // Otras funciones que tenga el servidor... (especialmente resolver los eventos de las intancias de las clases: Clientes, ClientesOcultos, Salas,  SalaRaiz, ClienteRaiz
Fin Clase

Fíjate comno en este ejemplo, la instancia del servidor cuando se crea, es creada por el administrador cuando invoca el New(x,y,z) x,y,z representa los parámetros que vayan a ser necesarios durante la creación de la instancia.. fíjate que luego en ese mismo métodos se concreta:
   ClienteRaiz = Nuevo Cliente(Alias, Invisible, Privilegios)
...Alias, invisible y privilegios, serían parámetros de entrada (al margen de otros parámetros más fueren precisos). Y al caso, el admin, ni siquiera precisa una contraseña. Ya que es él quien crea la instancia, es el poseedor de la misma, el método New, es el constructor de la instancia, solo puede ser invocado una única vez y además al inicio antes que nada suceda, luego nadie puede usurpar el administrador-absoluto (si no hay métodos para un login posterior de administrador, por ejemplo), a lo sumo podrán crear otras instancias del servidor (...si lograran acceso al terminal que lo contiene)...
Digo administrador absoluto, porque en un chat, suele ser frecuente que haya otros usuarios con roles de administrador (restringido)... en tal caso, es el Administrador absoluto, quien sólo puede otorgar-retirar privilegios de Administrador (restringido)...
3750  Programación / .NET (C#, VB.NET, ASP) / Re: C# - Hackear una contrasena de un servidor en: 24 Julio 2017, 17:13 pm
algunos consejos:

No suele ser muy útil, que el administrador se loguee de la misma forma que un cliente cualquiera.

De entrada si, hay una base de datos (clientes registrados), además de la contraseña, debería requerirse también el alias del usuario. Y por supuesto el admin, no debe llamarse 'admin', por mucho que en los routers venga así de mal...

Tampoco es buena idea registrar a cualquier cliente con una única contraseña.
Añade un método de 'AddCliente', donde el usuario especifique 3 cosas:
- Alias de registro.  (login)
- Contraseña de registro. (login)
- Nombre de interfaz. (interfaz)

Rechaza el registro si:
 - Alias o nombre tiene menos de 'x' caracteres. Usa una constantes c_MinCharsAlias = 6 (por ejemplo)
 - Contraseña tiene menos de 'y' caracteres. ídem sobre la constante
 - Alias y nombre son idénticos.
 - Alias, nombre o contraseña, contienen caracteres que al caso considerares 'ilegales'... Esto es, debe tener un string con los caracteres legales "LegalChars = "ABCDEFGHIJK... abcdrfghijkl...01234...", una función debe chequear si algún carácter en un string recibido contiene un carácter que no aparece en LegalChars en cuyo caso devolver FALSE...
 - Alias y/o nombre ya existen.
 - Al patrón de la contraseña es fácilmente reconocible: por ejemplo "qwerty" "QWERTY", "123456", "PASSWORD", password"... Esto puede ser máso menos complejo, pero al menos hazte con una lista de las 100 contraseñas más frecuentes, las metes en un array y si coinciden lo recghazas... es lo mínimo. algo más potente es contabilizar los caracteres: mayusculas, minúsculas, números, espaciadores, simbolos. Exige que al menos haya caracteres en 3 de esos grupos, y que excepto el grupo con más caracteres (de la contraseña), sumen al menos 3 caracteres...
 ejemplos:
---------- "ahsdfjktovuirmncv3" solo está el grupo minúsculas y en números solo contiene 1, rechazar no hay caracteres para 3 grupos al menos.
--------- "1845763W938564n" hay 3 grupos, pero aparte del más numeroso, solo hay 2 caracteres del resto, rechazar...
En fin puede complicarse más, pero algo similar, debe ser lo mínimo exigible.

El administrador, podría ser el único capacitado para encender el servidor. Esto exige que sea el primero en loguearse. Luego el servidor debe rechazar un login 'efectivo', si hay 0 usuarios logueados y éste no es administrador. al hacerlo así, implica que va a ser imposible que alguien se loguee como el administrador, toda vez que el servidor solo atiende cuando el administrador enciende el servidor. esta solución no siempre va a poder ser adecuada, especialmente cuando el administrador está en una máquina y el servidor reside en otra. El administrador podría ser automático, esto es cuando un cliente intenta loguearse, si hay 0 usuarios logueados, primero loguear internamente al administrador y luego al cliente. Y el administrador (remoto), cuando se loguee como un usuario cualquiera, el servidor debería poder reconocerle y reasignarle el administrador 'precargado'. Así ese administrador aparecerá como si fuera duplicado, esto es consta como un cliente normal y como administrador, pero tiene funciones y roles de administradro, ya que el servidor lo ha reconocido como tal.

Si todo es solo un proyecto de pruebas, tampoco hace falta que te compliques tanto con la seguridad, aunque algo mínimo debes hacer y tenerlo siempre presente la importancia de la seguridad.

Nunca almacenes las credenciales crudas, es decir si el alias de registro es: Tick-Tack y la contraseña: "pSd8F4 0a17Zh4", genera el hash de ambos y concaténalos y asocia un ID al azar y crea un hash también para ese ID (para crerar este hash toma el ID y le concatenas algún caracter del hash anterior, delante, detrás..),  ... esos 3 campos es lo que debes guardar en tu BD. Así un usuario que se loguea, sigue el mismo patrón, se hashea su alias y contraseña y se concatenan, luego se busca si ese hash existe en la base de datos (debe devolver el ID si se encontró), si es así se da por válido el login, si no, que devuelva como ID = -1.
Si fue validado, al cliente entrégale un hash del ID (3º campo guardado). En lo sucesivo (mientras el user esté logueado), será esa referencia la identificación del usuario. Yendo un poco más lejos, este hash entregado debería crearse nuevo cada vez que un usuario se loguea, así no hay posibilidad de que si alguien tomo tu 'referencia' pueda usarla en un futuro...
Cada usuario logueado, añade su referencia a una tabla, así cualquier petición de un usuario antes de ser atendida, se verifica que existe en esa tabla...

En fin la seguridad dependerá mucho de como hagas las cosas.



Páginas: 1 ... 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 [375] 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 ... 432
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines