web-dev-qa-db-ja.com

64以上のKb=のデータが含まれる本文をどうやって持つことができますか?

Bodyフィールドにデータが多すぎるノードを作成すると、その後の編集が保存されないことに気付きました。または、保存が続行され、ノードの表示に戻りますが、コンテンツは変更されていません。

徹底的な試行錯誤の結果、本体の長さが64未満の保存はKbでうまく保存できましたが、それ以上の保存は保存されないことを確認できました。

これの原因は何ですか?それを回避する方法はありますか?

3
Rimu Atkinson

この問題の原因は、PCREがpcre.backtrack_limitまたはpcre.recursion_limitに設定された制限に達する正規表現です。
drupal.orgで切り捨てられたボディコンテンツに関する問題レポートがありました。切り捨てられる前に入力できるテキストの長さは、使用される文字(英語のテキストはすべてのUnicode文字を含むテキストよりも長い場合があります)と、pcre.backtrack_limitおよびpcre.recursion_limitに設定された値によって異なります。

私が話している問題レポートは ドキュメントの可能性のあるpregメモリ問題 です。 Gerhard Killesreiter のコメントは次のとおりです。

この問題[本文のコンテンツが切り捨てられる]は、有効なUTF8を投稿したことを検証するために使用するPerl正規表現の制限が原因です。

Settings.phpファイルの制限を増やすと、テキストが表示されます。

ini_set('pcre.backtrack_limit', 200000);
ini_set('pcre.recursion_limit', 200000);

どの値が有効かを実験する必要があります。

node_schema() は、node_revisionsテーブルの本文フィールドを「ビッグテキスト」として定義します。これは、MySQLではノード本体の最大長が4 GBであり、PostgreSQLでは(理論的には)制限がないことを意味します。どちらの場合も、制限は監視している64KBではありません。

Default.settings.phpファイルには、次のコメントが含まれています。

/**
 * If you encounter a situation where users post a large amount of text, and
 * the result is stripped out upon viewing but can still be edited, Drupal's
 * output filter may not have sufficient memory to process it.  If you
 * experience this issue, you may wish to uncomment the following two lines
 * and increase the limits of these variables.  For more information, see
 * http://php.net/manual/en/pcre.configuration.php.
 */
# ini_set('pcre.backtrack_limit', 200000);
# ini_set('pcre.recursion_limit', 200000);
8
kiamlaluno

Suhosinが有効になっているサイトの場合、これはPOST value lenght。

_suhosin.post.max_value_length=65000_はSuhosinのデフォルトです(追加するまで_/etc/php5/conf.d/suhosin.ini_にはない場合があります)。

この設定はphpinfo()の出力に表示されます。

2
Chris Burgess

一部のディストリビューションには、セキュリティの名のもとに着信要求に追加の制限を適用するパッチが含まれています。 DebianがPHPに含めるセキュリティパッチによって適用される制限を増やすことで解決された「多すぎる」パラメータを含むWebフォームの送信に問題がありました。

PHPおよび/またはHTTPサーバーのエラーログを調べて、長すぎるリクエストなどの記述がないかどうかを確認することをお勧めします。

0
thsutton