Filtro SQL Injection y Filtro XSS

Iniciado por 0x0309, 13 Octubre 2009, 06:20 AM

0 Miembros y 2 Visitantes están viendo este tema.

0x0309

Aquí comparto dos funciones que hice para prevenir sql injection y xss.

El código está en base64, una vez que lo decodifican, pueden guardarlo como Filtros.php y requerirlo en su script.



PD9waHANCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIEZpbHRybyBw
YXJhIGV2aXRhciBTUUwgSW5qZWN0aW9uICMNCiMgdmVyc2lvbjogMC4xICAgICAgICAgICAgICAg
ICAgICAgIw0KIyBBdXRvcjogMHgwMzA5ICAgICAgICAgICAgICAgICAgICAjDQojIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCmZ1bmN0aW9uIGFudGlTUUxJbmplY3Rpb24oJHN0
cikNCnsNCiAgICBpZiAoaXNfc3RyaW5nKCRzdHIpKSB7DQogICAgICAgICAvL2VuIHBocCA2IG1h
Z2ljIHF1b3RlcyB5YSBubyB2YW4NCiAgICAgICAgaWYgKGdldF9tYWdpY19xdW90ZXNfZ3BjKCkp
IHsNCiAgICAgICAgICAgICRzdHIgPSBzdHJpcHNsYXNoZXMoJHN0cik7DQogICAgICAgIH0NCiAg
ICAgICAgJHN0ciA9IG15c3FsX3JlYWxfZXNjYXBlX3N0cmluZygkc3RyKTsNCiAgICAgICAgJHN0
ciA9IGFkZGNzbGFzaGVzKCRzdHIsICclXycpOw0KICAgIH0NCiAgICByZXR1cm4gJHN0cjsNCn0N
Cg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBGaWx0cm8g
cGFyYSBldml0YXIgQ3Jvc3MtU2l0ZSBTY3JpcHRpbmcgIw0KIyB2ZXJzaW9uOiAwLjEgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIw0KIyBBdXRvcjogMHgwMzA5ICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0K
ZnVuY3Rpb24gYW50aUNyb3NzU2l0ZVNjcmlwdGluZygkc3RyKQ0Kew0KICAgIGlmIChpc19zdHJp
bmcoJHN0cikpIHsNCiAgICAgICAkc3RyID0gaHRtbGVudGl0aWVzKCRzdHIsIEVOVF9RVU9URVMs
ICdVVEYtOCcpOw0KICAgIH0NCiAgICByZXR1cm4gJHN0cjsNCn0NCg0KPz4=


y pueden usarlo así:


//Para consultas a base de datos:
//Si el campo id de la base de datos es string :
$id = antiSQLInjection( $_POST['id'] );
//Sino si el campo id de la base de datos es entero:
$id = (int) $_POST['id'];

$query = "select nombre from usuario where id='{$id}'";
mysql_query($query);


//Para imprimir:
echo antiCrossSiteScripting($_POST['texto']);




0x0309

#1
Aquí hice una nueva versión con soporte para arrays.
Nota: coloco el code codificado en base 64 porque el foro no me deja postearlo, si quieren intenten, lo decodifican y en un mensaje lo pegan y hacen una previsualización (a mí me sale acceso denegado).

Para decodificar pueden usar:

http://ostermiller.org/calc/encode.html


DQo8P3BocA0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgRmlsdHJv
IHBhcmEgZXZpdGFyIFNRTCBJbmplY3Rpb24gIw0KIyB2ZXJzaW9uOiAwLjIgICAgICAgICAgICAg
ICAgICAgICAjDQojIEF1dG9yOiAweDAzMDkgICAgICAgICAgICAgICAgICAgICMNCiMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KZnVuY3Rpb24gYW50aVNRTEluamVjdGlvbigk
dCkNCnsNCiAgICBpZiAoaXNfc3RyaW5nKCR0KSkgew0KICAgICAgICBpZiAoZ2V0X21hZ2ljX3F1
b3Rlc19ncGMoKSkgew0KICAgICAgICAgLy9lbiBwaHAgNiBtYWdpYyBxdW90ZXMgeWEgbm8gdmFu
DQogICAgICAgICAgICAkdCA9IHN0cmlwc2xhc2hlcygkdCk7DQogICAgICAgIH0NCiAgICAgICAg
JHQgPSBteXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcoJHQpOw0KICAgICAgICAkdCA9IGFkZGNzbGFz
aGVzKCR0LCAnJV8nKTsNCiAgICB9IGVsc2VpZiAoaXNfYXJyYXkoJHQpKSB7DQogICAgICAgICRh
ID0gYXJyYXkoKTsNCiAgICAgICAgd2hpbGUobGlzdCgkYywgJHYpID0gZWFjaCgkdCkpIHsNCiAg
ICAgICAgICAgICRhWyRjXSA9IGFudGlTUUxJbmplY3Rpb24oJHYpOw0KICAgICAgICB9DQogICAg
ICAgICR0ID0gJGE7DQogICAgfQ0KICAgIHJldHVybiAkdDsNCn0NCg0KIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBGaWx0cm8gcGFyYSBldml0YXIgQ3Jvc3Mt
U2l0ZSBTY3JpcHRpbmcgIw0KIyB2ZXJzaW9uOiAwLjIgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIw0KIyBBdXRvcjogMHgwMzA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgIw0KIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KZnVuY3Rpb24gYW50aUNyb3Nz
U2l0ZVNjcmlwdGluZygkdCkNCnsNCiAgICBpZiAoaXNfc3RyaW5nKCR0KSkgew0KICAgICAgICR0
ID0gaHRtbGVudGl0aWVzKCR0LCBFTlRfUVVPVEVTLCAnVVRGLTgnKTsNCiAgICB9IGVsc2VpZiAo
aXNfYXJyYXkoJHQpKSB7DQogICAgICAgICRhID0gYXJyYXkoKTsNCiAgICAgICAgd2hpbGUobGlz
dCgkYywgJHYpID0gZWFjaCgkdCkpIHsNCiAgICAgICAgICAgICRhWyRjXSA9IGFudGlDcm9zc1Np
dGVTY3JpcHRpbmcoJHYpOw0KICAgICAgICB9DQogICAgICAgICR0ID0gJGE7DQogICAgfQ0KICAg
IHJldHVybiAkdDsNCn0NCg0KPz4NCg==

:ohk<any>

Y es que a veces pienso que si no estuviera loco no podría salir adelante.
Lo que no se es capaz de dar, en realidad no se posee, uno es poseído por ello.

jdc


WHK

#4
Ese filtro tiene inyección sql xDDDD

:o :silbar: :xD :P :rolleyes:

y el antiCrossSiteScripting tiene problemas de decodificación en caso de utilizar carácteres latinos compatibles con ISO-8859-1

fijate en la función
http://cl.php.net/mysql%20real%20escape%20string
la cantidad de carácteres que escapa en una query mysql es diferente al adshlashses.
por algo esa función la hicieron esclusivamente para peticiones a la base de datos.

Y mysq_real_escape_string agrega un slash a una comilla entonces addslashses le agregará otro slash y quedará doble como por ejemplo en ves de quedar ' quedará \\\\\'

0x0309

#5
Gracias por responder.

Mira, yo cuando programo dejo las fuentes de entrada intactas. Así si por ejemplo recibo un texto por $GET['txt'] lo dejo así.
No hago: $GET['txt'] = filtro($GET['txt']);

así nunca tendré que revertir un filtro.

sino que creo una nueva referencia:
Por ejemplo para consulta sql


$miconsulta = fprintf("select campo from tabla where n='%s'", antiSQLInjection($GET['txt']));


o para imprimir el valor:

echo antiCrossSiteScripting($GET['txt']);


Aquí he creado otra versión, ahora es más personalizado. por ejemplo si tengo un campo que comienza con _ y aplicaba el filtro para sql anterior, buscando por ejemplo el valor _abc no lo encontraría porque después del filtro quedaba: \_abc
Así, ahora si el texto se usará con un LIKE se pasa el parámetro true.
Similar para el antiCrossSiteScripting.
Si dejaba una variable así:

$texto = '<b>Este es backslas:\\</b>';

y hacia:

echo antiCrossSiteScripting($texto);


imprimía: el texto sin el backslash final.

Ahora, especifico que si el texto no provino de una fuente de entrada, es decir lo creo yo, no le quite los backlashes explícitos que yo escribo.

En un nuevo mensaje dejo el nuevo código, porque lo he modificado varias veces después de postearlo.

0x0309

este es el nuevo código:


PD9waHANCg0KLy9Fc3RvcyBjb2RpZ29zIGVzdGFuIHBlbnNhZG9zIHBhcmEgdHJhYmFqYXIgY29u
IHBocCA1DQovL1BhcmEgcGhwIDYgaGFicmEgcXVlIG1vZGlmaWNhcmxvcyBwb3JxdWUgeWEgbm8g
c2UgdXNhcmFuIG1hZ2ljIHF1b3Rlcy4NCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMNCiMgRmlsdHJvIHBhcmEgZXZpdGFyIFNRTCBJbmplY3Rpb24gICAgICAg
ICAjDQojIHZlcnNpb246IDAuNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIw0KIyBSZWNp
YmUgdHJlcyBwYXJhbWV0cm9zOiAgICAgICAgICAgICAgICAgICMNCiMgIEVsIDFybzogc3RyaW5n
IG8gYXJyZWdsbyBkZSBzdHJpbmcuICAgICAjDQojICBFbCAyZG86IHNpIGVsIHN0cmluZyBzZSB1
c2FyYSBjb24gTElLRS4gIw0KIyAgRWwgM3JvOiBzaSBlbCBzdHJpbmcgcHJvdmllbmUgZGU6ICAg
ICAgICMNCiMgICBQT1NUL0dFVC9DT09LSUUvYXJjaGl2by9jb25zdWx0YSBTUUwuICAjDQojIFJl
dG9ybmEgdW5hIGNvcGlhIGZpbHRyYWRhLiAgICAgICAgICAgICAgIw0KIyBBdXRvcjogMHgwMzA5
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjDQpmdW5jdGlvbiBhbnRpU1FMSW5qZWN0aW9uKCR0ZXh0LCAkbGlr
ZSA9IGZhbHNlLCAkaW5wdXQgPSB0cnVlKQ0Kew0KICAgIGlmIChpc19zdHJpbmcoJHRleHQpKSB7
DQogICAgICAgIGlmICgkaW5wdXQpIHsNCiAgICAgICAgICAgIGxpbXBpYUJhY2tTbGFzaGVzSW52
b2x1bnRhcmlvcygkdGV4dCk7DQogICAgICAgIH0NCiAgICAgICAgJHRleHQgPSBteXNxbF9yZWFs
X2VzY2FwZV9zdHJpbmcoJHRleHQpOw0KICAgICAgICBpZiAoJGxpa2UpIHsNCiAgICAgICAgICAg
ICR0ZXh0ID0gYWRkY3NsYXNoZXMoJHRleHQsICclXycpOw0KICAgICAgICB9DQogICAgfSBlbHNl
aWYgKGlzX2FycmF5KCR0ZXh0KSkgew0KICAgICAgICAkYSA9IGFycmF5KCk7DQogICAgICAgIHdo
aWxlKGxpc3QoJGtleSwgJHZhbHVlKSA9IGVhY2goJHRleHQpKSB7DQogICAgICAgICAgICAkYVsk
a2V5XSA9IGFudGlTUUxJbmplY3Rpb24oJHZhbHVlLCAkbGlrZSwgJGlucHV0KTsNCiAgICAgICAg
fQ0KICAgICAgICAkdGV4dCA9ICRhOw0KICAgIH0NCiAgICByZXR1cm4gJHRleHQ7DQp9DQoNCg0K
DQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIEZpbHRybyBw
YXJhIGV2aXRhciBDcm9zcy1TaXRlIFNjcmlwdGluZyAjDQojIHZlcnNpb246IDAuNSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAjDQojIFJlY2liZSBkb3MgcGFyYW1ldHJvczogICAgICAgICAg
ICAgICAgICAjDQojICBFbCAxcm86IHN0cmluZyBvIGFycmVnbG8gZGUgc3RyaW5nLiAgICAjDQoj
ICBFbCAyZG86IHNpIGVsIHRleHRvIHByb3ZpZW5lIGRlOiAgICAgICAjDQojICAgUE9TVC9HRVQv
Q09PS0lFL2FyY2hpdm8vY29uc3VsdGEgU1FMLiAjDQojIFJldG9ybmEgdW5hIGNvcGlhIGZpbHRy
YWRhLiAgICAgICAgICAgICAjDQojIEF1dG9yOiAweDAzMDkgICAgICAgICAgICAgICAgICAgICAg
ICAgICAjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpmdW5j
dGlvbiBhbnRpQ3Jvc3NTaXRlU2NyaXB0aW5nKCR0ZXh0LCAkaW5wdXQgPSB0cnVlKQ0Kew0KICAg
IGlmIChpc19zdHJpbmcoJHRleHQpKSB7DQogICAgICAgIGlmICgkaW5wdXQpDQogICAgICAgIHsN
CiAgICAgICAgICAgIGxpbXBpYUJhY2tTbGFzaGVzSW52b2x1bnRhcmlvcygkdGV4dCk7DQogICAg
ICAgIH0NCiAgICAgICAgJHRleHQgPSBodG1sZW50aXRpZXMoJHRleHQsIEVOVF9RVU9URVMsICdV
VEYtOCcpOw0KICAgIH0gZWxzZWlmIChpc19hcnJheSgkdGV4dCkpIHsNCiAgICAgICAgJGEgPSBh
cnJheSgpOw0KICAgICAgICB3aGlsZShsaXN0KCRrZXksICR2YWx1ZSkgPSBlYWNoKCR0ZXh0KSkg
ew0KICAgICAgICAgICAgJGFbJGtleV0gPSBhbnRpQ3Jvc3NTaXRlU2NyaXB0aW5nKCR2YWx1ZSwg
JGlucHV0KTsNCiAgICAgICAgfQ0KICAgICAgICAkdGV4dCA9ICRhOw0KICAgIH0NCiAgICByZXR1
cm4gJHRleHQ7DQp9DQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjDQojIEZ1bmNpb24gcXVlIGVsaW1pbmEgbG9zIGJhY2tzbGFzaGVzICAgICAgIw0KIyBhZ3Jl
Z2Fkb3MgcG9yIHBocCBzaSBzZSB1c2EgbWFnaWNfcXVvdGVzICMNCiMgdmVyc2lvbjogMC4yICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAjDQojIFJlY2liZSB1biBzdHJpbmcgeSBsZSBxdWl0
YSBiYWNrc2xhc2hlcyAgIw0KIyAgcHJvZHVjaWRvcyBwb3IgbWFnaWNfcXVvdGVzICAgICAgICAg
ICAgICMNCiMgQXV0b3I6IDB4MDMwOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjDQojIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KZnVuY3Rpb24gbGltcGlh
QmFja1NsYXNoZXNJbnZvbHVudGFyaW9zKCYkdGV4dCkNCnsNCiAgICBpZiAoZ2V0X21hZ2ljX3F1
b3Rlc19ncGMoKQ0KICAgICAgICAgfHwgZ2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKCkgKSB7DQog
ICAgICAgICR0ZXh0ID0gc3RyaXBzbGFzaGVzKCR0ZXh0KTsNCiAgICB9DQp9DQoNCj8+DQo=


Un ejemplo de uso:

echo antiCrossSiteScripting( antiSQLInjection( $_GET['txt'], true ), false );
//en este caso el segundo parametro de antiCrossSiteScripting es false porque la entrada fue limpiada por antiSQLInjection.
//El segundo parametro de antiSQLInjection es true porque se usará hipóteticamente con LIKE por eso los carácteres % y _ serán escapados.

produce cuando:
?txt=O'reilly%_

O\'reilly\%\_