Форматом даты Oracle по умолчанию является YYYY-MM-DD, ПОЧЕМУ?

Это - классическая проблема с интернет-играми и конкурсами. Ваш код Flash работает с пользователями для решения счета к игре. Но пользователям не доверяют, и код Flash работает на компьютере пользователя. Вы - СОЛЬ. Нет ничего, что можно сделать, чтобы препятствовать тому, чтобы взломщик подделал рекорды:

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

  • Взломщики управляют памятью во время выполнения интерпретатора Flash, так, чтобы любой, кто знает, как использовать программируемый отладчик, мог изменить любую переменную (включая текущий счет) в любое время или изменить саму программу.

самое простое нападение на Вашу систему должно выполнить Трафик HTTP для игры через прокси, поймать высокий счет, сохраняют и воспроизводят его с более высоким счетом.

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

hex-encoding( AES(secret-key-stored-only-on-server, timestamp, user-id, random-number))

(Вы могли также использовать сеансовые куки для того же эффекта).

игровой код отзывается эхом, этот маркер назад к серверу с высоким счетом сохраняют. Но взломщик может все еще просто запустить игру снова, получить маркер, и затем сразу вставить тот маркер в воспроизводимый высокий счет, сохраняют.

Поэтому затем Вы подаете не только маркерные или сеансовые куки, но также и сеансовый ключ высокого шифрования счета. Это будет ключом AES на 128 битов, самим зашифрованным с ключом hardcoded во флеш-игру:

hex-encoding( AES(key-hardcoded-in-flash-game, random-128-bit-key))

Теперь, прежде чем игра отправляет высокий счет, она дешифрует high-score-encrypting-session ключ, который она может сделать потому что Вы hardcoded high-score-encrypting-session-key-decrypting-key в двоичный файл Flash. Вы шифруете высокий счет с этим дешифрованным ключом, наряду с хешем SHA1 высокого счета:

hex-encoding( AES(random-128-bit-key-from-above, high-score, SHA1(high-score)))

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

Поэтому теперь взломщик декомпилирует Ваш код Flash и быстро находит код AES, который терпит как воспаленный ползунок, хотя, даже если бы это не, это было бы разыскано через 15 минут с поиском памяти и трассировщиком ("Я знаю, что мой счет к этой игре 666, поэтому давайте найдем 666 в памяти, затем поймайте любую операцию, которая затрагивает, то значение---, о, смотрят, высокий код шифрования счета!"). С сеансовым ключом взломщик не должен даже выполнять код Flash; она захватывает игровой маркер запуска и сеансовый ключ и может передать произвольный высокий счет обратно.

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

  • Скремблирование ключей AES с операциями "исключающее ИЛИ"

  • Заменяющие ключевые массивы байтов с функциями, которые вычисляют ключ

  • Рассеивающееся поддельное ключевое шифрование и высоко выигрывают регистрации всюду по двоичному файлу.

Это - все главным образом пустая трата времени. Это само собой разумеется, SSL не собирается помогать Вам также; SSL не может защитить Вас, когда одна из двух конечных точек SSL является злой.

Вот некоторые вещи, которые могут на самом деле уменьшить высокое мошенничество со счетом:

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

  • рекорды Отклонения от игровых сессий, которые длятся меньше, чем самые короткие реальные игры, в которые когда-либо играют (для более сложного подхода, попытайтесь "изолировать" рекорды для игровых сессий, которые длятся меньше чем 2 стандартных отклонения ниже средней игровой продолжительности). Удостоверьтесь, что Вы отслеживаете игровую серверную сторону продолжительностей.

  • Отклонение или карантинные рекорды от логинов, которые только играли в игру несколько раз, так, чтобы взломщики произвели "документацию" разумно выглядящей игровой игры для каждого входа в систему, который они создают.

  • очки "Heartbeat" во время игровой игры, так, чтобы Ваш сервер видел рост счета за время жизни одной игровой игры. Отклоните рекорды, которые не следуют за разумными кривыми счета (например, спрыгивая от 0 до 999 999).

  • игра "Снимка" указывает во время игровой игры (например, сумма боеприпасов, положения на уровне, и т.д.), который можно позже согласовать против зарегистрированных временных очков. У Вас не должно даже быть способа обнаружить аномалии в этих данных для запуска с; просто необходимо собрать его, и затем можно возвратиться и проанализировать его, если вещи выглядят подозрительными.

  • Отключают учетную запись любого пользователя, который приводит одну к сбою из Ваших проверок безопасности (например, когда-либо отправляя зашифрованный высокий счет, который приводит проверку к сбою).

Помнят, хотя это Вы только удерживаете высокое мошенничество со счетом здесь. Существует ничто , можно сделать, чтобы предотвратить если. Если существуют деньги на строке в Вашей игре, кто-то собирается победить любую систему, которую Вы придумываете. Цель не к остановка это нападение; это должно сделать нападение более дорогим, чем просто получение действительно хорошего в игре и избиении его.

67
задан entpnerd 16 March 2016 в 23:51
поделиться

7 ответов

Если вы используете этот запрос для создания входного файла для вашего хранилища данных, вам необходимо отформатировать данные соответствующим образом. По сути, в этом случае вы конвертируете дату (которая имеет компонент времени) в строку. Вам необходимо явно отформатировать строку или изменить nls_date_format, чтобы установить значение по умолчанию. В своем запросе вы можете просто ввести:

select to_char(some_date, 'yyyy-mm-dd hh24:mi:ss') my_date
  from some_table;
54
ответ дан 24 November 2019 в 14:27
поделиться

Вы уверены, что не путаете базу данных Oracle с Oracle SQL Developer?

Сама база данных не имеет формата даты, дата поступает из базы данных в необработанном виде. Это зависит от клиентского программного обеспечения, и SQL Developer действительно использует формат YYYY-MM-DD в качестве формата по умолчанию, который почти бесполезен, я согласен.

edit: Как было сказано ниже, SQL Developer можно перенастроить для правильного отображения значений DATE, просто у него неверные значения по умолчанию.

82
ответ дан 24 November 2019 в 14:27
поделиться

Формат ГГГГ-ММ-ДД является частью ISO8601 стандарта для обмена информацией о дате (и времени).

Oracle очень смела принять стандарт ISO похож на этот, но в то же время, как ни странно, они не прошли весь путь .

В целом люди сопротивляются всему другому, но их много хорошо Международные причины для этого.

Я знаю, что говорю революционные вещи, но мы все должны принять стандарты ISO, даже если мы делаем это понемногу .

21
ответ дан 24 November 2019 в 14:27
поделиться

Самый большой PITA Oracle - это то, что у него нет формата даты по умолчанию!

В вашем при установке Oracle комбинация локалей и параметров установки выбрала (очень разумно!) ГГГГ-ММ-ДД в качестве формата для вывода дат. В другой установке можно было бы выбрать «ДД / ММ / ГГГГ» или «ГГГГ / ДД / ММ».

Если вы хотите, чтобы ваш SQL был переносимым на другой сайт Oracle, я бы рекомендовал вам всегда заключать в TO_CHAR (datecol, 'YYYY-MM-DD') или аналогичная функция для каждого столбца даты в вашем SQL или альтернативно установить формат по умолчанию сразу после соединения с

ALTER SESSION 
SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS'; 

или аналогичным.

12
ответ дан 24 November 2019 в 14:27
поделиться

Никогда не стоит полагаться на то, что по умолчанию установлено определенное значение, ИМХО, будь то форматы даты, форматы валюты, режимы оптимизатора или что-то еще. Вы всегда должны устанавливать значение формата даты, которое вам нужно, на сервере, клиенте или приложении.

В частности, никогда не полагайтесь на значения по умолчанию при преобразовании даты или числовых типов данных для целей отображения, потому что одно изменение в база данных может сломать ваше приложение. Всегда используйте явный формат преобразования. В течение многих лет я работал в системах Oracle, где стандартным форматом отображения даты по умолчанию был MM / DD / RR, что сводило меня с ума, но, по крайней мере, заставляло меня всегда использовать явное преобразование.

9
ответ дан 24 November 2019 в 14:27
поделиться

Значение ДАТЫ по стандарту SQL - ГГГГ-ММ-ДД. Таким образом, хотя Oracle хранит информацию о времени, я предполагаю, что они отображают значение способом, совместимым со стандартом SQL. В стандарте есть тип данных TIMESTAMP, который включает информацию о дате и времени.

5
ответ дан 24 November 2019 в 14:27
поделиться

Я не являюсь пользователем Oracle (ну, по крайней мере, в последнее время), НО ...

В большинстве баз данных (и точнее говоря) дата не включает время. Наличие даты не означает, что вы обозначаете определенную секунду в эту дату. Обычно, если вам нужно не только дату, но и время, это называется отметкой времени.

3
ответ дан 24 November 2019 в 14:27
поделиться
Другие вопросы по тегам:

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