проверка тегов пользовательского ввода

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

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

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

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


person Subliminal Hash    schedule 23.01.2009    source источник


Ответы (4)


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

TechQuestion
TechQuestionID (pk)
SubjectLine
QuestionBody

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

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

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

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

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

person codemonkey    schedule 24.01.2009

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

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

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

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

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

person Tomalak    schedule 23.01.2009

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

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

person rlb.usa    schedule 23.01.2009

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

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

person Ian Greenleaf Young    schedule 23.01.2009