Counterbug: не знаю, как перевести коротко, поэтому будет длинно.
Когда кто-то приходит к вам и показывает вам ваш баг, вы в ответ показываете ему его баг. Этот последний и есть counterbug.
А почему бы не сделать просто -A INPUT -m conntrack --ctstate NEW -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -j DROP (или -j logdrop, если нравится)?
Уж фиг с ними с отступами, с потерянными ноликами, с тем, что у вас метод называется как конструктор (и не понятно, это должен быть всё-таки метод или конструктор). Можно даже закрыть глаза на то, что у вас не проверяются возвращаемые значения (Boolean Success). Но скажите, какое оправдание есть тому, чтобы писать
private static final byte[] Hexhars = ... ;
result.append((char) Hexhars[...]);
вместо
private static final char[] Hexhars = ... ;
result.append(Hexhars[...]);
Будем оперировать тем порядком аргументов, который идёт в PHP. Обозначим hash_hmac('sha1', a, b) как s(a, b) для краткости. Ещё: L — login, P — password, KR = random_key+remote_addr.
На сервере в файле лежат:
s(P, L)
s(s(L, P), L)
С клиента на сервер передаются:
s(KR, s(P, L))
s(L, P)
Зная первый хеш, можно в любое время вычислить клиентский key, а зная последний хеш (подсмотрев при передаче), можно его без изменений использовать в дальнейшем как клиентский password. Готово.
Я так понял, что javascript-овый вариант hex_hmac_sha1(a, b) эквивалентен PHP-шному hash_hmac('sha1', b, a), то есть аргументы a и b переставлены местами. Тогда я могу доказать, что ваша система не защищена в поставленных вами условиях.
В принципе, можно рассуждать так: если вызов можно эквивалентно представить в виде выражения
( 1 )[ 2 ](аргументы);
где 1 — выражение, результат вычисления которого равен какому-то объекту, а 2 — выражение, результат вычисления которого равен какой-то строчке (имя свойства) или числу (индекс), то this будет равен выражению 1.
Если так представить нельзя, то this будет равен window.
Причём код
with ({foo: function () {alert(this);}}) {
foo();
}
(теоретически) можно представить как
( {foo: function () {alert(this);}} ) ["foo"] ();
что соответствует первому случаю :)
Аналогично:
foo.prototype.constructor(); // эквивалентно ( foo.prototype ) ["constructor"] ();
(foo.prototype.constructor)(); // эквивалентно ( foo.prototype ) ["constructor"] ();
(foo.prototype.constructor = foo.prototype.constructor)(); // нельзя представить в таком виде
Я для себя запомнил так: this внутри функции имеет то значение, чему равно выражение перед точкой при вызове функции. Если точки нет или используется какое-то хитрое выражение типа (x=«q».toString)(), то он равен глобальному объекту, window. И это если не учитывать всяких new f() и f.call()/apply().
Мне кажется, лучше выделять не цветом фона, а изменять цвет ника автора комментария, тогда это не будет пересекаться с подсветкой новых комментариев. А цвет взять примерно тот же, каким написан ник автора в нижней плашке топика (#CF0000).
На самом деле я знаю, как это работает, но не могу запомнить, как это называется, поэтому по привычке называю так :) Возможно, другие люди тоже понимают, что «по ссылке» применительно к JS означает «по разделению».
Объясните, зачем в конец некоторых цепочек вставлено "-j RETURN". Это ж вроде действие по умолчанию.
И ещё, почему б не объединить, например, --dport 137
--dport 138
--dport 139
в --dport 137:139
Ещё можно объединить 4 фрагмента "# drop all MS stuff so that it won't clutter logs" в один с циклом.
И, наконец, как я понимаю, этот скрипт — не панацея, а, скорее, некоторые идеи администратору на заметку.
Вы, наверное, в курсе, что если зайти на ваш сайт с отключенным javascript, то отображается небольшой текст, среди которого есть ссылка «изменить настройки». Но вы, возможно, не в курсе, что та ссылка ведёт на 404.
А по теме: возможно, «обычная» нравится меньше, потому что там «Регистрация» выглядит как ссылка (не все ещё привыкли к тому, что если подчёркивание не сплошное, то это js-кнопка) и пользователь боится, что нажав на неё, он попадёт на другую страницу с кучей полей для заполнения. А радио-кнопка «Я еще не зарегистрирован» не вызывает таких опасений (нажав на неё, пользователь ничего не теряет).
Когда кто-то приходит к вам и показывает вам ваш баг, вы в ответ показываете ему его баг. Этот последний и есть counterbug.
-A INPUT -m conntrack --ctstate NEW -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -j DROP
(или-j logdrop
, если нравится)?xentrace /dev/stdout | cat
В этом случае
/dev/stdout
уже будет не на терминал указывать, а на безымянный пайп.Boolean Success
). Но скажите, какое оправдание есть тому, чтобы писатьвместо
На сервере в файле лежат:
s(P, L)
s(s(L, P), L)
С клиента на сервер передаются:
s(KR, s(P, L))
s(L, P)
Зная первый хеш, можно в любое время вычислить клиентский key, а зная последний хеш (подсмотрев при передаче), можно его без изменений использовать в дальнейшем как клиентский password. Готово.
( 1 ) [ 2 ] (аргументы);
где 1 — выражение, результат вычисления которого равен какому-то объекту, а 2 — выражение, результат вычисления которого равен какой-то строчке (имя свойства) или числу (индекс), то this будет равен выражению 1.
Если так представить нельзя, то this будет равен window.
Причём код
(теоретически) можно представить как
что соответствует первому случаю :)
Аналогично:
foo.prototype.constructor(); // эквивалентно ( foo.prototype ) ["constructor"] ();
(foo.prototype.constructor)(); // эквивалентно ( foo.prototype ) ["constructor"] ();
(foo.prototype.constructor = foo.prototype.constructor)(); // нельзя представить в таком виде
foo() вернёт window, foo.prototype.constructor() вернёт foo.prototype, который не равен window.
1/0 даёт бесконечность — это общепринято в математике.
Тут мне не очень понятно, а что, собственно, ожидалось? Аналогично:
Может, вместо
===
использоватьinstanceof
? Будет веселее (хотя тоже всё логично):И ещё, почему б не объединить, например,
--dport 137
--dport 138
--dport 139
в
--dport 137:139
Ещё можно объединить 4 фрагмента "# drop all MS stuff so that it won't clutter logs" в один с циклом.
И, наконец, как я понимаю, этот скрипт — не панацея, а, скорее, некоторые идеи администратору на заметку.
А по теме: возможно, «обычная» нравится меньше, потому что там «Регистрация» выглядит как ссылка (не все ещё привыкли к тому, что если подчёркивание не сплошное, то это js-кнопка) и пользователь боится, что нажав на неё, он попадёт на другую страницу с кучей полей для заполнения. А радио-кнопка «Я еще не зарегистрирован» не вызывает таких опасений (нажав на неё, пользователь ничего не теряет).