|
261
|
Programación / Desarrollo Web / Re: [Pregunta]: ¿Como puedo hacer esto equivalente con javascript?
|
en: 3 Julio 2020, 07:47 am
|
Mira, hice una función, aver que opinas: <?php function parse($string){ // Listado de etiquetas y propiedades permitidas // [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'), '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; } { // Etiqueta no permitida $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? )) { // Elimina el atributo no permitido $tag->removeAttribute($attribute->name); } } } } $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>&lt;script&gt;alert(0)//http://google.com/&lt;/script&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
|
Programación / Desarrollo Web / Re: [Pregunta]: ¿Como puedo hacer esto equivalente con javascript?
|
en: 3 Julio 2020, 06:31 am
|
¿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. Supongo 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>. Pero 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
|
Programación / Desarrollo Web / Re: [Pregunta]: ¿Como puedo hacer esto equivalente con javascript?
|
en: 2 Julio 2020, 00:12 am
|
#!drvy , intenta convertir esto con tu función en php: 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$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
|
Sistemas Operativos / GNU/Linux / Re: ubuntu 20.4 todo eliminado.
|
en: 1 Julio 2020, 08:45 am
|
cosa 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. elimine 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.
|
|
|
266
|
Programación / Programación C/C++ / Re: Problema al usar while
|
en: 23 Abril 2020, 22:13 pm
|
if(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?.
|
|
|
268
|
Programación / Programación C/C++ / Re: Problema al usar while
|
en: 23 Abril 2020, 11:00 am
|
- 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? No 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. char 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
|
Programación / Bases de Datos / Re: Ayuda mostrar filas se relacion muchos a muchos
|
en: 23 Abril 2020, 10:03 am
|
En 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. La 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-423369http://www.cleformacion.com/-/los-10-lenguajes-de-programacion-mas-demandados-en-2018https://www.campusmvp.es/recursos/post/tendencias-en-lenguajes-de-programacion-2019-la-encuesta-anual-de-stack-overflow.aspxComo verás, a nivel laboral, visual basic no está en ningún top. Saludos.
|
|
|
270
|
Foros Generales / Sugerencias y dudas sobre el Foro / Re: GET /index.php?=VAYAMIERDADELBRUJO
|
en: 21 Abril 2020, 23:22 pm
|
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 y volvemos en un rato, mientras que quema sus direcciones ips.
|
|
|
|
|
|
|