2

その機能の 1 つは、ユーザーが入力した HTML 正規表現パターンを DB に保存し、設定ページに表示する機能である WordPress プラグインに取り組んでいます。

私の方法は実際に機能しますが、そのコードが十分に安全かどうか疑問に思います:

それはユーザーが入力したパターンです:

<div(.+?)class='sharedaddy sd-sharing-enabled'(.*?)>(.+?)<\div><\div><\div>

それが私がDBにHTMLパターンを保存している方法です:

$print_options['custom_exclude_pattern'] = htmlentities(stripslashes($_POST['custom_exclude_pattern']),ENT_QUOTES,"UTF-8"); 

それが実際にWordPress DBに保存される方法です:

s:22:"custom_exclude_pattern";s:109:"&lt;div(.+?)class=&quot;sharedaddy sd-sharing-enabled&quot;(.*?)&gt;(.+?)&lt;\div&gt;&lt;\div&gt;&lt;\div&gt;";

そして、それが出力が設定ページに表示される方法です:

<input type="text" name="custom_exclude_pattern" value="<?php echo str_replace('"',"'",html_entity_decode($print_options['custom_exclude_pattern'])); ?>" size="30" />

手伝ってくれてありがとう :)

4

3 に答える 3

1

コメントから、あなたは 2 つの別々の問題 (そして、すぐに言及する 3 つ目の問題に気付いていない可能性があります) について懸念しているように見えます。それぞれを個別に処理する必要があります。Defuse Security によるこの記事をお読みください。

SQL インジェクションを防ぐ方法

これは、一般的なPHPアプリケーションに関してStackOverflowで以前に回答されています。WordPressはプリペアード$wpdbステートメントをサポートしているため、PDO や MySQLi の操作方法を理解する必要はありません。(ただし、ドライバーの脆弱性はプラグ$wpdbインに影響します。ドキュメントをよく読んでください。

パラメータをプリペアド ステートメントに渡す前に、パラメータをエスケープしないでください。マンジされたデータになってしまうだけです。

クロスサイト スクリプティング

この記事の執筆時点 (2015 年 6 月) では、考慮すべき一般的な状況が 2 つあります。

  1. ユーザーは、HTML、CSS などをこの入力に送信することを許可されるべきではありません。
  2. ユーザーは HTML や CSS などをこの入力に送信できますが、そうすることでハッキングされることは望ましくありません。

最初の問題は簡単に解決できます。

echo htmlentities($dbresult['field'], ENT_QUOTES | ENT_HTML5, 'UTF-8');

2 番目の問題は少しトリッキーです。特定のマークアップのみを許可し、Javascript をユーザーのブラウザーで実行するために利用できる他のマークアップを誤って許可しないようにする必要があります。一部の HTML を許可しながら XSS 防御を行う現在のゴールド スタンダードはHTML Purifierです。

重要!

要件が何であれ、データをデータベースに挿入する前ではなく、常に出力時に XSS 防御を適用する必要があります。最近、Wordpress コアに保存されたクロスサイト スクリプティングの脆弱性がありました。これは、レンダリング前にエスケープするのではなく、保存する前にエスケープするという決定に起因します。十分に長いコメントを提供することで、攻撃者はエスケープされたテキストで MySQL の切り捨てバグを引き起こし、防御を回避することができました。

おまけ: からの PHP オブジェクト インジェクションunserialize()

それが実際にWordPress DBに保存される方法です:

s:22:"custom_exclude_pattern";s:109:"&lt;div(.+?)class=&quot;sharedaddy sd-sharing-enabled&quot;(.*?)&gt;(.+?)&lt;\div&gt;&lt;\div&gt;&lt;\div&gt;";

serialize()このデータを保存するときに使用しているようで、おそらくunserialize()取得するときに使用しているようです。注意してくださいunserialize(); ユーザーが文字列を制御できるようにすると、コードにPHP オブジェクトが挿入され、リモートでコードが実行される可能性があります。

記録として、リモートでコードが実行されるということは、ウェブサイト全体と、場合によってはブログをホストするサーバーを乗っ取ることができることを意味します。ユーザーがこのレコードを直接変更できる可能性がある場合は、代わりにjson_encode()andを使用することを強くお勧めしjson_decode()ます。

于 2015-06-11T15:10:26.267 に答える
1

そうでない場合は、私を修正してください。データベースに保存されている同じパターンに基づいて、入力フィールドのパターンを動的に挿入しようとしていますよね?個人的には、毎回送信して更新しなくても自分の入力形式が正しくないことをユーザーが認識できるという点で、パターンはユーザビリティーの良い助けになると思います。パターンの大きな問題は、HTML コードをクライアント側で変更できることです。唯一の安全な解決策は、サーバー側で入力の正確性を確認することだと思います...クライアント側の手順がサーバー側の手順よりも安全になる方法はありません!

于 2015-06-11T03:19:08.320 に答える