Digamos las técnicas de limpieza que son usadas para evitar ataques XSS, ¿sería conveniente usarlas tanto cuando se obtienen los datos de un formulario y hay que guardarlos en la base de datos como también cuando esos datos que están en la base de datos son solicitados y mostrados (echo)?
(https://i.ibb.co/SctYdyv/ijfoasdfjasdfjasdfasdf.png)
El concenso general es que el escape se debe hacer si o si justo cuando se va a imprimir.. porque de lo contrario, te estas fiando de que el dato almacenado en la base de datos esta limpio. Si en algun momento conectas una API a la BD por otra via o haces un endpoint y te olvidas de limpiarlo, estas jodido.
Además, se prefiere almacenar un dato raw porque el escape o la limpieza puede romper el dato original. Eso si, eso no quiere decir que tengas que almacenar todo tal y como te viene. Un nombre de usuario o un correo electronico deben ser filtrados/escpados/limpiados antes de almacenarse... y si o si, deben ser escapados antes de mostrarse, pero imaginate que tienes una sección donde el usuario escribe articulos y los escapas "prematuramente", en el futuro, todos esos specialchars te pueden traer problemas para portarlos a otro formato que no sea html.
En fin,
Escapar/Limpiar antes de imprimir: Siempre.
Limpiar antes de guardar: Cuando haga falta.
Saludos
solamente cuando expulso en el html?
es decir, digamos que tengo una función X de javascript que recibirá como parametro una variable PHP, ahí también debo limpiarlo?
Lo que dice #!drvy es totalmente correcto. En respuesta a tu última pregunta (y parafraseando a #!drvy) si, debes limpiarlo siempre de salida.