Какой-либо способ изменить словарь местных жителей?

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

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

14
задан martineau 2 January 2019 в 01:08
поделиться

4 ответа

Я только что протестировал exec, и он работает в Python 2.6.2

>>> def test():
...     exec "a = 5"
...     print a
...
>>> test()
5

Если вы используете Python 3.x, он больше не работает, потому что локальные переменные оптимизируются как массив во время выполнения. использования словаря.

Когда Python обнаруживает «оператор exec», он заставляет Python переключить локальное хранилище с массива на словарь. Однако, поскольку "exec" является функцией в Python 3.x, компилятор не может сделать это различие, поскольку пользователь мог сделать что-то вроде "exec = 123".

http://bugs.python.org/issue4831

Чтобы изменить локальные переменные функции на муха невозможна без несколько последствий: обычно, локальные переменные функции не хранятся в словарь, а массив, индексы определяются во время компиляции из известных мест. Это сталкивается по крайней мере, с новыми местными жителями, добавленными exec. Старый оператор exec обошли это, потому что компилятор знал, что если exec без аргументы globals / locals произошли в функция, это пространство имен будет "неоптимизированный", т.е. не использующий массив местных жителей. Поскольку exec () теперь нормальная функция, компилятор не знать, к чему может быть привязан "exec", и поэтому не могу лечить это специально.

14
ответ дан 1 December 2019 в 12:01
поделиться

Локальные переменные изменяются операторами присваивания.

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

1218] Если вы абсолютно должны иметь локальные переменные, сделайте это.

def aFunction( a, b, c, d, e, f ):
    # use a, b, c, d, e and f as local variables

aFunction( **someDictWithKeys_a_b_c_d_e_f )

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

7
ответ дан 1 December 2019 в 12:01
поделиться

Это невозможно. Я думаю, это позволит в дальнейшем оптимизировать производительность. Байт-код Python ссылается на локальные объекты по индексу, а не по имени; если требуется, чтобы функция locals () была доступна для записи, это могло помешать интерпретаторам реализовать некоторые оптимизации или усложнить их.

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

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

См. этот вопрос для одного возможного решения, но это ' это серьезный взлом, и вы действительно не хотите этого делать.

Обратите внимание, что есть основная проблема с вашим примером кода:

@depends("a", "b", "c", "d", "e", "f")
def test():
    put_into_locals(test.dependencies)

"test.dependencies" не относится к "f.dependencies", где f - текущая функция; это ссылка на фактическое глобальное значение «test». Это означает, что если вы используете более одного декоратора:

@memoize
@depends("a", "b", "c", "d", "e", "f")
def test():
    put_into_locals(test.dependencies)

он больше не будет работать, поскольку "test" - это функция-оболочка memoize, а не зависимая. Python действительно нуждается в способе ссылки на «текущую выполняемую функцию» (и класс).

s ссылка на фактическое глобальное значение "test". Это означает, что если вы используете более одного декоратора:

@memoize
@depends("a", "b", "c", "d", "e", "f")
def test():
    put_into_locals(test.dependencies)

он больше не будет работать, поскольку "test" - это функция-оболочка memoize, а не зависимая. Python действительно нуждается в способе ссылки на «выполняющуюся в данный момент функцию» (и класс).

s ссылка на фактическое глобальное значение "test". Это означает, что если вы используете более одного декоратора:

@memoize
@depends("a", "b", "c", "d", "e", "f")
def test():
    put_into_locals(test.dependencies)

он больше не будет работать, поскольку "test" - это функция-оболочка memoize, а не зависимая. Python действительно нуждается в способе ссылки на «текущую выполняемую функцию» (и класс).

3
ответ дан 1 December 2019 в 12:01
поделиться

Я не уверен, что на него распространяются те же ограничения, но вы можете получить прямую ссылку на текущий frame (а оттуда - словарь локальных переменных) через модуль проверки:

>>> import inspect
>>> inspect.currentframe().f_locals['foo'] = 'bar'
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'foo', 'inspect']
>>> foo
'bar'
0
ответ дан 1 December 2019 в 12:01
поделиться
Другие вопросы по тегам:

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