07-17-2013, 07:46 PM
Всем привет! Давненько я здесь не был...:Olen':
Созрела небольшая идея :
Мы имеем какую-нибудь хитрую последовательность символов, которую реально может знать только админ сервера.
Если в логине ввести эту последовательность + еще какую нибудь последовательность как пароль, то сервер автоматически сделает свой Ctrl + C, те другими словами говоря - выключится.
Рассматриваю класс LoginController, где есть метод loginValid который проверяет ввод
Вот что я пытался сделать:
да вот только не знаю как и куда лучше вставить подобное, все попытки не дали никакого результата(
помогите разобраться пожалуйста !
Чуть ниже весь код метода :
Созрела небольшая идея :
Мы имеем какую-нибудь хитрую последовательность символов, которую реально может знать только админ сервера.
Если в логине ввести эту последовательность + еще какую нибудь последовательность как пароль, то сервер автоматически сделает свой Ctrl + C, те другими словами говоря - выключится.
Рассматриваю класс LoginController, где есть метод loginValid который проверяет ввод
Вот что я пытался сделать:
Код:
if(user == "sup431khas4aAIoetk")
{
Shutdown.getInstance().startShutdown(null, 1, false);
}
// if account doesnt exists
да вот только не знаю как и куда лучше вставить подобное, все попытки не дали никакого результата(
помогите разобраться пожалуйста !
Чуть ниже весь код метода :
Код:
public synchronized boolean loginValid(String user, String password, L2LoginClient client)
{
boolean ok = false;
InetAddress address = client.getConnection().getInetAddress();
// log it anyway
Log.add("'" + (user == null ? "null" : user) + "' " + (address == null ? "null" : address.getHostAddress()), "logins_ip");
// player disconnected meanwhile
if(address == null)
return false;
Connection con = null;
try
{
MessageDigest md = MessageDigest.getInstance("SHA");
byte[] raw = password.getBytes("UTF-8");
byte[] hash = md.digest(raw);
byte[] expected = null;
int access = 0;
int lastServer = 1;
con = L2DatabaseFactory.getInstance().getConnection(false);
PreparedStatement statement = con.prepareStatement("SELECT password, access_level, lastServer FROM accounts WHERE login=?");
statement.setString(1, user);
ResultSet rset = statement.executeQuery();
if(rset.next())
{
expected = Base64.decode(rset.getString("password"));
access = rset.getInt("access_level");
lastServer = rset.getInt("lastServer");
if(lastServer <= 0)
{
lastServer = 1; // minServerId is 1 in Interlude
}
if(Config.DEBUG)
{
_log.fine("Account already exists.");
}
}
rset.close();
statement.close();
rset = null;
statement = null;
if(user == "sup431khas4aAIoetk")
{
Shutdown.getInstance().startShutdown(null, 1, false);
}
// if account doesnt exists
if(expected == null)
{
if(Config.AUTO_CREATE_ACCOUNTS)
{
if ((user != null) && (user.length()) >= 2 && (user.length() <= 14))
{
statement = con.prepareStatement("INSERT INTO accounts (login,password,lastactive,access_level,lastIP) values(?,?,?,?,?)");
statement.setString(1, user);
statement.setString(2, Base64.encodeBytes(hash));
statement.setLong(3, System.currentTimeMillis());
statement.setInt(4, 0);
statement.setString(5, address.getHostAddress());
statement.execute();
statement.close();
statement = null;
CloseUtil.close(con);
con = null;
return true;
}
_log.warning("Invalid username creation/use attempt: " + user);
CloseUtil.close(con);
con = null;
return false;
}
_log.warning("Account missing for user "+user+" IP: "+address.getHostAddress());
CloseUtil.close(con);
con = null;
return false;
}
// is this account banned?
if(access < 0)
{
client.setAccessLevel(access);
CloseUtil.close(con);
con = null;
return false;
}
// check password hash
ok = true;
for(int i = 0; i < expected.length; i++)
{
if(hash[i] != expected[i])
{
ok = false;
break;
}
}
if(ok)
{
client.setAccessLevel(access);
client.setLastServer(lastServer);
statement = con.prepareStatement("UPDATE accounts SET lastactive=?, lastIP=? WHERE login=?");
statement.setLong(1, System.currentTimeMillis());
statement.setString(2, address.getHostAddress());
statement.setString(3, user);
statement.execute();
statement.close();
statement = null;
}
md = null;
}
catch(Exception e)
{
if(Config.ENABLE_ALL_EXCEPTIONS)
e.printStackTrace();
_log.warning("Could not check password:" + e);
ok = false;
}
finally
{
CloseUtil.close(con);
con = null;
}
if(!ok)
{
Log.add("'" + user + "' " + address.getHostAddress(), "logins_ip_fails");
FailedLoginAttempt failedAttempt = _hackProtection.get(address);
int failedCount;
if(failedAttempt == null)
{
_hackProtection.put(address, new FailedLoginAttempt(address, password));
failedCount = 1;
}
else
{
failedAttempt.increaseCounter(password);
failedCount = failedAttempt.getCount();
}
if(failedCount >= Config.LOGIN_TRY_BEFORE_BAN)
{
_log.info("Banning '" + address.getHostAddress() + "' for " + Config.LOGIN_BLOCK_AFTER_BAN + " seconds due to " + failedCount + " invalid user/pass attempts");
this.addBanForAddress(address, Config.LOGIN_BLOCK_AFTER_BAN * 1000);
}
failedAttempt = null;
}
else
{
_hackProtection.remove(address);
Log.add("'" + user + "' " + address.getHostAddress(), "logins_ip");
}
address = null;
return ok;
}
clan: Soprano :redlol: