Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Leguim

#71
Cita de: #!drvy en 12 Febrero 2021, 23:54 PM
Puesto que tienes una serie de expresiones regulares, realmente lo que te interesa es que estas formen parte de un array (u objeto) que puedas recorrer. Así no tienes declarar una variable y/o hacer un IF por cada una.

Código (php) [Seleccionar]
<?php

$password 
'testAb9!';
$security 0;
$rules = array(
    
'lower'  => '[a-z]',
    
'upper'  => '[A-Z]',
    
'symbol' => '([!,%,&,@,#,$,^,*,?,_,~])',
    
'number' => '[0-9]'
);

foreach (
$rules as $rule) {
    if (
preg_match($rule$password) > 0) {
        
$security++;
    }
}


var_dump($security);



Tambien puedes hacerlo con array_reduce:

Código (php) [Seleccionar]
$security = array_reduce($rules, function ($carry, $rule) use ($password) {
   return (preg_match($rule, $password) > 0 ? $carry + 1 : $carry);
}, 0);




De todos modos, este concepto de puntuación de contraseña es básico. Te interesa comprar patrones y repeticiones. Por ejemplo, no es lo mismo tener de contraseña Miguel2020! que 20M!gu3l20 (en este caso, ambos tienen la misma puntuación).

Saludos

Sí, es algo básico.

Gracias!
#72
Básicamente estoy pensando como podría hacer un sistema nuevo de seguridad que prevenga ataques de fuerza bruta en el login.

Es decir, que un usuario determinado intente constantemente con diferentes contraseñas (se espera que tenga un diccionario de contraseñas) hasta poder ingresar a la cuenta de la victima.
Me vinieron algunas ideas pero como todo está muy fresco seguro hay cosas que estoy dejando pasar.

El sistema funcionaría de la siguiente manera, cada vez que un usuario ingrese una contraseña incorrecta el sistema le incrementará a +1 una variable que podemos llamar "attempt" (no estoy seguro si en una $_SESSION o en un campo nuevo en la bd para la cuenta de usuario que aplique), al llegar a las 40 tentativas lo que ocurrirá sería bloquear el login para ese usuario. Absolutamente nadie podrá iniciar sesión en esa cuenta por lo menos durante un periodo de tiempo que aún no defino bien, quizás una 6 horas no estoy seguro.

Por supuesto puede ocurrir que la persona que desee ingresar sesión sea el propio usuario, no el atacante. Entonces se le podría enviar un mail justo en el momento de bloquear el login explicándole lo ocurrido, recomendándole el uso de una contraseña segura, por supuesto algo que se me ocurrió es poder darle la posibilidad a el dueño de la cuenta en las opciones de privacidad de querer que su cuenta quede bloqueada (el login) ante estos casos o que no quede.

En fín, en el correo que se le enviará se le dirá que además de la recomendación del uso de contraseñas seguras y esa opción nueva de privacidad, estaría un código que deberá ingresar en un determinado formulario para que se pueda desbloquear el login nuevamente sin que tenga que esperar las 6h.

Es una idea muy fresca así que espero puedan darme más ideas, o mejoras a todo esto.
#73
No necesito que me hagan todo el algoritmo, pero hay cosas como .match de javascript que nosé cual sería en PHP.

Código (javascript) [Seleccionar]

                                var expression_lower = new RegExp('[a-z]');
var expression_number = new RegExp('[0-9]');
var expression_symbol = new RegExp('([!,%,&,@,#,$,^,*,?,_,~])');
var expression_upper = new RegExp('[A-Z]');
var security = 0;

if(string.match(expression_lower))
{
security = security + 1;
}

if(string.match(expression_number))
{
security = security + 1;
}

if(string.match(expression_symbol))
{
security = security + 1;
}

if(string.match(expression_upper))
{
security = security + 1;
}

if(string.length >= 8)
{
security = security + 1;
}
#74
Hola,

¿Cómo podría definir un arreglo vacío?
Me explico...

Código (javascript) [Seleccionar]

var formdata = new FormData();
var my_array = []; // esto es un arreglo vacío, si por consola imprimimos este dato nos va a devolver: []

for(var i = 0; i < my_array.length; i++)
{
     formdata.append('my_array[]', my_array[i]);
}



Como el tamaño del arreglo es 0 porque está vacío, no va a entrar en ninguna interacción y no va a agregar dicho arreglo.

Intenté con algunas otras maneras pero siempre me termina agregando un dato vacío.. "" cuando lo llamo con formdata.get('my_array[]'); y lo que yo quiero que devuelva sea: [] que significa arreglo vacío.



Mod: Sacados los comentarios a texto para mejor lectura.
#75
PROBLEMA SOLUCIONADO

En resumen el problema fue una mala interpretación de como funcionaba el código y no hacer uso de let (variable local).

Explico, digamos que cuando se ejecutaban en este caso 2 peticiones ajax en simultaneo lo que ocurría era que...



Lo que pasa con esto es que en la variable "ajax_file_used" al ser de alcance global se va a terminar poniendo en false con el nuevo nombre modificado por lo que siempre la primer ejecución quedara con el "ajax_enviando" en true por eso después no funcionará.

La solución, usar let ajax_file_used y ya funcionaría.
#76
Hola,

bueno tengo para mostrarles hoy, dos funciones que hacen llamadas a código del servidor por medio de AJAX.

El problema que tengo es que si estas funciones ajax se ejecutan de manera "Secuencial" es decir, primero una y después la otra no va a haber ningún problema. Pero si las ejecuto al mismo momento se me bugean por lo menos la primer llamada de la siguiente manera.

Cuando digo que se bugean me refiero a que cuando la intento volver a llamar a dicha función esta no se ejecuta (no pasa absolutamente nada)

Para el ejemplo que les tengo, Un sistema donde tengo dos cajas donde en principio son de color gris pero al ejecutar "Ajax_Colour_A();" o "Ajax_Colour_B();" por medio de la consola del navegador va a modificar el color de las cajas. Si es Ajax_Colour_A modificará con color ROJO la primer caja pero si es Ajax_Colour_B modificará con color azul la segunda caja.

Además, abajo de todo habrá un mensaje en texto plano, de "Ejecutando..." cuando se este ejecutando el archivo php que este mensaje ayudará a que vean que no se ejecuta el archivo cuando se bugea su función correspondiente.

- test.php (tendrá las dos cajas y las definiciones de las funciones necesarias)
- ajax_colour_a.php (este archivo php será el que tendrá un script para modificar el color de la caja A con color ROJO)
- ajax_colour_b.php (este archivo php será el que tendrá un script para modificar el color de la caja B con color AZUL)

Aclaración: No hace falta verle el sentido al código, es solamente un ejemplo lo más básico posible para poder entender el problema.

test.php
Código (html) [Seleccionar]

<div id="box_a" style="background: #f2f2f2; border: 1px solid #e6e6e6; height: 300px; width: 300px; padding: 10px;">
        <h2 style="text-align: center; margin-top: 70px;">AJAX #1</h2>
        <h6 style="text-align: center; margin-top: 10px;">Ajax_Colour_A();</h6>
</div>
<div id="box_b" style="background: #f2f2f2; border: 1px solid #e6e6e6; height: 300px; padding: 10px;">
        <h2 style="text-align: center; margin-top: 70px;">AJAX #2</h2>
        <h6 style="text-align: center; margin-top: 10px;">Ajax_Colour_B();</h6>
</div>

<script type="text/javascript">
    var ajax_file_used = null;
   var ajax_files = ['ajax_colour_a.php', 'ajax_colour_b.php'];
   var ajax_enviando = [];
   var ajax_solicitud = [];

   for(var i = 0; i < ajax_files.length; i++)
   {
       ajax_enviando[ajax_files[i]] = false;
       ajax_solicitud[ajax_files[i]] = null;
   }

   function Ajax_Colour_A()
   {
       ajax_file_used = 'ajax_colour_a.php';

       if(ajax_enviando[ajax_file_used] == false)
       {
           ajax_enviando[ajax_file_used] = true;

           ajax_solicitud[ajax_file_used] = $.ajax({
               url: (ROOT_URL)+'/ajax/'+(ajax_file_used),
               type: 'POST',
               dataType: 'html',

               success: function()
               {
                   ajax_enviando[ajax_file_used] = false;
               }
           })

           .done(function(results)
           {
               $('body').append(results);
           })

           .fail(function()
           {
               ajax_enviando[ajax_file_used] = false;
           })
       }
   }

   function Ajax_Colour_B()
   {
       ajax_file_used = 'ajax_colour_b.php';

       if(ajax_enviando[ajax_file_used] == false)
       {
           ajax_enviando[ajax_file_used] = true;

           ajax_solicitud[ajax_file_used] = $.ajax({
               url: (ROOT_URL)+'/ajax/'+(ajax_file_used),
               type: 'POST',
               dataType: 'html',

               success: function()
               {
                   ajax_enviando[ajax_file_used] = false;
               }
           })

           .done(function(results)
           {
               $('body').append(results);
           })

           .fail(function()
           {
               ajax_enviando[ajax_file_used] = false;
           })
       }
   }
</script>



ajax/ajax_colour_a.php
Código (php) [Seleccionar]

<!-- ajax_colour_a.php -->
<?php
echo "<br>ejecutando...<br>";

?>

<script type="text/javascript">
document.getElementById('box_a').style.background = 'red';
</script>


ajax/ajax_colour_b.php
Código (php) [Seleccionar]

<!-- ajax_colour_b.php -->
<?php
echo "<br>ejecutando...<br>";

?>

<script type="text/javascript">
document.getElementById('box_b').style.background = 'blue';
</script>


La verdad no puedo entender que es lo que está mal con el código porque todo debería de funcionar de 10, estuve todo el día de el porque de esto pero no se entiende.
#77
Buenas noches,

me refiero a tener los siguientes campos en una base de datos:

- number_int // representa un numero entero
- number_dec // representa un numero decimal (solo la parte después de la coma)

Ejemplos:

- number_int // por ejemplo: 9
- number_dec // por ejemplo: 34 donde 34 es "x, 34"

Mi pregunta es que en una consulta SQL yo pueda juntar tanto el number_int como el number_dec y formen un valor, en este caso el valor formado sería el 9.34 o 9,34

Creo que con eso ya me pude dar a entender correctamente, pero por las dudas agrego otro ejemplo:

Código (php) [Seleccionar]

"SELECT * FROM tabla WHERE Juntar(number_int y number_dec) >= x and Juntar(number_int y number_dec) <= y"


Gracias.

#78
Hola,

Código (php) [Seleccionar]

// tendría esto...
$algo = 'algo';
$algo_2 = 'algo';

$con = Connection(username, password);
$query = $con->prepare('SELECT x, y FROM tabla WHERE x = :algo AND y = :algo_2');
$query->execute(array(':algo' => $algo,
                     ':algo_2' => $algo_2));
$results = $query->fetchAll();

return $results;

// lo pasaría a esto, correcto?...
$algo = 'algo';
$algo_2 = 'algo';

$con = Connection(username, password);
$query = $con->prepare('SELECT x, y FROM tabla WHERE x = :algo AND y = :algo_2');
$query->execute(array(':algo' => bindParam($algo),
                     ':algo_2' => bindParam($algo_2)));
$results = $query->fetchAll();

return $results;


Otra duda que me quedó es... entonces digamos que esas variables que había concatenado antes (arriba de todo, en el principio del tema) si no fueran constantes y si fueran datos que el usuario ingresa entonces SÍ habría una vulnerabilidad, no?

Gracias! (tardé en responder porque anduve bastante ocupado)
#79
Hola,

uso las consultas "prepare" que tengo entendido ayudan a prevenir las inyecciones SQL, ahora bien también escuche que no es recomendable por este tema concatenar datos a una consulta.

No estoy del todo seguro si en este caso existe una vulnerabilidad de inyección:

Código (php) [Seleccionar]

class x
{
    static function Consulta($x, $y)
    {
           $con = Connection(username, password);
           $query = $con->prepare('SELECT x_campo, y_campo FROM x_tabla WHERE '.($x).' = '.($y));
           $query->execute();
   $results = $query->fetchAll();

   return $results;
    }
}


aclarar que tanto los parametros $x, como $y son constantes y no son datos que el usuario envía, un ejemplo:

Código (php) [Seleccionar]
$datos = x::Consulta('id_user', 61); // son constantes, no datos que un usuario ingresa
#80
Cita de: Kyrie Eleison en 30 Noviembre 2020, 09:39 AM
Es verdad que el plazo de 6 horas aporta bastante seguridad. Pero aún así no convence del todo. Resulta que el administrador me cambia la dirección e-mail que debo usar para loguearme. Bien ¿y la nueva dirección es real? ¿corresponde a un correo real? Si es así, no es mi correo. La verdad no veo nada de seguridad en tener que usar como mi identificador una dirección de correo que no es mía; y que quién sabe para qué usará su dueño real. Aunque sea una dirección de un administrador, cualquiera sabe qué a manos puede llegar y qué usos le pueden dar. Y si no es una dirección real actualmente, ¿quién dice que no pueda llegar a serlo y que mañana alguien dé de alta y registre ese mail?

No sé; no es sólo la posible suplantación o la seguridad en general, sino que todo el proceso tiene un punto de artificioso que no me gusta. Éso y además la arbitrariedad de que un administrador lo cambie a gusto. ¿Qué motivos puede haber para asignarte un correo que no es tuyo? Lo lógico sería en todo caso cambiarte la contraseña y asignarte una. Vale, éso, dentro de la excepcionalidad, lo vería más lógico. ¿Pero cambiarte el correo?  :silbar:

Creo que la situación real no se ha explicado del todo y debe ser bastante "rarilla" cuando tú mismo -que es el que sabe de qué va la cosa- debes de tener tus "ideas", lo que se ve muy claro cuando incides muy particularmente en el aspecto "legal" del asunto. Por ahí se ve que no las tienes muy todas contigo y esperas a ver si te "justifican" esa forma de proceder.

Lo cual, dicho sea de paso, yo sería bastante escéptico de conseguirlo mediante las opiniones de un foro; todavía si en vez de foro.elhacker fuese foro.eljurista... ::) Pero vaya que un foro es un foro; y yo ese tipo de dudas las consultaría más bien con un abogado, antes que con un aficionado al hacking o la informática en general. Quien sabe, puede que por aquí haya alguien que reúna ambas condiciones. Aún así no dejaría de ser una opinión "foreril"; si estuviese en juego mi seguridad "legal" buscaría otro tipo de asesoramiento y apoyo más técnico y fiable.

A mí con chicanas, no flaco..

Fíjate como de un problema sobre si pedía email o username te dije que no existe tal vulnerabilidad en todo caso es la misma uses el login que uses ya por el hecho de guardar el email de los usuarios...
Así que eso de que es más recomendable usar el login username porque es más "seguro" es una idea estúpida si es por el problema de la "suplantación", hay que avisarle a facebook, paypal, etc que usen username será más seguro por el problema de "suplantación"

Segundo, quédate tranquilo que si no te sentís calificado para opinar de derecho o informática entonces no comentes me ahorras el tiempo en andar replicandote y si te molestaras en leer y en escribir menos quizás te hayas dado cuenta que en los primeros mensajes había puesto que iba a sacar la modificación de los email por parte de la administración...

No me tomo mal las críticas sino no hubiera creado el tema pero no me gustan las chicanas..

Respecto al problema principal del tema repito que ya lo saqué porque hay gente a la que hay que re escribirle las cosas..

Gracias por las críticas y sugerencias.