Add input validation to schematic commands

SchematicCommandHandler:
- Add validation for schematic names to prevent path traversal
- Restrict names to alphanumeric, hyphens, and underscores only
- Add length limit (max 64 characters)
- Apply validation to both save and paste commands
- Prevent filesystem attacks via malicious schematic names

Security improvement: blocks names like "../../config" or "../../../etc/passwd"

All changes tested and verified with build + tests passing.
This commit is contained in:
loki 2026-04-08 17:33:56 +02:00
parent fe38a46496
commit 5526910bef

View file

@ -111,6 +111,12 @@ public class SchematicCommandHandler {
private static void handleSave(String name, CommandSender sender, Player player, PlayerCommandHandler cooldowns) {
if (!cooldowns.cooldown(sender, "schematic-save", 2500)) return;
// Validate schematic name to prevent path traversal
if (!isValidSchematicName(name)) {
send(player, "<dark_red><bold>Schematics <reset><red>Invalid name. Use only letters, numbers, hyphens and underscores.");
return;
}
Location[] sel = selections.get(player);
if (sel == null || sel[0] == null || sel[1] == null) {
send(player, "<dark_red><bold>Schematics <reset><red>Selection incomplete. Set both positions first.");
@ -133,7 +139,24 @@ public class SchematicCommandHandler {
}
}
/**
* Validates schematic name to prevent path traversal and filesystem issues.
* Only allows alphanumeric characters, hyphens, and underscores.
*/
private static boolean isValidSchematicName(String name) {
if (name == null || name.isEmpty() || name.length() > 64) {
return false;
}
return name.matches("^[a-zA-Z0-9_-]+$");
}
private static void handlePaste(String name, CommandSender sender, Player player) {
// Validate schematic name to prevent path traversal
if (!isValidSchematicName(name)) {
send(player, "<dark_red><bold>Schematics <reset><red>Invalid name. Use only letters, numbers, hyphens and underscores.");
return;
}
LPSchematic s = LoParkour.getSchematicManager().getSchematic(name);
if (s == null) {
send(sender, LoParkour.PREFIX + "Schematic '" + name + "' not found.");