私はウェブサイトアップデーターを開発しています。フロントエンドはHTML、CSS、JavaScriptを使用し、バックエンドはPythonを使用します。
それが機能する方法は、<p/>
、<b/>
、およびその他のいくつかのHTML要素をユーザーが更新できることです。これを有効にするには、Webページをロードし、JQueryを使用して、これらすべての要素を<textarea/>
要素に変換します。テキスト領域のコンテンツが変更されたら、元の要素に変更を適用し、それをPythonスクリプトに送信して、新しいコンテンツを保存します。
問題は、ブラウザが異なれば元のHTMLが変わることに気付いたことです。
私が見つけた問題は次のとおりです。
class
およびid
属性を囲む引用符を削除します。たとえば、<img class='abc'/>
は<img class=abc/>
になります。<br \>
は<br>
になります。<img class='headingpic' /><div id="maincontent">
を<img class='headingpic'/>\n <div id="maincontent">
に変更すると垂直方向のギャップが挿入されますIEで。私がこれらの問題を克服しようとして失敗したこと:
>\n<
オカレンス、<br>
などを削除します。しかし、IEで異なるパターン、場合によっては∙\n
、場合によっては\n∙∙∙
を取得するため、これは失敗します。Web開発の最初のルールの1つは、クライアントを決して信頼しないことです。悪意のあるユーザーまたはバグのあるクライアントは、Javascriptで行うことをすべてバイパスし、サーバー側にフィードする可能性がありますPython不正な形式で有害な可能性があるHTMLなので、サーバー側Pythonそれが得るものは何でも標準化してクリーンアップする必要があります。
サーバー側でいくつかの作業を行う必要がある限り、Webブラウザーの気まぐれを完全に回避して、すべてをサーバー側で実行してみませんか? textareaの内容をサーバーに送信し、サーバー上で BeautifulSoup を使用してクリーンアップすることをお勧めします。
必要に応じて、クライアント側でtextareaからHTMLへの変換を実行して、変更のプレビューをユーザーに表示し、textareaのコンテンツをサーバーに送信することもできます。
まず、なぜあなたはそれをしているのですか?顧客がWebページのコンテンツを変更する可能性を提供する場合、次の2つのケースがあります。
直接HTML編集機能を使用する正当な理由がまだある場合は、HTMLを扱っていることを覚えておく必要があります。つまり、string.replace
はなく、正規表現はありません(太字で示していますが、Arial Black 200の太字で赤く点滅していると想像してください)。
入力を解析する必要があります。
プライマリ、フォーマットを正規化するためにそれを解析する必要があります。ここで、終了行を削除したり、<br>
を<br />
に置き換えたりします(質問のバックスラッシュについて話しているのですが、これはタイプミスですか?)。
また、それが有効なHTMLであることを確認する必要があります。ユーザーが開始タグと一致しない</div>
を追加した場合はどうなりますか?はい、おそらくページのレイアウトが崩れるでしょう。
最後に、入力をHTMLとして解析する最も重要な理由:検証する必要があります。
厄介なJavaScriptコードを含む<script/>
タグを追加するとどうなりますか?あなたを困らせるためだけにあなたのレイアウトを壊したい場合はどうなりますか?または、ユーザーをあなたのWebサイトから自分のWebサイトにリダイレクトしますか?仮に...
信頼できないソースによって変更されるHTMLコードを開いた場合は、遅かれ早かれ傷つくことを覚悟してください(ページのコンテンツに次の内容が含まれているため、Googleの結果によって禁止されていることを確認するのは決して楽しいことではありません。ウイルス)とあなたの顧客、二度と戻らない。