1

Тема: Санітизація: коли робити

Маю форму з мітками подібними до SOшних. Перебіг роботи такий:

1. Користувач додає мітку через веб-форму.
2. Мітка зберігається в БД.
3. Мітка відображається користувачу. Мітка (на клієнті) порівнюється з поточним вводом користувача.

Де мені тут вставити санітизацію і як її робити?

2

Re: Санітизація: коли робити

При виводі робити "html escaping". А як робити то вже залежить як ви користувачу віддаєте html, яка мова, фреймворк. Якщо використовувати якийсь сучасний фреймворк, то переважно в ньому по замовчуванню є "safe output"

3

Re: Санітизація: коли робити

Yola написав:

Мітка (на клієнті) порівнюється з поточним вводом користувача.

А зміст, щось на клієнті порівнювати? Можна вважати, що це порівняння завжди буде тру. Чи це користувач перевіряє чи це той самий сервер, де він лишав мітку?

4

Re: Санітизація: коли робити

Vo_Vik написав:
Yola написав:

Мітка (на клієнті) порівнюється з поточним вводом користувача.

А зміст, щось на клієнті порівнювати? Можна вважати, що це порівняння завжди буде тру. Чи це користувач перевіряє чи це той самий сервер, де він лишав мітку?

То для зручності користувача, щоб можна було йому підказки видавати.

5

Re: Санітизація: коли робити

Загалом я помітив цю халепу після того як додав мітки українською. Виявляється Razor уставно закодовує усі не ASCII, тобто поза базовим латинським діапазоном. І в мене почала неспрацьовувати перевірка на рівність між поточним вводом і тим, що Razor пише на сторінку на сервері. Я це виправив змінивши конфігурацію для Razor. А ось цікаво, що з результатами Fetch API перевірка продовжувала спрацьовувати і це мені підказало, що мій сайт має XSS-вразливість. Треба буде пройти по всіх місцях, де я використовую Fetch API і якось їх санітазувати.

6

Re: Санітизація: коли робити

mikeos написав:

При виводі робити "html escaping". А як робити то вже залежить як ви користувачу віддаєте html, яка мова, фреймворк. Якщо використовувати якийсь сучасний фреймворк, то переважно в ньому по замовчуванню є "safe output"

От і питання, як я можу зробити html escaping в js

7 Востаннє редагувалося Droid 77 (31.03.2024 20:11:36)

Re: Санітизація: коли робити

[тут не було нічого корисного]

Від модератора: попередження за спам, наступний раз - бан на день.

8 Востаннє редагувалося frz (01.04.2024 17:17:21)

Re: Санітизація: коли робити

Незрозуміло без коду, що саме потребує виправлення, тому подаю предметний приклад форми що потребує санітизації:

<form method="post" action="/welcome">
    <label for="name">Name:</label>
    <input type="text" id="name" name="name">
    <input type="submit" value="Submit">
</form>

from flask import Flask, request, render_template_string

app = Flask(__name__)

@app.route('/welcome', methods=['POST'])
def welcome():
    name = request.form['name']
    return render_template_string(f"<h1>Welcome, {name}!</h1>")

Якщо юзер введе щось таке замість імені, то відкриється поп-ап, а там вже від фантазії зловмисника можна ще щось цікаве зробити

<script>alert('Hacked!');</script>

Тому ескейпимо ім'я:

from flask import Flask, request, render_template_string, escape

app = Flask(__name__)

@app.route('/welcome', methods=['POST'])
def welcome():
    name = escape(request.form['name'])
    return render_template_string(f"<h1>Welcome, {name}!</h1>")

Загалом варто спробувати різні варіанти, може форма виконує все що введене як код, тоді зловмисник може зробити щось типу drop database. Для кожної форми повинна бути функція-ендпоїнт, що приймає дані саме як дані визначеного типу, а не як код.