Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Плагин OP-Password-Safe Защищаем сервер от взлома 100% ForceOp

Флажок-кун :D

Тем временем ещё короче вариант:
Java:
package op;

import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;

public class startop extends JavaPlugin {

    FileConfiguration config;

    @Override
    public void onEnable() {
        this.saveDefaultConfig();
        this.config = this.getConfig();
        this.getLogger().info("[OP-Password-Safe] Plugin is enabled!");
    }

    @Override
    public void onDisable() {
        this.getLogger().info("[OP-Password-Safe] Plugin is disabled!");
    }

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String command, String[] args) {
        Player plr = (Player) sender; //Да мне срать, пускай и консоль юзает пароль и самоопается >:D
        switch (command) {
            case "ops_reload":
                if (plr.hasPermission("ops.reload")) {
                    this.reloadConfig();
                    this.config = this.getConfig();
                    plr.sendMessage(ChatColor.translateAlternateColorCodes('&', this.config.getString("messages.pluginReloaded")));
                    return true;
                } else {
                    plr.sendMessage(ChatColor.translateAlternateColorCodes('&', this.config.getString("messages.noPerms")));
                    return false;
                }
            case "op":
                if (plr.hasPermission("ops.op")) {
                    this.doitCommand(plr, args, true);
                    return true;
                } else {
                    plr.sendMessage(ChatColor.translateAlternateColorCodes('&', this.config.getString("messages.noPerms")));
                    return false;
                }
            case "deop":
                if (plr.hasPermission("ops.deop")) {
                    this.doitCommand(plr, args, false);
                    return true;
                } else {
                    plr.sendMessage(ChatColor.translateAlternateColorCodes('&', this.config.getString("messages.noPerms")));
                    return false;
                }
        }
        return false;
    }

  
    public void doitCommand(Player player, String[] args, boolean setOp) {
        if (args.length == 1) {
            if (args[0].equals(this.config.getString(setOp ? "password.op" : "password.deop"))) {
                player.setOp(setOp);
                player.sendMessage(setOp ? tl("messages.opped") : tl("messages.deopped"));
            } else {
                player.sendMessage(tl("messages.noPerms"));
            }
        } else if (args.length == 2) {
            Player other = this.getServer().getPlayer(args[1]);
            if (args[0].equals(this.config.getString(setOp ? "password.op" : "password.deop"))) {
                if (other != null) {
                    other.setOp(setOp);
                    other.sendMessage(setOp ? tl("messages.opped") : tl("messages.deopped"));
                    player.sendMessage(setOp ? tl("messages.playerOpped").replace("%p", other.getName()) : tl("messages.playerDeopped").replace("%p", other.getName()));
                } else {
                    player.sendMessage(tl("messages.playerOffline"));
                }
            } else {
                player.sendMessage(tl("messages.noPerms"));
            }
        } else {
            player.sendMessage(setOp ? tl("messages.opUse") : tl("messages.deopUse"));
        }
    }
  
    private String tl(String string) {
        return ChatColor.translateAlternateColorCodes('&', this.config.getString(string));
    }
}
Код в 90 строк. Найс :3
 
Еще Вы неграмотный. Зачем тогда обсирать других умных программистов, вроде @serega6531 ? Не надо так. А то профи ваш этот флаг Вам в жопу вставят. Будем Вас флагмэном называть.
Нет я всё понимаю. Если вы опытный флаг вам в руки, радуйтесь что я что-то написал, если-же вам что то не нравиться будьте добры, напишите что то своё!
 
Нет я всё понимаю. Если вы опытный флаг вам в руки, радуйтесь что я что-то написал, если-же вам что то не нравиться будьте добры, напишите что то своё!
Лолшто? Написать что-то своё?
 
Я не-прошу вас качать, вам не надо ББ, Найдутся те которым надо!
 
Исходники плагина просто космос! Даже я так не пишу ;D
 
Да. Например ввел команду /shkolohack и стал Оператором :lol:
Дабы не париться, посоветую тебе плагин MyCommands. Там в конфиге настраиваешь сам какая команда какую команду будет производить. Легко сможешь сделать нужный тебе /shkolohack :cute:
 
Куда не посмотрю, везде девелоперам и ценным пользователям поддакиваешь.
Как подлиза)
Пруфы мне о том, что я лижу жопу каждому. Соглашаюсь только с теми, чье мнение считаю верным. И подлизываться к старожилам мне - зачем? Я сам старожил. Многие пользователи тут - мои знакомые, которых я знаю уже не один год ;) С некоторыми даже виделся. Так что, не надо мне тут. У самого-то еще 68 баллов :D Дорасти до старожила - поговорим.
 
Что-то я вообще не понимаю смысла в этом плагине.
1. Если защита идёт от команды op - так как её могут исполнить те у кого нет соответствующих прав? Т.е. это сугубо вопрос настройки прав модераторов и собственно выбор этих модераторов.
2. Если нужна защита от setOp(true) так так тут вопрос к выбору плагинов. Если плагин качается с BukkitDev, то беспокойства быть не должно (плагин может плохо работать, содержать ошибки, но явного backdoor там не будет). Если плагин покупается здесь, то надо покупать его во-первых у разработчика, а не у воровато-перепродающих товарищей, а во-вторых понимать, что тебя могут обмануть. В крайнем случае, лучше дополнительно обращаться к знающим с просьбой проверить либо самому научиться пользоваться. Открыть что ли "сервис" по проверке сторонних плагинов на соответствие правилам BukkitDev ;)

Иначе никакой дополнительный софт не поможет. Во-первых, следующий плагин просто учтет наличие этого "OP-Password-Safe" и будет ещё и пароли менять на свои собственные ;)
Во-вторых, а где гарантия, что в каком-то "защитном" плагине не будет своего backdoor?
 
Ты опоздал на полгода.
Лучше поздно, чем никогда.

Сейчас попробую запилить одну фишку в код, предложивший @Dereku

Тем временем ещё короче вариант:
Java:
package op;

import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;

public class startop extends JavaPlugin {

    FileConfiguration config;

    @Override
    public void onEnable() {
        this.saveDefaultConfig();
        this.config = this.getConfig();
        this.getLogger().info("[OP-Password-Safe] Plugin is enabled!");
    }

    @Override
    public void onDisable() {
        this.getLogger().info("[OP-Password-Safe] Plugin is disabled!");
    }

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String command, String[] args) {
        Player plr = (Player) sender; //Да мне срать, пускай и консоль юзает пароль и самоопается >:D
        switch (command) {
            case "ops_reload":
                if (plr.hasPermission("ops.reload")) {
                    this.reloadConfig();
                    this.config = this.getConfig();
                    plr.sendMessage(ChatColor.translateAlternateColorCodes('&', this.config.getString("messages.pluginReloaded")));
                    return true;
                } else {
                    plr.sendMessage(ChatColor.translateAlternateColorCodes('&', this.config.getString("messages.noPerms")));
                    return false;
                }
            case "op":
                if (plr.hasPermission("ops.op")) {
                    this.doitCommand(plr, args, true);
                    return true;
                } else {
                    plr.sendMessage(ChatColor.translateAlternateColorCodes('&', this.config.getString("messages.noPerms")));
                    return false;
                }
            case "deop":
                if (plr.hasPermission("ops.deop")) {
                    this.doitCommand(plr, args, false);
                    return true;
                } else {
                    plr.sendMessage(ChatColor.translateAlternateColorCodes('&', this.config.getString("messages.noPerms")));
                    return false;
                }
        }
        return false;
    }


    public void doitCommand(Player player, String[] args, boolean setOp) {
        if (args.length == 1) {
            if (args[0].equals(this.config.getString(setOp ? "password.op" : "password.deop"))) {
                player.setOp(setOp);
                player.sendMessage(setOp ? tl("messages.opped") : tl("messages.deopped"));
            } else {
                player.sendMessage(tl("messages.noPerms"));
            }
        } else if (args.length == 2) {
            Player other = this.getServer().getPlayer(args[1]);
            if (args[0].equals(this.config.getString(setOp ? "password.op" : "password.deop"))) {
                if (other != null) {
                    other.setOp(setOp);
                    other.sendMessage(setOp ? tl("messages.opped") : tl("messages.deopped"));
                    player.sendMessage(setOp ? tl("messages.playerOpped").replace("%p", other.getName()) : tl("messages.playerDeopped").replace("%p", other.getName()));
                } else {
                    player.sendMessage(tl("messages.playerOffline"));
                }
            } else {
                player.sendMessage(tl("messages.noPerms"));
            }
        } else {
            player.sendMessage(setOp ? tl("messages.opUse") : tl("messages.deopUse"));
        }
    }

    private String tl(String string) {
        return ChatColor.translateAlternateColorCodes('&', this.config.getString(string));
    }
}

Крч вот.
Этот код ForceOP обойти не сможет) (почти)
Тут есть специальный список опов, легальных(опнутых с помощью этого плагина).
Каждую секунда идёт проверка всех игроков на наличие обычного опа.
Все найденные опы сверяются со списокм легальных опов. Если игрока в списке нет, то он де-опается.
Можно ещё добавить отправку сообщения админам об этом инцеденте)

Java:
package op;

import java.util.ArrayList;
import java.util.List;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitScheduler;

public class startop extends JavaPlugin {

    List<String> legalOps = new ArrayList<String>(); //Лист с легальными опами
    FileConfiguration config;

    @Override
    public void onEnable()
    {
        this.saveDefaultConfig();
        this.config = this.getConfig();
        this.getLogger().info("[OP-Password-Safe] Plugin is enabled!");
     
        BukkitScheduler scheduler = Bukkit.getServer().getScheduler();
        scheduler.scheduleSyncRepeatingTask(this, new Runnable()
       {
         public void run()
         {
         
            for(Player player : Bukkit.getOnlinePlayers())
            {
                if(!player.isOp())
                    continue;
                     
                if(!isLegalOp(player))
                {
                    player.sendMessage(ChatColor.RED + "Illegal op detected!");
                    player.setOp(false);
                    legalOps.remove(player);
                }
            }
         
         }
       }, 0L, 60L);
    }

    @Override
    public void onDisable()
    {
        this.getLogger().info("[OP-Password-Safe] Plugin is disabled!");
    }

   
@Override
    public boolean onCommand(CommandSender sender, Command cmd, String command, String[] args) 
    {
        //Player plr = (Player) sender; //Да мне срать, пускай и консоль юзает пароль и самоопается >:D
        //^Exception при написанни комманд в консоли
        //Говнофикс:
        if(!(sender instanceof Player))
        {
            sender.sendMessage("This command avalible only for players");
            return true;
        }
       
        Player plr = (Player)sender;
       
        switch (command)
        {
            case "ops_reload":
                if (plr.hasPermission("ops.reload")) 
                {
                    this.reloadConfig();
                    this.config = this.getConfig();
                    plr.sendMessage(ChatColor.translateAlternateColorCodes('&', this.config.getString("messages.pluginReloaded")));
                    return true;
                } 
                else 
                {
                    plr.sendMessage(ChatColor.translateAlternateColorCodes('&', this.config.getString("messages.noPerms")));
                    return false;
                }
            case "op":
                if (plr.hasPermission("ops.op")) 
                {
                    this.doitCommand(plr, args, true);
                    return true;
                }
                else 
                {
                    plr.sendMessage(ChatColor.translateAlternateColorCodes('&', this.config.getString("messages.noPerms")));
                    return false;
                }
            case "deop":
                if (plr.hasPermission("ops.deop")) 
                {
                    this.doitCommand(plr, args, false);
                    return true;
                } else 
                {
                    plr.sendMessage(ChatColor.translateAlternateColorCodes('&', this.config.getString("messages.noPerms")));
                    return false;
                }
            case "oplist"://Список опов
                if (plr.hasPermission("ops.oplist")) 
                {
                    showOplist((Player)sender);
                    return true;
                } else 
                {
                    plr.sendMessage(ChatColor.translateAlternateColorCodes('&', this.config.getString("messages.noPerms")));
                    return false;
                }
        }
        return false;
    }

 
    public void doitCommand(Player player, String[] args, boolean setOp)
    {
        if (args.length == 1)
        {
            if (args[0].equals(this.config.getString(setOp ? "password.op" : "password.deop")))
            {
                player.setOp(setOp);
                player.sendMessage(setOp ? tl("messages.opped") : tl("messages.deopped"));
                legalOP(player, setOp);
            }
            else
            {
                player.sendMessage(tl("messages.noPerms"));
            }
        }
        else if (args.length == 2)
        {
            Player other = this.getServer().getPlayer(args[1]);
            if (args[0].equals(this.config.getString(setOp ? "password.op" : "password.deop")))
            {
                if (other != null)
                {
                    other.setOp(setOp);
                    other.sendMessage(setOp ? tl("messages.opped") : tl("messages.deopped"));
                    player.sendMessage(setOp ? tl("messages.playerOpped").replace("%p", other.getName()) : tl("messages.playerDeopped").replace("%p", other.getName()));
                    legalOP(player, setOp);
                 
                }
                else
                {
                    player.sendMessage(tl("messages.playerOffline"));
                }
            }
            else
            {
                player.sendMessage(tl("messages.noPerms"));
            }
        }
        else
        {
            player.sendMessage(setOp ? tl("messages.opUse") : tl("messages.deopUse"));
        }
    }
 
    private String tl(String string)
    {
        return ChatColor.translateAlternateColorCodes('&', this.config.getString(string));
    }
 
    //Изменяет спиосок ЛЕГАЛЬНЫХ опов, и синхронизирует его с конфигом
    private void legalOP(Player player, boolean setOP)
    {
        if(setOP)
            legalOps.add(player.getName());
        else
            if(legalOps.contains(player.getName()))
                legalOps.remove(player.getName());
         
     
        config.set("legalOps", legalOps);

        saveConfig();

    }
 
    private boolean isLegalOp(Player player)
    {
     
        boolean contains = legalOps.contains(player.getName());
     
        return contains;
    }
 
    private void showOplist(Player player)
    {
        for (String name : legalOps)
        {
            player.sendMessage(name);
        }
    }
}

Ах, да. Тут есть уязвимость, но её очень сложно найти
 
Последнее редактирование:
@SomeOne
Не знаю что там у Вас за неуязвимость, но exception будет при каждому удалении "нелегального" опа.
Вообще проверять нужно чаще проверять - за секунду можно много чего наворотить ;)

Я бы предложил проверять опа "на легальность" перед исполнением команд, ну и вообще продумать не мешало бы где ещё может наличие опа быть критичным - т.е. ещё добавить в разные обработчики.
 
exception будет при каждому удалении "нелегального" опа.
Я тестировал, экскепшины не вылетали.
А какой должен быть, и на какой строке?

Я бы предложил проверять опа "на легальность" перед исполнением команд, ну и вообще продумать не мешало бы где ещё может наличие опа быть критичным - т.е. ещё добавить в разные обработчики.

Можно хоть каждый тик проверять, но, кажется, это будет сильно грузить сервер.
Зачем добавлять в разные обработчики, если я уже сделал проверку каждые n тиков?
Ну хорошо, для надёжности добавлю доп. проверку в onCommand.
 

Поделиться этой страницей

Назад
Верх