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 - WHK

#261
Mira, hice una función, aver que opinas:

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

function parse($string){
    
    
// Listado de etiquetas y propiedades permitidas
    
$availables = array(
        
// [etiqueta], [propiedades,]
        
'p'     => array('style''class''id'),
        
'a'     => array('href',  'style''class''id''title'),
        
'span'  => array('style''class'),
        
'b'     => array('style''class'),
        
'i'     => array('style''class'),
        
's'     => array('style''class'),
        
'table' => array('style''class''id''rows''cols''width'),
        
'thead' => array(),
        
'tbody' => array(),
        
'tr'    => array(),
        
'td'    => array(),
        
'div'   => array('style''class''id'),
        
'ul'    => array('style''class''id'),
        
'li'    => array('style''class')
    );

    try
    {
        
$dom = new DOMDocument();
        @
$dom->loadHTML('
            <html>
                <body>
                    <div>'
.$string.'</div>
                </body>
            </html>
        '
);
        
$string null// Libera la memoria
    
}
    catch(
Exception $e)
    {
        
// Contenido corrupto, etiquetas sin cerrar,
        // intento de XSS, etc.
        
return '';
    }

    
$id 0;
    foreach(
$dom->getElementsByTagNameNS('''*') as $tag)
    {
        
$id++;
        if(
$id 4)
        {
            continue;
        }
        
        if(!
in_array($tag->nodeNamearray_keys($availables)))
        {
            
// Etiqueta no permitida
            
$escaped $dom->createTextNode(htmlspecialchars(
                
$dom->saveHTML($tag),
                
ENT_QUOTES
            
));
            
$tag->parentNode->replaceChild($escaped$tag);
        }
        else
        {
            
// Etiqueta permitida

            // Busca todos los atributos de la etiqueta
            
foreach($tag->attributes as $attribute)
            {
                
// Propiedad no permitida?
                
if(!in_array(
                    
strtolower($attribute->name),
                    
$availables[strtolower($tag->nodeName)]
                ))
                {
                    
// Elimina el atributo no permitido
                    
$tag->removeAttribute($attribute->name);
                }
            }
        }
    }

    return 
trim(substr($dom->saveHTML(
        
$dom->getElementsByTagName('body')[0]->childNodes[1]
    ), 
5, -6));
}

echo 
parse('
    <ul>
        <li><a onclick="alert(0)" style="color:red;"
               href="http://google.com/">http://google.com/</a></li>
        <li>http://google.com/</li>
        <li><script>alert(0)//http://google.com/</script></li>
        <li><b>http://google.com/</b></li>
    </ul>
'
);



   <ul>
       <li><a style="color:red;" href="http://google.com/">http://google.com/</a></li>
       <li>http://google.com/</li>
       <li>&amp;lt;script&amp;gt;alert(0)//http://google.com/&amp;lt;/script&amp;gt;</li>
       <li><b>http://google.com/</b></li>
   </ul>


Si el usuario ingresa caracteres no permitidos o etiquetas falsas o etiquetas mal formadas o sin cerrar, etc arrojará una excepción y retornará un contendo en blanco, asi que desde el código final dices que si el input está en blanco entonces el usuario debe volver a ingresar el texto.

Claramente esto funciona para habilitar etiquetas HTML y sólo sirve si el navegador ya envía el contenido en este formato, quiere decir que el usuario tendrá que ingresar su mensaje en un editor thml reducido así como wordpress, por ejemplo usando ckeditor. Así ya no necesitarás transformar las urls a enlaces, simplemente haces que el sitio web desde el lado del input ya integre formato html, o si no, también sirve para sanitizar tus conversiones de enlace con expresión regular y habilitar únicamente a los enlaces, pero sería un tanto redundante, en ves de eso es mejor que el input ya venga con los enlaces construidos por el mismo usuario o creados por javascript.

Saludos.
#262
Citar¿Y si el enlace va entre paréntesis sin espaciado?

De eso se encarga el RFC y la expresión regular, una url no puede comenzar con parentesis pero si terminar en el, por eso en github, wikipedia, wordpress y demás cuando pones una url en parentesis suelen incluir el cierre de parentesis unicamente y eso es normal.

CitarSupongo se podria arreglar añadiendo una lista de dominios

Da igual si el dominio está repetido, terminarás pisando uno sobre el otro porque el string que vas a procesar siempre será el mismo y este ya contendrá encierre de etiquetas <a>.

CitarPero tendrías el mismo problema

No porque haces una pila y procesas palabra por palabra, nunca vuelves a procesar la misma palabra dos veces.
#263
#!drvy , intenta convertir esto con tu función en php:

CitarTest. http://google.com/ y http://google.com/ test.

CitarTest. <a href="<a href="http://google.com/" target="_blank">http://google.com/</a>" target="_blank"><a href="http://google.com/" target="_blank">http://google.com/</a></a> y <a href="<a href="http://google.com/" target="_blank">http://google.com/</a>" target="_blank"><a href="http://google.com/" target="_blank">http://google.com/</a></a> test.

Tu función es recursiva y no respeta las posiciones de cada match, reemplaza los enlaces según el valor de la expresión encontrada independiente si hay más de una o no.

Hay maneras mas eficientes como por ejemplo la de https://stackoverflow.com/questions/1960461/convert-plain-text-urls-into-html-hyperlinks-in-php

Código (php) [Seleccionar]
$url = '@(http(s)?)?(://)?(([a-zA-Z])([-\w]+\.)+([^\s\.]+[^\s]*)+[^,.\s])@';
$string = preg_replace($url, '<a href="http$2://$4" target="_blank" title="$0">$0</a>', $string);
echo $string;


Pero en mi caso para estar totalmente seguro y evitar el uso excesivo de memoria al intentar parsear textos muy grandes sobre el motor de expresión regular y evitar vulnerabilidades (porque el ejemplo que puse de stackoverlow tiene xss) lo que haría sería ir en busca de todos los espacios en blanco, ponerle coordenadas en bytes y luego procesar cada texto completo y validar si es un enlace, y si lo es entonces reemplazar, para ello utilizaría un buffer principal donde se vaya acumulando el resultado y eliminando el original, como una pila pero de bytes. No usaría explode() porque eso podría generar arrays demasiado grandes.

De todas maneras el xss se puede evitar si escapas todo el string antes de crear los enlaces con htmlspecialchars y ENT_QUOTES.
#264
GNU/Linux / Re: ubuntu 20.4 todo eliminado.
1 Julio 2020, 08:45 AM
Citarcosa que nunca me hizo antes

Que cosa nunca había hecho antes? el mensaje de actualización se ve normal, se ven tus repositorios mas el de google para los paquetes de google, no entiendo bien a que te refieres.

Citarelimine el programa y todo los repositorios

Todos los repositorios? incluyendo los repositorios de paquetes de ubuntu?

Si has perdido todo es porque talves cuando le diste desinstalar también te desinstaló alguna dependencia rota y terminaste eliminando gnome o algo por el estilo. Igual es extraño porque en ese caso te hubieras quedado sin interfaz gráfica.

Has intentado acceder a tus documentos desde el terminal?, cual es el estado actual de tu sistema? se borraron las carpetas del home? solo los archivos?, no puedes verlo desde el gestor de archivos o tampoco desde el terminal?, que fue lo que borraste exactamente?

Puedes compartir el contenido del archivo /home/usuario/.bash_history para saber exactamente que fue lo que ejecutaste o eliminaste?, sólo las líneas que incluyen desde la instalación hasta la desinstalación. Con eso sabremos mejor que fue lo que pasó.

Saludos.
#265
Hola, hace unos dias atrás traspasé la propiedad del grupo a el-brujo, no se si habrá afectado en algo o no.

Saludos.
#266
Citarif(opcion == 'y') {}

No puedes hacer una comparación de un char de 1 dimension con un std::string, y cómo sabrías si el valor contiene otra letra y deba ser procesado para multiplicar o no?.
#267
Porque 0 para factorización si es un número válido, solo te quisiste ahorrar la validación numérica.

saludos.
#268
Citar- El do y el casteo por el que preguntas static_cast<int>('n'); son innecesarios en este programa.

Y como te aseguras que el usuario no ha introducido otra cosa que no sea un valor numérico? y como sumas el total de todas las operaciones del loop?

CitarNo tienes ningún tipo de pausa en el programa. Puede que tu IDE las integre en desarrollo pero en varios sistemas si ejecutas el binario compilado, este no tiene pausa y se cierra la consola sin poder ver el resultado.

No veo la necesidad de hacer una pausa, vamos, es una aplicación de terminal, no vienes desde windows y le haces doble click al ejecutable, se supone que lo estás llamando desde el interprete de comandos, a demás.

Citarchar letra no te hace falta

Y como finaliza la instrucción del input del while?

Lo que te hace falta FranAI es transformar tu input a integer siempre y cuando este sea un valor numérico, en caso contrario no podrás transformar "n" a entero y te dará un error de memoria y la validación de contenido de un valor entero de un std string lo debes hacer recorriendo cada caracter, yo transformé cada uno al valor decimal y comrpobé si era el valor de un dígito. También entendí que la suma de los loops es para sumar el resultado de cada operación dentro del loop, asi que lo modifiqué poniendo las variables dentro del mismo loop para evitar globalizar las variables y tener basura en la memoria cuando liberes el proceso, las variables temporales las puse dentro del mismo while para que se autodestruyan en cada iteración. A demás, las palabras no se consideran como operaciones matemáticas asi que el contador lo puse justo después de la validación. Mira, algo así:

#include <iostream>
#include <string>

int main()
{
   std::string input;
   int totals  = 0;
   int nInputs = 0;

   while(1)
   {
       std::cout << "Ingrese un numero entero (o 'n' para finalizar): "; // no flush
       std::cin >> input;
       
       if(input.compare("n") == 0)
       {
           break;
       }

       bool isNumeric = true;
       for(int i = 0; i <= (input.length() - 1); i++)
       {
           if(((int)input[i] < 48) || ((int)input[i] > 57)) // decimal
           {
               isNumeric = false;
               std::cout << "El valor no es numérico. Intentalo nuevamente." << std::endl;
               break;
           }
       }

       if(!isNumeric)
       {
           continue;
       }

       nInputs++;

       int num   = std::stoi(input);
       int total = num * num - num;
       totals += total;

       std::cout << num <<  " * " << num << " - " << num <<  " = " << total << std::endl;
   }

   std::cout << nInputs << " numeros ha ingresado el usuario." << std::endl;
   std::cout << "Suma de resultados calculados: " << totals << std::endl;

   return 0;
}


Para compilar y ejecutar:

whk@machine:~/Escritorio$ g++ test.cpp -o test
whk@machine:~/Escritorio$ file test
test: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, not stripped
whk@machine:~/Escritorio$ ./test
Ingrese un numero entero (o 'n' para finalizar): 1
1 * 1 - 1 = 0
Ingrese un numero entero (o 'n' para finalizar): 5
5 * 5 - 5 = 20
Ingrese un numero entero (o 'n' para finalizar): abc
El valor no es numérico. Intentalo nuevamente.
Ingrese un numero entero (o 'n' para finalizar): 500
500 * 500 - 500 = 249500
Ingrese un numero entero (o 'n' para finalizar): n
4 numeros ha ingresado el usuario.
Suma de resultados calculados: 249520


También podrías simplificar "n*n-n" como "n*(n-1)", factorización de números semiprimos ;)

Espero te sirva. Saludos.
#269
CitarEn cambio se debia primero crear un user de bd al que se le revoquen todos los permisos de select, insert, update y solo pueda manipular las tablas a traves de proc almacenados, de esta maneracsolo podra ver solo los campo que le permita el proc almacenado.
Como dije estaba tuve que rehacer el trabajo que al prinxipio mezclaba sql+vb, esta vez uso los procs para el crud pero tambien los tendre que usar para validar usuarios, practicamente todo el trabajo lo tengo hecho en procs almacenados.

como te dije antes, alejate de esos sitios webs. El que maneja la integridad de acceso debe ser la capa de datos desde la aplicación, no la base de datos. Si un día necesitas dar acceso a una aplicación que se va a conectar a la misma base de datos que harás? tendrás dos grandes problemas, primeramente tendrías que tener dos permisos distintos, uno para leer y otro para actualizar y vas a tener que usar usuarios distintos con procedimientos distintos, lo segundo es que tendrías que estarle haciendo cambios directamente a la base de datos sin pasar por el proceso de paso a producción de la aplicación porque no tendrás los cambios por escrito en código ni habrá una manera de devolver el estado anterior de la db si algo sale mal. He trabajado muchos años en muchas empresas que han utilizado procedimientos almacenados en .net y tienen los peores dolores de cabeza.

Se ordenado y haz las cosas bien desde el comienzo.

CitarLa verdad no se cuales lenguajds son los mas requeridos por las empresas

Actualmente el mas requerido a nivel mundial en el mundo laboral es Java. Dale un vistazo a esto:

https://computerhoy.com/noticias/tecnologia/estos-son-lenguajes-programacion-demandados-empresas-423369
http://www.cleformacion.com/-/los-10-lenguajes-de-programacion-mas-demandados-en-2018
https://www.campusmvp.es/recursos/post/tendencias-en-lenguajes-de-programacion-2019-la-encuesta-anual-de-stack-overflow.aspx

Como verás, a nivel laboral, visual basic no está en ningún top.

Saludos.
#270
Debe ser algún resentido que cree que botando sitios va a cambiar o demostrar algo. En unos días más el foro continuará online como siempre y probablemente todos terminen olvidando el ataque.

Mientras tanto que dure el ddos, vamos a jugar unas partidas de War Robots por Steam :D y volvemos en un rato, mientras que quema sus direcciones ips.