Mostrando entradas con la etiqueta Languages. Mostrar todas las entradas
Mostrando entradas con la etiqueta Languages. Mostrar todas las entradas

lunes, 27 de febrero de 2012

Técnicas de ataque - SQL Injection (Inyección SQL)

Aunque se trata de un tema, bastante antiguo, y que no será facil de reproducir, aunque seguro que quedan sitios, que son vulnerables a este tipo de cosas. SQL Injection es una técnica de ataque a paginas, que intentan colar codigo SQL, dentro de codigo SQL de la aplcación destino, para romper o acceder a información. Con esto se quiere decir, que por ejemplo, si suponemos que una pagina web, tiene en su pagina de login, dos campos, usuario y contraseña, muy habitual, y para buscarlo hace lo siguiente:

SELECT * FROM Users WHERE Username='usuario' AND Password='contraseña'

Si hicieramos que tanto el usuario, como la contraseña valieran 1' OR '1'='1'

La sentencia quedaría de la siguiente manera:

SELECT * FROM Users WHERE Username='1' OR '1' = '1'  AND Password='1' OR '1' = '1'

Lo que técnicamente devolvería una lista con todos los usuarios, y podría en algunos casos, concedernos acceso a la página en cuestión. Curioso cuanto menos.

Si queremos ser un poco más destructivos, y conocemos el nombre de una tabla, o podemos intuir el nombre, se puede hacer algo como esto, a través de SQL Injection.

Si por ejemplo, se le da el valor al password de: x'; DROP TABLE users; -- y al usuario, por ejemplo 1 (este valor es indiferente para este caso)

el resutaldo sería, cogiendo la SQL arriba citada, el siguiente:

SELECT * FROM Users WHERE Username='1' OR '1' = '1' AND Password='x'; DROP TABLE users; --'

El -- final, es importante, porque se trata de dejar en comentario, el final de la SQL, paa que no falle, la comilla, que nos habran puesto, para parametrizar la String SQL de la contraseñá, en este caso el resultado, es que si la SQL se está ejecutando con permisos de borrado, y la tabla USERS existe, no exisitirá más.

Una vez explicado, como es SQL Injection, haciendo el mal, un par de ideas, para evitarlo, sin que sean muy complicadas de implementar.

Si por ejemplo, en vez de almancenar las contraseñas de los usuarios, lo que se almancena es un HASH de las contraseñas, como pueden ser SHA1 o MD5, entonces, al comparar las contraseñas, lo que se enviará a SQL para comprar no será el texto escrito por el usuario, sino el HASH que se genera, lo que en ningún caso será una SQL Injection.

Por otro lado, otra opción de baja tecnología, para solucionar este problema, quizá mucho menos fiable, pero si mucho más sencilla, es prohibir ciertos caracteres reservados de SQL en los textos, como pueden ser, las comillas simples, el OR, el AND, lo que viene a ser una lista negra de textos prohibidos, para que no ataquen al sistema.

Curiosidad final, si pusieramos este valor a la contraseña,

1; update users set password = 'password'; select *

Esto haría que las contraseñas de todos los usuarios, pasasen a valer "password" lo que tiene gracia, al menos si no le pasa a tu aplicación.

lunes, 23 de enero de 2012

Google Analytics (error _gat undefined)

[caption id="" align="alignright" width="188" caption="Image via CrunchBase"]Image representing Google Analytics as depicte...[/caption]

Un error al parecer bastante habitual el empezar con Google Analytics, es el de encontrarnos con el siguiente error “_gat undefined“ parece que esto se debe a no alcanzar el código Javascript que Google tiene colgado al respecto, es imporante tener en cuenta que esta línea debe encontrarse dentro de la página donde se quiera hacer funcionar Google Analytics.
<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
</script>
Para evitar el error, cuando estamos hacienda pruebas en local, puede utilizarse el siguiente cambio al código Javascript, que como vemos, comprueba que se ha declarado la variable _gat para poder obtener el tracker de Analytics..
<script type="text/javascript">

function mygat(){
if (typeof(_gat) == 'undefined') {
window.setTimeout(mygat,1000);
}
else {
var pageTracker = _gat._getTracker("UA-xxxxxxx-x");
pageTracker._trackPageview();
}
}

function addLoadEvent(func) {
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = func;
}
else {
window.onload = function() {
if(oldonload){oldonload();}
func();
}
}
}

addLoadEvent(mygat);
</script>

sábado, 28 de agosto de 2010

AJAX técnica de carga de páginas Web

AJAX, carga parcial de páginas Web.

AJAX no es un lenguaje de programación en si mismo, sino una serie de técnicas que agilizan la visualización de las paginas Web, es una gran idea, cuando tenemos paginas pesadas que necesitan actualizar datos, y si no queremos enviar las paginas completas para ser recargadas, podemos actualizar de la pagina solicitada solo los campos o datos necesarios, que van a modificarse, de esta manera podemos ahorrar muchos recursos a la hora de visualizar las paginas, los ejemplos que veremos a continuación son código JavaScript que puede utilizarse para realizar tareas de AJAX en paginas Web, notar que los ejemplos están basados en JSP con JavaScript, aunque podríamos extrapolar estas situaciones a paginas ASP o PHP, con diferentes lenguajes de programación de scripts.

[caption id="attachment_391" align="aligncenter" width="300" caption="AJAX"][/caption]

Aviso los ejemplos son muy básicos, se pueden hacer cosas mucho más potente que lo que se refleja aquí. Esto solo es una guía básica.

Cambios en un componente por ID

<!— REEMPLAZAR TEXTO -->

<script type="text/javascript">

function cambio() {

document.getElementById('nombre').innerHTML = "Hola, mundo <b>AJAX</b>!";

}

</script>

<p><a href="javascript:cambio()">Cambiar</a></p>

<div id='nombre'>

Hola, Mundo!

</div>

<!-- FIN REEMPLAZAR TEXTO -->

<!-- TEXTO CON FICHERO -->

<script type="text/javascript">

var http = false;

if(navigator.appName == "Microsoft Internet Explorer") {

http = new ActiveXObject("Microsoft.XMLHTTP");

} else {

http = new XMLHttpRequest();

}

http.open("GET", "test.txt");

http.onreadystatechange=function() {

if(http.readyState == 4) {

alert(http.responseText);

}

}

http.send(null);

</script>

<!— FIN TEXTO CON FICHERO -->

<!— AMBOS -->

<script type="text/javascript">

var http = false;

if(navigator.appName == "Microsoft Internet Explorer") {

http = new ActiveXObject("Microsoft.XMLHTTP");

} else {

http = new XMLHttpRequest();

}

function replace() {

http.open("GET", "test.txt", true);

http.onreadystatechange=function() {

if(http.readyState == 4) {

document.getElementById('nombre').innerHTML = http.responseText;

}

}

http.send(null);

}

</script>

<p><a href="javascript:cambio()">Cambiar</a></p>

<div id="nombre">

Hola, Mundo!

</div>

<!— FIN AMBOS -->