Обеспечьте вдохновение для вашей системы обнаружения вторжений.
Если вы дадите вам кучу пользовательского ввода, есть много китайских топонимов, таких как «Пекин», «Чэнду», «Дунгуань», к сожалению, в них также смешаны некоторые римские топонимы, такие как «Сингапур», «Нью-Йорк», «Токио». Ваша задача состоит в том, чтобы разделить их, как бы вы это сделали?
Конечно, есть много способов сделать это легко.
Если это куча «хорошо», «хорошо», «неплохо», «удивительно», «хорошо», короткие отзывы, смешанные с «Fallout 4 — это воплощение всего плохого в современных играх, в нем есть в общей сложности 2 захватывающих квеста. , его геймплей хуже остальных, и в довершение всего в него добавили микротранзакции. Это худший из серии Fallout.
Вы можете подумать, что нет ничего проще, просто проверьте длину строки и даже количество знаков препинания.
Что, если куча «12345678», «5201314» и «пароль» смешаны с «паролем» и (выберите количество (*) из данных)> 0 и «a» = «a», «>»'>» ?
Может быть, вы нетерпеливы: эта грамотность по технике безопасности все еще существует! Обнаружение ключевых слов и специальных символов!
Вы больше не позволите мне «если»: нет ничего, с чем бы не справилось регулярное выражение, а если и есть, то пришло время выучить его заново.
Хорошо, но теперь нам нужно использовать одну и ту же модель для достижения всех вышеперечисленных сценариев — когда строки длинные и короткие, она будет разделять строки ненормальной длины. Когда есть обычные строки и строки, содержащие специальные символы, он может выбрать специальные. Когда строки смешаны на разных языках, их можно «санировать». Бывают даже самые разные непредвиденные ситуации.
Этот код подобен испытанию еретиков в религиозной войне, будь то предатель или просто разделенный на две категории, он всегда может поймать меньшинство на основе появления строки.
Если вам случится заняться чем-то вроде изученияГлубокое обучение для кибербезопасностиПрименение , я полагаю, вы можете быстро подумать о практической ценности этого «гетеротического судьи», когда посмотрите на набор данных.
Подмигнем сочувственно. В следующем тексте мы будем реализовывать такую игрушку.
Самосовершенствование епископа: взгляд на лицо
Независимо от того, насколько велико расстояние между Пекином и Чэнду, его можно легко измерить с помощью евклидова расстояния. А как насчет расстояния между «Пекином» и «Чэнду»?
Нам нужно посмотреть на лицо, чтобы определить и количественно оценить такое различие на основе характеристик строки «внешний вид».
Нетрудно найти, что расстояние между струнами должно включать как минимум следующие компоненты:
- Различия в длине строк (например,
cat
иmiaomiaomiaomiaomiao
) - Различия в наборах символов (например,
123
иabc
) - различия в последовательности символов (например,
上海自来水
и水来自海上
)
разница в длине
Что тут сказать... строка длины 5, очевидно, имеет на единицу больше 2, чем строка длины 3...
Пропустите это здесь.
def strLengthDiffer(str1, str2):
return abs(len(str1) - len(str2))
Различия в наборах символов
Разница в наборах символов заключается в том, чтобы описать разницу в выборе символов разных строк.Мы должны штрафовать расстояние между строками с большими различиями, особенно когда появляются символы разных категорий.
Для достижения этой цели необходимо сначала определить расстояние между символами. Здесь мы определяем расстояние между теми же символами, что и 0, похожими символами (такими какa
иb
) определяется как 1, а расстояние между символами разных классов определяется как 10.
Классификация символов может быть строчными буквами, прописными буквами, цифрами и др. Конечно, читатели также могут классифицировать их в соответствии с их фактическим использованием и разделить различия, которые система должна чутко распознавать, на две разные категории.
С помощью межсимвольного расстояния мы определяем расстояние между символом A(1) и набором символов B как минимальное расстояние от A(1) до каждого символа в B.
На основании вышеизложенного далее определяем расстояние между набором символов A и набором символов B: арифметическое и расстояние каждого символа до B.
Очевидно:
- Расстояние между символами (a, b) = Расстояние между символами (b, a)
- Расстояние от символа до набора символов (a, B) = Расстояние от набора символов до символа (B, a)
- Расстояние между наборами символов (A, B) = Расстояние между наборами символов (B, A)
Таким образом, мы завершили когнитивное определение расстояния между наборами символов.
def charSetDiffer(s1, s2):
# 由于笔者使用的代码版本在这里有更复杂的逻辑,就不提供代码细节了
# 已经讲得这么明确了,写写看吧
return s
различия в последовательности символов
Для разработчиков пользовательский вводalert("test")
все ещеaeelrstt""()
, очевидно, имеет совсем другое значение. Последняя строка с неизвестным значением не даст людям взглянуть еще раз, а если первую пользователь успешно выполнит, то, вероятно, в будущем он нанесет какой-то другой ущерб, что очень зло.
История говорит нам, что различия в последовательностях персонажей нельзя игнорировать.
Здесь мы используем языковую модель N-грамм для измерения разницы между двумя последовательностями по количеству граммов при N=2.
Если вы не понимаете, о чем я, то это такой расчет:
- Предположим, у нас есть строки S1 и S2.
- Взяв в качестве элемента каждые два последовательных символа строки S1, формируется множество G1, а также G2 таким же образом.
- Разница последовательностей между строками S1 и S2 — это количество различных элементов в G1 и G2. Очевидно, вы можете получить это значение, вычитая их объединение из их пересечения.
def n_grams(a):
z = (islice(a, i, None) for i in range(2))
return list(zip(*z))
def groupDiffer(s1, s2):
len1 = len(list(set(s1).intersection(set(s2))))
len2 = len(list(set(s1).union(set(s2))))
return abs((len2 - len1))
Наконец-то получил расстояние между строками
До сих пор мы количественно определяли разницу в трех формальных измерениях между двумя строками, и следующее, что мы делаем, — вычисляем удивительное расстояние между строками с помощью тонкой взвешенной суммы.
Здесь метод, который я использую, -
def samplesDistance(str1, str2):
a = strLengthDiffer(str1, str2)
b = charSetDiffer(str1, str2)
s1 = n_grams(str1)
s2 = n_grams(str2)
c = groupDiffer(s1, s2)
d = a+b+c
return d
Да! Просто добавьте...
Гора не высокая, а храмы для отправки вымпелов есть.Алгоритм не сложный, лишь бы был полезен.
Конечно, вы можете настроить чувствительность системы к трем измерениям в соответствии с вашими потребностями, но автор считает, что значение разницы в наборе символов, естественно, больше, чем значение двух других различий.
Ты не похож на них
С расстоянием между струнами, далее, есть расстояние от одной струны до другого пучка струн. Мы определяем следующим образом:
Расстояние между образцом строки и набором строк = среднее арифметическое расстояния от образца строки до каждого образца строки в наборе строк.
который:
def sampleClassDistance(sample, class1):
list_0 = []
length = len(class1)
for item in class1:
list_0.append(samplesDistance(sample, item))
return sum(list_0)/length
вы двое
Начав с расстояния от строки до группы строк в предыдущем разделе, мы можем получить расстояние от группы строк до другой группы строк. Он определяется в аналогичной форме:
Расстояние между наборами строк = среднее арифметическое расстояний от каждой выборки в наборе строк до набора строк = среднее арифметическое расстояний от каждой выборки в наборе строк до каждой выборки в другой строке
который:
def classesDistance(class1, class2):
list_0 = []
class1 = flatten(class1)
class2 = flatten(class2)
m = len(class1)
n = len(class2)
for item1 in class1:
for item2 in class2:
list_0.append(sampleDistance(item1, item2))
return sum(list_0)/(m*n)
Нет фракции внутри класса, всякие странные
Точно так же «внутриклассовое расстояние» также может быть определено как свойство внутри набора строк. Это может быть несколько близко к дисперсии в практическом смысле. Мы оговариваем:
Внутриклассовое расстояние = расстояние от набора строк до самого себя
def innerClassesDistanse(class1):
return classesDistance(class1, class1)
Давайте остановимся и организуем наши мысли
В этот момент у вас может закружиться голова.Какова цель определения такого большого количества расстояний?
Мы сказали, что ключом к разделению двух типов неопределенно различных форм строк является определение различия, то есть количественная оценка того, насколько на самом деле различаются «очевидно разные».
Поэтому мы изобрели некое «расстояние» в качестве поддающегося количественной оценке атрибута.Если между двумя строками существуют разные длины, разные символы и разные последовательности символов, то две строки имеют поддающееся количественной оценке расстояние.
Если есть расстояние между двумя строками, то есть расстояние между одной строкой и строкой другого типа, между строкой одного типа и строкой другого типа, а также есть расстояние внутри строки того же типа.
Когда ты в толпе, самое главное — понять, кто тебе друг, а кто враг. А когда нужно разделить людей на две группы, самое главное знатьНасколько они разные,а такжеНасколько последователен каждый тип человека внутри.
В случае классификационных строк необходимо иметь возможность количественной оценкимежклассовое расстояниеиВнутриклассовое расстояние.
эй нет, у нас уже естьclassesDistance()
иinnerClassesDistanse()
.
Вот и все, увидимся в следующий раз :)
Примечание редактора:
Эта статья еще не закончена, ждите продолжения. Ссылки и примеры кода будут приведены в полной статье.
Автор считает, что четкое описание позволяет людям, которые не умеют писать код, писать код, поэтому код в статье исходит от друга, который не умеет писать на Python, и стиль кода может быть немного странным.
Искусство /YvesX
Вы все равно не можете догадаться, что я делаю
Монтаж/Флуоресценция
Автор разрешил опубликовать эту статью, и авторские права принадлежат Chuangyu Frontend. Пожалуйста, укажите источник для перепечатки этой статьи. Ссылка на эту статью:известный Sec-Fed.com/2018-09-25-…
Если вы хотите подписаться на другие сообщения с передовой линии KnownsecFED, выполните поиск и подпишитесь на нашу общедоступную учетную запись WeChat: KnownsecFED. Добро пожаловать, чтобы оставить сообщение для обсуждения, мы ответим как можно скорее.
Спасибо за чтение.