El siguiente código, aparte de mostrar lo mal que programo :), contiene algunos errores graves; en realidad, esta porción de código intenta reproducir un error observado en otra aplicación 😛 .
Category: Seguridad
Artículos y opiniones sobre seguridad Web, SQL Injection, XSS, etc.
Mientras intentaba comprar un ebook, encontré que apress.com es vulnerable a XSS.
Ejemplos:
Esto demuestra que no solo nosotros los novatos cometemos errores tan básicos como el uso no adecuado de $_SERVER['PHP_SELF']
😀
Una pregunta hecha en un foro:
hola gente
normalmente mis sitios php incluyen en el index (el cual incluye las secciones) el siguiente codigo:
php:foreach($_REQUEST as $nombre_campo => $valor){
$asignacion = "$" . $nombre_campo . "='" . $valor . "';";
eval($asignacion);
}no hace mas que capturar todo el $_REQUEST y transformarlo en variables comunes.
intentando evitar ataques via XSS o SQL injection es el unico codigo que me resta por analizar, pero no logro llegar a la conclusion de si es o no peligroso o deberia escribir todas y cada una de las variables.
ustedes que opinan?
En esta edición del quiz, un poco sobre la influencia que tiene la codificación de una página que se envía al cliente.
$charset = 'utf-8';
/* Comprobación simple del charset: no debe contener caracteres raros */
if ( !empty($_GET['charset']) && preg_match('/^[a-z\d-]+$/i', $_GET['charset']) )
$charset = $_GET['charset'];
header('Content-type:text/html; charset=' . $charset);
?>
<html>
<head>
<title>Test</title>
</head>
<body>
<?php
if ( !empty($_GET['url']) )
echo sprintf('<a href="%s">Enlace</a>', htmlentities($_GET['url']));
?>
</body>
</html>
¿Qué problema o problemas existen en el código mostrado?
Solución
Una alternativa de solución, es la que comenta Francesc, sin embargo la funcion htmlentities no acepta todos los encodings, lo que podría conllevar a que el código mostrado sea vulnerable a ataques XSS, para evitar esto, lo mejor es evitar que el usuario establezca el encoding del documento.
Hace instantes, visitando un sitio con artículos sobre programación, me econtré con un curioso error al intentar acceder a un elemento inexistente (id=25).
Al cambiar el valor esperado por 25'
, me muestra lo siguiente 😀 :
Ocurrió un error al ejecutar el query "SELECT COUNT(*) FROM articulos, creditos, temas, stats WHERE (articulos.fecha <= now() AND temas.id_cat = articulos.id_cat and creditos.id_autor = articulos.id_credito and articulos.clave = stats.id_nota) AND (articulos.id_cat <> 33 AND articulos.id_cat <> 34) AND articulos.id_credito = 25\' ORDER BY articulos.fecha DESC". La base dijo : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\' ORDER BY articulos.fecha DESC' at line 1.
Sin duda, es un gran descuido de la persona que hizo esto, porque muestra incluso la consulta SQL generada 😛 .
Obviamente no pondré la dirección de la página afectada, mientras no hayan corregido ese pequeño error.