Вопрос или проблема
Что-то вроде этого?
service cloud.firestore {
match /databases/{database}/documents {
function isClaims(claim) {
return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.claims[claim];
}
match /foo/{id} {
allow get;
allow list: если request.query.limit <= 111;
allow write: если isClaims("foo") == true
// && убедитесь, что request.resource.data не содержит определенных HTML-тегов здесь;
}
...
Примечание:
- Я уже проверил ввод пользователя на клиентской стороне.
- Я еще ничего не пробовал с правилами, потому что у меня нет вообще никакой идеи.
Ответ или решение
Для предотвращения сохранения определённых HTML-тегов в Firestore с использованием правил безопасности (Firestore Security Rules), к сожалению, нет прямого способа анализировать содержимое строк и фильтровать теги на уровне правил. Правила Firestore предназначены в первую очередь для управления доступом к данным, а не для их валидации или обработки.
Тем не менее, вы можете реализовать несколько подходов для решения этой задачи:
1. Валидация на стороне клиента
Как вы уже упомянули, вы выполняете валидацию на стороне клиента. Это один из самых эффективных подходов. Используйте регулярные выражения или библиотеку для обработки HTML, чтобы удалить или не допустить конкретные теги перед отправкой данных в Firestore.
Пример валидации на языке JavaScript:
function sanitizeInput(input) {
// Удаляет теги <script> и <style>
return input.replace(/<\/?(script|style)[^>]*>/gi, '');
}
// Используйте данную функцию перед отправкой данных
const sanitizedData = sanitizeInput(userInput);
2. Использование Cloud Functions
Если валидация на стороне клиента вас не устраивает, вы можете использовать Google Cloud Functions для проверки и фильтрации данных. Вы можете создать триггер на событие записи в Firestore, который будет проверять содержимое документа и, при наличии нежелательных тегов, отменять запись.
Пример на Node.js:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
exports.sanitizeInput = functions.firestore
.document('foo/{id}')
.onCreate((snap, context) => {
const data = snap.data();
const sanitizedData = sanitizeInput(data.content); // Предположим, что контент хранится в поле `content`
if (data.content !== sanitizedData) {
// Удаляем документ или перезаписываем его с чистыми данными
return snap.ref.set({ content: sanitizedData }, { merge: true });
}
return null;
});
function sanitizeInput(input) {
return input.replace(/<\/?(script|style)[^>]*>/gi, '');
}
3. Валидация на стороне сервера
Если у вас есть серверное приложение, вы можете сделать валидацию на сервере перед тем, как данные будут отправлены в Firestore. Это также позволит вам иметь больший контроль над ними.
Резюме
- Валидация на стороне клиента: лучший и самый простой способ.
- Использование Cloud Functions: позволяет обрабатывать данные на сервере после их записи, но может вызвать задержку.
- Серверная валидация: также хороший вариант, если у вас есть серверное приложение.
Применяйте комбинированный подход для достижения лучших результатов.