我知道这个问题可能听起来有点俗气但这是我第一次在我的某个项目网站上实施“标记”功能,我想确保我做的一切都正确。
现在,我正在使用与SO中相同的标记系统..空格分隔,短划线( - )组合多个单词。因此,当我验证用户输入标记字段时,我正在检查
我在这里遗失了什么?或者这大致可以吗?
答案 0 :(得分:2)
将字符串拆分为" "
,迭代各个部分,确保它们符合您的期望。如果有,请将它们放入数据库。
例如,您可以使用此正则表达式检查各个部分:
^[-\w]{2,25}$
这会限制允许输入到连续的字母数字字符串(和"_"
,它是"\w"
的一部分以及"-"
,因为你要求它)2..25个字符长。这基本上消除了您可能面临的任何代码注入威胁。
编辑:代替"\w"
,你可以自由选择range of characters,我选择它只是为了简单。
答案 1 :(得分:1)
确保您的算法可以处理前导/尾随/额外空格而没有问题=)
另外值得考虑的可能是不适当标签的标签黑名单(例如亵渎)。
答案 2 :(得分:1)
我从来没有实施过标记系统,但我很快就可以为我正在开发的项目这样做。我主要是一个数据库人员,我认为出于性能原因,最好通过解析表将标记实体与标记关键字相关联。因此,例如,使用示例表,例如:
<强> TechQuestion 强>
TechQuestionID(pk)
SubjectLine
QuestionBody
<强> TechQuestionTag 强>
TechQuestionID(pk)
TagID(pk)
有效(已编入索引)
代码强>
TagID(pk)
TagText(已编入索引)
...在使用从未使用过的标签时,您只需添加新的Tag表条目。您可以通过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
......或者你有什么。我不知道,也许这对每个人来说都是显而易见的,但我想我会把它放在那里......因为我不相信替代方案(冗余,索引,文本标签条目)不会查询有效。
答案 3 :(得分:0)
我希望你能做到常规防范注入攻击 - 可能包含在#2中。
至少,你想要转义引号字符并使嵌入式HTML无害 - 在PHP中,像addslashes和htmlentities这样的函数可以帮助你。鉴于它是一个标记系统,我的猜测是你只想要允许字母数字字符。我不确定最好的方法是使用正则表达式。