Though I haven't implemented anything yet, I have been giving this some thought for a project where extreme customizable player models is a key design goal. The best answer I've come up with so far is to require everyone to select a premade skin, then have a default-to-off checkbox in the options to allow custom skins with a confirmation popup that says "WARNING! Downloading custom user skins may cause slightly increased loading times. They cannot be moderated and may contain adult or copyrighted material." The skin select screen then adds a second copy of the character showing the custom skin you select beside the standard one that everyone with the option unchecked will see.
Then have the server pass IP addresses to let the player's custom skin be sent directly from their client to other clients rather than through the server or ever being on server-side storage, where it then gets applied by the client based on model and user name. (Or skin name? That requires a registry of skin names on the server, but also lets multiple players use the custom skin if they want to without taking up more storage/VRAM/load time.) To keep from building up a colossal backlog of old skins, keep track of a date the skin was last used and run a cleanup routine as part of end-of-session shutdown that deletes any that are past a certain age, or the oldest past a user-specified total amount of storage used.
If that doesn't satisfy the legal requirements maybe a second, helper application (like mod manager apps) that talks to the clients but not the server once the IPs are exchanged to further shift any legal liability from the game developer/studio to the users trading skins. If that's still not enough (I haven't even looked at that yet myself, let alone asked an actual legal professional) then modifying premade texture colors with a shader is the best alternative I have so far. I've seen a tutorial for using a gradient map this way on 2d sprites, but I'm not sure if there's an equivalent method in 3D.