mysql_real_escape_string le agrega slashes a un parametro que estes pasando ej:
http:// ejemplo.com/?usuario=ccsaiKo
uno cuando recibe el parametro
usuario muestra informacion relevante respecto a ese usuario y envia una consulta a una base de datos algo asi:
select * from usuarios where user_name='
ccsaiKo'
pero que pasa si uno modifica la url y pone algo como esto:
http:// ejemplo.com/?usuario=ccsaiKo' or ''='
la consulta te quedaria algo asi:
select * from usuarios where user_name='
ccsaiKo' or ''=''
y traerias toda la informacion de todos los usuarios.
con mysql_real_scape_string agregas slashes a un parametro(cuando se agrega un slash le dices que es literal)
tu consulta quedaria asi:
select * from usuarios where user_name='
ccsaiKo' or \'\'=\''
asi ahora buscara un usuario que se llame:
ccsaiKo' or ''='
ahora si envias una consulta de un numero a tu base de datos debes comprobar que el dato que recibes sea realmente un numero.
con respecto a XSS se usa en chat o en comentarios(como este por ejemplo).
XSS solo afecta al cliente y no es para robar datos del servidor como si lo es una inyeccion sql.
cuando uno envia un comentario a una base de datos despues actualizas la pagina y aparece ese comentario pero que pasa si yo envie el siguiente comentario:
<script>window.location='http://www.ejemplo.com'</script>
cuando cargue la pagina me va a mostrar ese comentario pero el navegador interpreta ese comentario como un script y te transfiere a la pagina ejemplo.com. para evitar ataques XSS debes transfornar el comentario al momento de imprimirlo. Yo uso la funcion
htmlspecialchars para transformar el texto(
http://php.net/manual/es/function.htmlspecialchars.php )
y quedaria haci el texto anterior
<script>window.location='http://www.ejemplo.com'</script>
y el navegador lo interpreta pero no como script sino como texto y te lo imprime como texto.