diff --git a/static/fonts/JetBrainsMono-Regular.ttf b/static/fonts/JetBrainsMono-Regular.ttf new file mode 100644 index 0000000..dff66cc Binary files /dev/null and b/static/fonts/JetBrainsMono-Regular.ttf differ diff --git a/static/index.css b/static/index.css index 821aa10..8918b99 100644 --- a/static/index.css +++ b/static/index.css @@ -3,6 +3,11 @@ src: url("/static/fonts/Monocraft.otf") format("opentype"); } +@font-face { + font-family: "JetBrainsMono"; + src: url("/static/fonts/JetBrainsMono-Regular.ttf") format("truetype"); +} + #popup { display: none; } @@ -16,6 +21,7 @@ margin: 0.5rem; background-color: rgba(225, 225, 225, 0.99); border-radius: 3px; + font-family: Monocraft; } .inpt:hover { box-shadow: 0.5em 0.5em 0em 0px rgba(186, 65, 166, 0.6); @@ -54,6 +60,7 @@ text-align: center; color: rgba(225, 225, 225, 0.6); } + .translate-header { width: 100%; height: 100%; @@ -87,14 +94,13 @@ background-color: rgb(0 0 0 / 85%); padding: 0.5rem 1.5rem; text-align: left; - width: 20%; - height: 27%; + width: auto; + height: 22rem; transition: 1s; } .slideinInpt { transition: 1s; - transform: translateX(345%); - + transform: translateX(285%); } .slideoutInpt { @@ -103,20 +109,23 @@ } - .sql-guide { width: 65%; height: auto; background-color: rgb(0 0 0/ 90%); - padding: 1rem; + padding: 0.4rem 1rem; margin-left: 3.5rem; margin-top: 3.5rem; - box-shadow: 1em 1em 0em 0px rgba(186, 65, 166, 0.7); + box-shadow: 0.8em 0.8em 0em 0px rgba(186, 65, 166, 0.6); transform: translateX(-165%); - transition: 1s; + transition: 0.5s; position: absolute; } +.sql-guide:hover { + box-shadow: 1.2em 1.2em 0em 0px rgba(186, 65, 166, 0.9); +} + .slideinHelp { transition: 1s; transform: translateX(0%); @@ -129,6 +138,33 @@ } +.mono { + font-family: JetBrainsMono; + color: rgba(225, 225, 225, 0.9); + background-color: rgb(35, 33, 54); + padding: 0.3rem; + border-radius: 0.2rem; + font-size: 0.9rem; +} + +.codefont { + border-radius: 0.6rem; + font-family: JetBrainsMono; + font-size: 0.85rem; +} + +.hltext { + color: rgb(252 204 255); + transition: 0.5s; + padding: 0.3rem; + border-radius: 0.2rem; +} + +.hltext:hover { + background-color: rgba(186, 65, 166, 0.5); + transform: translateX(1rem); +} + .headerblock { width: clamp(60rem, 65% , 140rem); height: clamp(10rem, 20%, 10rem); @@ -171,7 +207,7 @@ .navigation{ width: 18%; - height: 65%; + height: clamp(27rem, 65%, 39rem); padding: 0; top: 17.5%; border-color: #000000; @@ -211,6 +247,7 @@ border-color: rgba(0, 0, 0, 0); color: white; font-size: 1.1rem; + cursor: pointer; } .btn1 + .btn1 { margin-left: 1rem; @@ -227,6 +264,7 @@ transition: 0.1s; border-radius: 0.5rem; margin: 0.5rem; + cursor: pointer; } @@ -259,12 +297,14 @@ flex-direction: column; margin: 1rem 1.5rem 0; width: 100%; + cursor: pointer; } .navbtn { justify-content: center; display: flex; flex-wrap: wrap; + cursor: pointer; } #help { @@ -272,8 +312,8 @@ width: 3vw; height: auto; margin: 2rem; - bottom: 1.5%; - left: 1.2%; + bottom: 0.2vw; + left: 0.2vw; position: absolute; box-shadow: 0.4em 0.4em 0em 0px rgba(0, 0, 0, 0.8); transition: 0.5s; diff --git a/templates/sql-injection.html b/templates/sql-injection.html index 8819cd4..27a5e2b 100644 --- a/templates/sql-injection.html +++ b/templates/sql-injection.html @@ -1,21 +1,28 @@ {% extends '_task.html' %} -{% block content%} +{% block content %}
Это так называемая SQL-инъекция - уязвимость в системах, где отправляются SQL запросы, например регистрационные формы.
-
Как именно это работает? Все дело в том, что запрос отправляется без проверки на то, что пользователь туда ввёл. С использованием синтаксиса запроса можно указать себе логин 'admin', а часть с проверкой пароля просто-напросто закомментировать.
-login = request.form['login']
-password = request.form['pass']
-cursor = get_db().cursor()
-cursor.execute(f'SELECT * FROM Users WHERE login == "{login}" AND password == "{password}"')
- Примерно так выглядит сообтвествующий код, который позволяет использовать уязвимость
+SQL-инъекция - уязвимость системы, позволяющая пользователю ввести вредоносный код в SQL-запрос.
+
Как именно это работает? Все дело в том, что данные, которые ввёл пользователь, вставляются в запрос напрямую (пример кода с сервера ниже)
+#Как же это работает на сервере?(не стоит так делать, иначе ваш код будет иметь ту же уязвимость)
+login = request.form['login'] # Получаем данные из окна с логином, которые пользователь ввёл в форму
+password = request.form['pass'] # Так же получаем данные из окна с паролем
+cursor = get_db().cursor() # Получение доступа к базе данных
+cursor.execute(f'SELECT * FROM Users WHERE login == "{login}" AND password == "{password}"') # Вставляем в запрос данные от пользователя
+ Так в место того, чтобы вводить свои данные, можно ввести определённые команды (как правило - вредоносные) + Вводим в соответствующее поле предполагаемый логин админа - admin, а часть кода с проверкой пароля, которая идёт после проверки логина, просто закомментируем знаками ";--. + Если мы введём admin";-- в поле логин, то наш запрос на сервер отправится вот так:
+cursor.execute(f'SELECT * FROM Users WHERE login == "admin";--" AND password == "{password}"')
+ Вы успешно вошли под логином admin. скрыть