Почему UncaughtExceptionHandler не называет ExecutorService?

Простой способ сделать это должно было бы обеспечить криптографический хеш Вашего значения highscore наряду со счетом это сам. Например, когда регистрация результатов через HTTP ДОБИРАЕТСЯ: http://example.com/highscores.php?score=500&checksum=0a16df3dc0301a36a34f9065c3ff8095

При вычислении этой контрольной суммы, общий секрет должен использоваться; этот секрет никогда не должен передаваться по сети, но должен быть трудно кодирован и в бэкенде PHP и во флэш-памяти frontend. Контрольная сумма выше была создана путем предварительного ожидания строки" секрет " к счету" 500 " и выполнения его через md5sum.

, Хотя эта система будет препятствовать тому, чтобы пользователь отправил произвольные очки, она не предотвращает "атаку с повторением пакетов", где пользователь повторно отправляет ранее расчетный счет и комбинацию хеша. В примере выше, счет 500 всегда производил бы ту же строку хеша. Часть этого риска может быть снижена путем слияния большей информации (такой как имя пользователя, метка времени или IP-адрес) в строке, которая должна быть хеширована. Хотя это не предотвратит воспроизведение данных, оно обеспечит, чтобы ряд данных был только допустим для отдельного пользователя в единственное время.

Для предотвращения любой атаки с повторением пакетов от появления некоторый тип системы ответа проблемы должен будет быть создан, такие как следующее:

  1. флеш-игра ("клиент") работает, HTTP ДОБИРАЮТСЯ [1 118] http://example.com/highscores.php без параметров. Эта страница возвращает два значения: случайным образом сгенерированный соль значение и криптографический хеш того соленого значения, объединенного с общим секретом. Это соленое значение должно быть сохранено в локальной базе данных незаконченных запросов и должно связать метку времени с ним так, чтобы это могло "истечь" после, возможно, одна минута.
  2. флеш-игра комбинирует соленое значение с общим секретом и вычисляет хеш, чтобы проверить, что это соответствует тому, обеспеченному сервером. Этот шаг необходим для предотвращения подделки в соленые значения пользователями, поскольку это проверяет, что соленое значение было на самом деле сгенерировано сервером.
  3. флеш-игра комбинирует соленое значение с общим секретом, высоко выиграйте значение и любую другую релевантную информацию (псевдоним, IP, метка времени), и вычисляет хеш. Это тогда передает эту информацию обратно бэкенду PHP через HTTP, ДОБИРАЮТСЯ или POST, наряду с соленым значением, высоким счетом и другой информацией.
  4. сервер комбинирует информацию, полученную таким же образом как на клиенте, и вычисляет хеш, чтобы проверить, что это соответствует тому, обеспеченному клиентом. Это тогда также проверяет, что соленое значение все еще допустимо, как перечислено в незаконченном списке запросов. Если оба этих условия верны, это пишет высокий счет в высокую таблицу счета и возвращает сообщение "успеха" со знаком клиенту. Это также удаляет соленое значение из незаконченного списка запросов.

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

Как альтернатива, части этого назад и вперед можно было избежать, вынудив клиент связаться с сервером по HTTPS и обеспечив, чтобы клиент был предварительно сконфигурирован для доверия только сертификатам, подписанным определенным центром сертификации, к которому у Вас один есть доступ.

55
задан Tomasz Nurkiewicz 26 September 2012 в 22:00
поделиться

2 ответа

Потому что исключение не остается неперехваченным.

Поток, который создает ваша ThreadFactory, не получает напрямую Runnable или Callable. Вместо, Runnable, который вы получаете, является внутренним классом Worker, например, см. ThreadPoolExecutor $ Worker. Попробуйте использовать System.out.println () в Runnable, заданном для newThread в вашем примере.

Этот Worker перехватывает любые RuntimeExceptions из отправленного вами задания.

Вы можете получить исключение в ThreadPoolExecutor # метод afterExecute .

45
ответ дан 7 November 2019 в 07:14
поделиться

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

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);
    }
}
7
ответ дан 7 November 2019 в 07:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: