Identificación del usuario: problema con tx.origin
Clase 3 de 15 • Curso de Introducción a Seguridad de Smart Contracts
Resumen
Ya viste algunas buenas prácticas al desarrollar contratos inteligentes. Ahora, es frecuente la necesidad de validar los permisos del usuario y para esto se utiliza la dirección de la billetera que emitió la transacción. Hay que tener algunas precauciones al realizar esta identificación.
Cómo realizar la identificación del usuario en smart contracts
Solidity permite la captura de la dirección del contrato que hizo la transacción y posteriormente se utiliza este dato para identificar al usuario.
Utilizamos msg.sender
para obtener el dato, pero el lenguaje también cuenta con la variable global tx.origin
que dependiendo la circunstancia devuelve la misma información.
msg.sender
= Emisor del mensajetx.origin
= Origen de la transacción
A simple vista, pueden parecer exactamente iguales ambas variables, ya que a la hora de hacer una transferencia de cuenta a cuenta van a devolver el mismo valor. ¿Pero qué pasa si quién realiza la transacción es otro contrato inteligente? Aquí es donde los valores de msg.sender
y tx.origin
van a diferir.
Esta vulnerabilidad de seguridad puede explotarse realizando transacciones al contrato, desde otro contrato. Al cambiar el valor de tx.origin
, el atacante puede acceder a partes de la lógica del contrato que no le corresponde.

En conclusión, se debe tener precaución cuando se utiliza tx.origin
para identificar y validar al usuario que emite la transacción. En su lugar, es mejor usar msg.sender
.
Contribución creada por Kevin Fiorentino (Platzi Contributor) con aportes de Mauro Legorburu y Adolfo Sebastián Jara Gavilanes.