0

この質問は少し安っぽく聞こえるかもしれませんが、自分のプロジェクト サイトの 1 つに "タグ付け" 機能を実装するのはこれが初めてで、すべてが正しく行われていることを確認したいと考えています。

現在、私は SO とまったく同じタグ付けシステムを使用しています。スペースで区切られ、ダッシュ (-) で複数の単語が結合されています。そのため、ユーザー入力タグフィールドを検証するときに、チェックしています

  1. 空の文字列 (空にすることはできません)
  2. 文字列に特定の文字が含まれていないことを確認してください (ここでは提案を歓迎します..)
  3. 少なくとも 1 つの単語
  4. スペースがある場合 (複数の単語がある場合)、文字列を分割します
  5. 分割されたそれぞれについて、dbに挿入します

ここで何か不足していますか?または、これはおおよそ大丈夫ですか?

4

4 に答える 4

2

で文字列を分割" "し、パーツを反復処理して、期待どおりであることを確認します。もしそうなら、それらをDBに入れます。

たとえば、この正規表現を使用して個々の部分を確認できます。

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

これにより、許可される入力が英数字の連続した文字列 (および"_"の一部であり、"\w"要求"-"したため) 2..25 文字の長さに制限されます。これにより、直面している可能性のあるコード インジェクションの脅威が本質的に排除されます。

編集: の代わりに、"\w"より厳密に定義された範囲の文字を自由に使用できます。簡単にするために選択しました。

于 2009-01-23T20:13:32.477 に答える
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 に答える
1

アルゴリズムが先頭/末尾/余分なスペースを問題なく処理できることを確認してください = )

また、不適切なタグ (冒とく的な表現など) のタグ ブラックリストについても検討する価値があります。

于 2009-01-23T20:17:53.073 に答える
0

インジェクション攻撃に対する通常の保護を行っていることを願っています-おそらくそれは#2に含まれています.

少なくとも、引用符文字をエスケープして、埋め込まれた HTML を無害にしたいと思うでしょう。PHP では、 addslasheshtmlentitiesなどの関数がそれを手助けしてくれます。タグ付けシステム用であることを考えると、英数字のみを許可する必要があると思います。おそらく正規表現を使用して、それを達成するための最良の方法が何であるかはわかりません。

于 2009-01-23T20:06:37.903 に答える