0

我知道这个问题可能听起来有点俗气,但这是我第一次在我的一个项目网站上实现“标记”功能,我想确保我做的一切都是正确的。

现在,我正在使用与 SO.. 中相同的标记系统。空格分隔,破折号(-)组合多个单词。所以当我验证用户输入标签字段时,我正在检查

  1. 空字符串(不能为空)
  2. 确保字符串不包含特定字母(这里欢迎建议..)
  3. 至少一个字
  4. 如果有空格(有多个单词)拆分字符串
  5. 对于每个拆分,插入数据库

我在这里遗漏了什么?或者这大致可以吗?

4

4 回答 4

2

在 处拆分字符串" ",迭代各个部分,确保它们符合您的期望。如果他们这样做,请将它们放入数据库中。

例如,您可以使用此正则表达式来检查各个部分:

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

这会将允许的输入限制为 2..25 个字符长的连续字母数字字符串(和"_",这是因为您要求它的一部分"\w""-"。这基本上消除了您可能面临的任何代码注入威胁。

编辑:代替"\w",您可以自由选择更紧密定义的字符范围,我选择它只是为了简单。

于 2009-01-23T20:13:32.477 回答
1

确保您的算法可以毫无问题地处理前导/尾随/额外空格 = )

同样值得考虑的可能是不适当标签的标签黑名单(例如亵渎)。

于 2009-01-23T20:17:53.073 回答
1

我从未实现过标记系统,但我可能很快就会为我正在从事的项目这样做。我主要是一个数据库专家,我突然想到,出于性能原因,最好通过解析表将您的标记实体与标记关键字相关联。因此,例如,使用示例表,例如:

TechQuestion
TechQuestionID (pk)
SubjectLine
QuestionBody

TechQuestionTag
TechQuestionID (pk)
TagID (pk)
活动(索引)

标记
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

...或者你有什么。我不知道,也许这对每个人来说都是显而易见的,但我想我会把它放在那里......因为我不相信替代方案(冗余、索引、文本标签条目)不会查询为有效率的。

于 2009-01-24T00:25:31.437 回答
0

我希望您正在针对注入攻击进行通常的保护-也许这已包含在#2中。

至少,您会想要转义引号字符并使嵌入的 HTML 无害——在 PHP 中,像addlasheshtmlentities这样的函数可以帮助您。鉴于它是用于标记系统的,我猜你只想允许字母数字字符。我不确定实现这一目标的最佳方法是什么,也许是使用正则表达式。

于 2009-01-23T20:06:37.903 回答