проверка пользовательских тегов ввода - PullRequest
0 голосов
/ 23 января 2009

Я знаю, что этот вопрос может показаться немного странным, но я впервые использую функцию тегирования на одном из своих сайтов проекта и хочу убедиться, что я все делаю правильно.

Прямо сейчас, я использую ту же систему тегов, что и в SO .. разделенные пробелом, тире (-) объединили несколько слов. поэтому, когда я проверяю поле ввода пользовательского тега, я проверяю

  1. Пустая строка (не может быть пустой)
  2. Убедитесь, что строка не содержит конкретных букв (здесь приветствуются предложения ..)
  3. хотя бы одно слово
  4. если есть пробел (более одного слова), разбить строку
  5. для каждого разделения, вставьте в дБ

Я что-то здесь упускаю? или это примерно нормально?

Ответы [ 4 ]

2 голосов
/ 23 января 2009

Разделите строку на " ", итерируйте по частям, убедитесь, что они соответствуют вашим ожиданиям. Если они это сделают, поместите их в БД.

Например, вы можете использовать это регулярное выражение для проверки отдельных частей:

^[-\w]{2,25}$

Это ограничит допустимый ввод последовательными строками буквенно-цифровых символов (и "_", который является частью "\w", а также "-", потому что вы его запросили) длиной 2..25 символов. Это по существу устраняет любую угрозу внедрения кода, с которой вы можете столкнуться.

РЕДАКТИРОВАТЬ: Вместо "\w" вы можете взять любой более строго определенный диапазон символов , я выбрал его только для простоты.

1 голос
/ 24 января 2009

Я никогда не внедрял систему тегов, но, скорее всего, скоро это сделаю для проекта, над которым я работаю. Я в первую очередь парень из базы данных, и мне приходит в голову, что из соображений производительности лучше связать ваши помеченные объекты с ключевыми словами тега через таблицу разрешений. Так, например, с примерами таблиц, таких как:

TechQuestion
TechQuestionID (pk)
SubjectLine
QuestionBody

TechQuestionTag
TechQuestionID (pk)
TagID (pk)
Активный (проиндексированный)

Tag
TagID (pk)
TagText (проиндексированный)

... вы добавляете новые записи в таблицу тегов только при использовании ранее не использованных тегов. Вы повторно свяжете ранее предоставленные теги через запись таблицы TechQuestionTag. И ваш запрос на получение TechQuestions, относящийся к данному тегу, будет выглядеть так:

SELECT
q.TechQuestionID,
q.SubjectLine,
q.QuestionBody
FROM
Tag t INNER JOIN TechQuestionTag qt
ON t.TagID = qt.TagID AND qt.Active = 1
INNER JOIN TechQuestion q
ON qt.TechQuestionID = q.TechQuestionID
WHERE
t.TagText = @tagText

... или что там у тебя. Я не знаю, возможно, это уже было очевидно для всех, но я думал, что выложу это туда ... потому что я не верю, что альтернатива (избыточные, проиндексированные, записи с текстовыми тегами) не будет запрашиваться как эффективно.

1 голос
/ 23 января 2009

Убедитесь, что ваш алгоритм может обрабатывать начальные / конечные / лишние пробелы без проблем =)

Также стоит подумать о черном списке тегов для неподходящих тегов (например, ненормативной лексики).

0 голосов
/ 23 января 2009

Я надеюсь, что вы делаете обычную защиту от инъекционных атак - возможно, это включено в # 2.

По крайней мере, вы захотите экранировать символы кавычек и сделать встроенный HTML безвредным - в PHP такие функции, как addlashes и htmlentities , могут вам в этом помочь. Учитывая, что это система тегов, я предполагаю, что вы захотите разрешить только буквенно-цифровые символы. Я не уверен, что для этого лучше всего использовать регулярные выражения.

...