私はあなたが「投稿」するウェブサイトを作成しています。フォームのコンテンツはMySqlデータベースに保存され、ページをロードすると、Facebookのように取得されます。すべての投稿を作成し、生のhtmlをテンプレートに挿入します。テストをしていると、JavaScriptやその他のHTMLをフォームに書き込んで送信できることに気付きました。リロードすると、htmlまたはJSは投稿ではなくソースコードとして扱われます。いくつかの単純なエンコーディングでうまくいくと思いましたが、使用しても機能し<form accept-charset="utf-8">
ません。このタイプのセキュリティホールを防ぐための効率的な方法はありますか?
5 に答える
全体像を完全にするために、Pyramidでユーザー入力をサニタイズできる場所が2つあります。データベースにデータを保存する前と、データをレンダリングする前の2つの場所です。テンプレート。間違いなく、データベースにHTML / JavaScriptを保存することに何の問題もありません。テンプレートにレンダリングされるすべてのものが適切にエスケープされていることを確認する限り、それはあなたを悩ませることはありません。
実際、ChameleonとMakoの両方のテンプレートエンジンでは、デフォルトでHTMLエスケープがオンになっているため、「通常どおり」使用すると、ユーザーが入力したHTMLがページに挿入されることはありません。代わりに、次のようにレンダリングされます。文章。これがないと、ユーザーがデータを入力するすべてのフォームのすべてのフィールド(つまり、「便利な」テキストエリアウィジェットだけでなく、ユーザー名、ユーザーの電子メールなど)をチェックする必要があるため、ユーザー入力のサニタイズは困難な作業になります。 。)。
したがって、Pyramidをこのように動作させるには、何か変わったことをしている(または他のテンプレートライブラリを使用している)必要があります。使用しているテンプレートライブラリとコードサンプルの詳細を提供していただければ、適切な方法で修正する方法を見つけることができます。
あなたが説明しているタイプの攻撃は、「Javascriptインジェクション攻撃」または「クロスサイトスクリプティング(XSS)攻撃」と呼ばれます。あなたはそれを探してもっと運がいいかもしれません。 Pythonを使用してユーザー入力をサニタイズすることも同様の質問であり、かなり包括的な回答が含まれていますが、おそらくここが最善です。
<script>
、タグを別のものに置き換える<iframe>
か、文字列をhtmlエンコードして、ページにテキストとして表示されるが、ブラウザ自体ではレンダリングされないようにすることができます。
すべて<
の'と>
'を&ltと&gtで文字列置換することで、表示されているXSSを防ぐのに十分すぎるはずです。
私はこれを見つけました。これは、PythonでのXSS防止について説明しています。
少しはありますが、コードのブロックを記述して、html / javascriptコードの特定の重要な側面を認識し、それに応じて動作させることができます。たとえば、ブロックを認識し、そのクエリの受け渡しを許可しないか、編集して有効なhtmlではなくなるようにします。