Я бы не стал устанавливать GoodbyeDPI на серьёзную машину, на которой множество конфиденциальных данных, особенно на рабочий компьютер/ноутбук с доступом в корпоративную сеть. Причин несколько:
Я не профессиональный программист вообще и на C в частности;
- Код использует UB и математику с указателями, потому что в C иначе не получается — куча пространства для ошибок;
- Программа не проходила аудита кода даже моими глазами;
- Драйвер WinDivert не проходил аудита кода и периодически вызывает несовместимости с другими драйверами с BSOD'ами (даже если ошибка не непосредственно в WinDivert).
- Программа была написана по приколу, чтобы потренироваться в фильтрации пакетов на Windows. Я не пользуюсь Windows чёртову дюжину лет. Иными словами, я очень нерегулярно сам использую GoodbyeDPI.
Что может произойти?
- В программе найдут уязвимость, связанную с обработкой данных в пакете, с переполнением буфера, с возможностью эксплуатации на стороне сервера ⇒ вам прогрузят код с привилегиями SYSTEM, украдут все данные и заразят компьютер.
- В драйвере WinDivert найдут аналогичную уязвимость ⇒ вам прогрузят код с привилегиями ядра, украдут все данные и заразят компьютер потенциально так, что антивирусы не обнаружат заражение.
Это всё применимо к совершенно любой программе в целом, но к GoodbyeDPI в этом плане стоит относиться особенно настороженно, т.к. и сама программа, и драйвер запущены с максимальными привилегиями, а код и того, и другого написан любителями.
До сих пор периодически пишут об ошибках запуска на необновленных Windows 7 c MS17-010, на таких системах потенциальные проблемы от GoodbyeDPI вообще не имеют никакого значения — вас куда быстрее проэксплуатируют через другой десяток уязвимостей :D
this.$set \ Vue.set
при добавлении нового ключа.const templates = reactive(keyBy(templatesArr, 'id'))
for (let templateId in templates) {
const devices = devicesArr.filter(device => device.templateId === templateId)
Vue.set(templates[templateId], 'devices', devices);
Vue.set(templates[templateId], 'settings', {});
}
// либо просто так:
const templates = keyBy(templatesArr, 'id');
for (let templateId in templates) {
const devices = devicesArr.filter(device => device.templateId === templateId)
Object.assign(templates[templateId], { devices }, {settings: {}})
}
reactive(templates);
reactive
, вместо него был Vue.observable
. Но может добавили, хз, лень смотреть.:) cofe = int(input('Сколько вы хотите кофе?: '))
flor = int(input('Введите на каком вы этаже:'))
if cofe in [1, 2, 3] and flor >= 100:
он оценивает первое условие как False и не переходит ко второму. Почему строка $arr[] = 'si$te.com'; определяется как доменное имя?
- $reg = '#[a-z0-9]+[_-]?[a-z0-9]+\.[a-z]{2,}#';
+ $reg = '#^(?:[a-z0-9][a-z0-9-_]*\.)+(?:[a-z]{2,}|xn--[a-z0-9]{4,})$#i';
interface CSS {
[k: string]: {
[k: string]: string | number
}
}
const css = {
default: {
color: '#676767',
border: '1px solid',
border_color: '#C4C4C4',
border_radius: '110px',
padding: '16px 21px',
}
} satisfies CSS;
function Foo(arg) {
this.bar = function() {
return arg;
};
return this.bar();
}
const notfoo = Foo('not foo');
console.log(notfoo); // "not foo", т.е. notfoo - это не новый Foo, это строка текста.
console.log(notfoo.bar); // undefined, что логично, у стандартной строки никакого bar нет.
const foo = new Foo('foo');
console.log(foo); // [object Object], т.е. вот это - настоящий новый Foo.
console.log(foo.bar); // function() { ... }, и метод bar в нем есть.
console.log(foo.bar()); // "foo"
type Schemas<P extends keyof paths> = paths[P]['post'] extends {requestBody: infer R} ? R : never;