私はDjangoを初めて使用し、通常のGET urlクエリ文字列パラメーターを使用していくつかの記事をフィルターできるWebサイトで作業しています。これらのパラメーターはいくつかの入力フィールドから作成できます。これには2つの異なる方法がありますが、セキュリティについて心配しています。xssやcsrfのような脆弱性、またはURL内のいくつかの怖い文字について考える最も安全な方法はどれですか。
最初のオプションは、JavaScriptを使用して入力フィールドから値を収集して文字列に追加し、次にJavaScript関数「window.location.href」を使用してクライアントのURLを変更することです。ここではフォームを使用していません。サーバー側でのviews.py:
class IndexView(generic.ListView):
template_name = 'index.html'
model = Articles
def get_context_data(self, **kwargs):
if self.request.method == 'GET':
context = super().get_context_data(**kwargs)
queryObj={}
category = self.request.GET.get('category')
if category:
queryObj["category"] = category
#adds params to a dictionary if true
sub_category = self.request.GET.get('sub_category')
if sub_category:
queryObj["sub_category"] = sub_category
context['adrticleList']=Articles.objects.filter(**queryObj)
return context
DjangoフォームをGETアクションで作成することもできます。これにより、リクエストを検証し、{%csrf_token%}のようなDjangoの組み込みテンプレートタグでクライアントを保護できます。 。
これは単なるGETリクエストであり、ユーザーが機密データを送信することを期待していないので、本当に心配する必要がありますか?
また、フォームを使用する場合、私はかなり新しいので、クラスベースのビューは少し複雑になる可能性があります。関数ベースのビューを使用できますか、それともセキュリティミスの可能性が高くなりますか?
また、依存する動的選択ボックスを作成するためのajaxリクエストを実装することも計画しています。
考えやアドバイスをありがとう。
要求がべき等であるためCSRF保護が必要ない場合は、CSRFトークンは必要ありません。
ビューでrequest.GETを読み取っても、フォームがあってもなくても、セキュリティには影響しません。
関数ベースのビューまたはクラスベースのビューを使用しても、セキュリティには影響しません。
シンプルさは良いと思うので、関数ベースのビューを使用することをお勧めします。
フォームを使用してクエリパラメータを検証するのは、便利です。バリデーターを作成する必要がある場合、それをカスタムFormFieldまたはフォームのdef clean(一度に複数のフィールドに関するロジック)として作成するように構成されている場合は、フォームを使用する必要があります。同じ種類のデータを複数の場所で検証する場合は、「自分自身を繰り返さない」の原則にフォームを使用することは理にかなっています。