Простой способ сделать это должно было бы обеспечить криптографический хеш Вашего значения highscore наряду со счетом это сам. Например, когда регистрация результатов через HTTP ДОБИРАЕТСЯ: http://example.com/highscores.php?score=500&checksum=0a16df3dc0301a36a34f9065c3ff8095
При вычислении этой контрольной суммы, общий секрет должен использоваться; этот секрет никогда не должен передаваться по сети, но должен быть трудно кодирован и в бэкенде PHP и во флэш-памяти frontend. Контрольная сумма выше была создана путем предварительного ожидания строки" секрет " к счету" 500 " и выполнения его через md5sum.
, Хотя эта система будет препятствовать тому, чтобы пользователь отправил произвольные очки, она не предотвращает "атаку с повторением пакетов", где пользователь повторно отправляет ранее расчетный счет и комбинацию хеша. В примере выше, счет 500 всегда производил бы ту же строку хеша. Часть этого риска может быть снижена путем слияния большей информации (такой как имя пользователя, метка времени или IP-адрес) в строке, которая должна быть хеширована. Хотя это не предотвратит воспроизведение данных, оно обеспечит, чтобы ряд данных был только допустим для отдельного пользователя в единственное время.
Для предотвращения любой атаки с повторением пакетов от появления некоторый тип системы ответа проблемы должен будет быть создан, такие как следующее:
имейте в виду, что безопасность любого из вышеупомянутых методов поставилась под угрозу, если общий секрет когда-либо доступен для пользователя
Как альтернатива, части этого назад и вперед можно было избежать, вынудив клиент связаться с сервером по HTTPS и обеспечив, чтобы клиент был предварительно сконфигурирован для доверия только сертификатам, подписанным определенным центром сертификации, к которому у Вас один есть доступ.
Потому что исключение не остается неперехваченным.
Поток, который создает ваша ThreadFactory, не получает напрямую Runnable или Callable. Вместо, Runnable, который вы получаете, является внутренним классом Worker, например, см. ThreadPoolExecutor $ Worker. Попробуйте использовать System.out.println ()
в Runnable, заданном для newThread в вашем примере.
Этот Worker перехватывает любые RuntimeExceptions из отправленного вами задания.
Вы можете получить исключение в ThreadPoolExecutor # метод afterExecute .
Я просто просмотрел свои старые вопросы и подумал, что могу поделиться реализованным мной решением, если оно кому-то поможет (или я пропустил ошибку).
import java.lang.Thread.UncaughtExceptionHandler;
import java.util.concurrent.Callable;
import java.util.concurrent.Delayed;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.FutureTask;
import java.util.concurrent.RunnableScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
/**
* @author Mike Herzog, 2009
*/
public class ExceptionHandlingExecuterService extends ScheduledThreadPoolExecutor {
/** My ExceptionHandler */
private final UncaughtExceptionHandler exceptionHandler;
/**
* Encapsulating a task and enable exception handling.
* <p>
* <i>NB:</i> We need this since {@link ExecutorService}s ignore the
* {@link UncaughtExceptionHandler} of the {@link ThreadFactory}.
*
* @param <V> The result type returned by this FutureTask's get method.
*/
private class ExceptionHandlingFutureTask<V> extends FutureTask<V> implements RunnableScheduledFuture<V> {
/** Encapsulated Task */
private final RunnableScheduledFuture<V> task;
/**
* Encapsulate a {@link Callable}.
*
* @param callable
* @param task
*/
public ExceptionHandlingFutureTask(Callable<V> callable, RunnableScheduledFuture<V> task) {
super(callable);
this.task = task;
}
/**
* Encapsulate a {@link Runnable}.
*
* @param runnable
* @param result
* @param task
*/
public ExceptionHandlingFutureTask(Runnable runnable, RunnableScheduledFuture<V> task) {
super(runnable, null);
this.task = task;
}
/*
* (non-Javadoc)
* @see java.util.concurrent.FutureTask#done() The actual exception
* handling magic.
*/
@Override
protected void done() {
// super.done(); // does nothing
try {
get();
} catch (ExecutionException e) {
if (exceptionHandler != null) {
exceptionHandler.uncaughtException(null, e.getCause());
}
} catch (Exception e) {
// never mind cancelation or interruption...
}
}
@Override
public boolean isPeriodic() {
return this.task.isPeriodic();
}
@Override
public long getDelay(TimeUnit unit) {
return task.getDelay(unit);
}
@Override
public int compareTo(Delayed other) {
return task.compareTo(other);
}
}
/**
* @param corePoolSize The number of threads to keep in the pool, even if
* they are idle.
* @param eh Receiver for unhandled exceptions. <i>NB:</i> The thread
* reference will always be <code>null</code>.
*/
public ExceptionHandlingExecuterService(int corePoolSize, UncaughtExceptionHandler eh) {
super(corePoolSize);
this.exceptionHandler = eh;
}
@Override
protected <V> RunnableScheduledFuture<V> decorateTask(Callable<V> callable, RunnableScheduledFuture<V> task) {
return new ExceptionHandlingFutureTask<V>(callable, task);
}
@Override
protected <V> RunnableScheduledFuture<V> decorateTask(Runnable runnable, RunnableScheduledFuture<V> task) {
return new ExceptionHandlingFutureTask<V>(runnable, task);
}
}