2

私の状況は次のとおりです。CakePHP と MySQL で構築された Web サイトがあります。私の Web サイトには、メンバーがコード サンプルを投稿できる公開フォーラムがあります。これらのコード サンプルの一部には、PHP および MySQL コードが含まれます。

これを許可するのはおそらく危険なことだと理解していますが、1 つ: 私が明確に「承認」したメンバーのみが投稿できます。2 つ: CakePHP は既にパラメーター化されたクエリを使用していると思います...そして、まだあると確信していますが、他のリスクが関係していますが、それは私の質問が関係しているものではありません。

問題:

私のローカルのテスト環境では、SQL ステートメントと文字列を含む投稿を php コードのように送信できます<?php phpinfo(); ?>。しかし、実稼働サーバーでまったく同じコードを実行すると、できません。

にリダイレクトされるのではなく/posts/index(通常、投稿後に発生します)、以前に表示していたのと同じページにリダイレクトされます (/posts/edit/25たとえば、)。「違法な」部分文字列を含むフォームデータを送信しようとすると、送信が黙って失敗し、CakePHP が以前の場所に戻ってしまうようです。(CakePHP に代わってフラッシュ メッセージはありません。)

これまでの私の診断:

/www/app/tmp/logs/error.logこのデータを投稿しようとした後、CakePHPはエラーの兆候を示しません。現在、他のサーバー ログ ファイルにはアクセスできません。

投稿からいくつかの php コードを削除してみました。のような文字列を送信することはできましたが<?php echo 'Hello World'; ?>フォーム データのどこかに のような関数があるphpinfo()と、投稿は「拒否」されます。SQL の例に非改行スペースを詰め込むことで、SQL ステートメントを含むフォーム データを送信することも可能になりました。

CakePHP が使用する MySQL ユーザー アカウントは少し制限されています。実行が許可されているアクションを正確に忘れてしまいましたが、それらはselect, insert, update, delete, create, drop.

ただし、phpMyAdmin をローカルで使用して運用データベースを管理し、phpMyAdmin を介してアクセスするときは、最大の権限を持つ管理者アカウントを使用しています。また、phpMyAdmin を使用して手動でデータを変更するphpinfo();と、コード例のような文字列は拒否されません!

これはほんのわずかな希望のように思えましたが、MySQL 管理者ユーザーを最大権限で使用するように CakePHP セットアップでサイトをテストしましたが、安全でない文字列をユーザー向けフォームから送信することはできません。


これまでの私の不満足な結論:

私の環境によってまったく同じ php コードの動作が異なるため、これは私の PHP のバージョン、MySQL のバージョン、またはシステム管理者が導入した何らかのセキュリティ対策と関係があると思われます。

ただし、システム管理者と連絡を取るのはかなり難しいので、自分で問題の原因を突き止めようとしています。

私の質問:

私の問題は何ですか?「安全でない」文字列を禁止する PHP 設定、またはシステム管理者に変更を要求できるその他の一般的に知られている設定はありますか? それとも、これは MySQL の設定でしょうか? (私の phpMyAdmin には、Cake ではできないことを実行できる奇妙な機能があるため、判断するのは困難です。) または、この問題を診断するにはどうすればよいでしょうか? (自分で; または、システム管理者にどのような質問をする必要がありますか?)


役立つ可能性のあるその他のデータ:

したがって、これは phpMyAdmin による私のローカル テスト環境です。

Database server
---------------
Server: Local codeTech Server (Localhost via UNIX socket)
Server type: MySQL
Server version: 5.5.34-0ubuntu0.13.04.1 - (Ubuntu)
Protocol version: 10
User: root@localhost
Server charset: UTF-8 Unicode (utf8)

Web server
----------
Apache/2.2.22 (Ubuntu)
Database client version: libmysql - 5.5.34
PHP extension: mysqli

そして、これが私の本番サーバーの環境です。

Database server
---------------
Server: Sam's Remote Server (XXX.XXX.XXX.XXX via TCP/IP)
Server type: MySQL
Server version: 5.1.70-cll - MySQL Community Server (GPL)
Protocol version: 10
User: XXX@XXX.com
Server charset: UTF-8 Unicode (utf8)

Web server
----------
Apache/2.2.22 (Ubuntu)
Database client version: libmysql - 5.5.34
PHP extension: mysqli

それが助けになるなら、両方のサーバーの phpinfo の一部を投稿したいと思います。

問題の診断に役立つ可能性のある phpinfo から得たいくつかのこと:

ローカル:

  • PHP バージョン 5.4.9-4ubuntu2.3
  • Zend エンジン v2.4.0

製造:

  • PHP バージョン 5.3.26
  • Zend Engine v2.3.0、Copyright (c) 1998-2013 Zend Technologies
    • ionCube PHP Loader v4.2.2、Copyright (c) 2002-2012、ionCube Ltd.、および
    • Zend Guard Loader v3.3、Copyright (c) 1998-2010、Zend Technologies による
    • Suhosin v0.9.33、著作権 (c) 2007-2012、SektionEins GmbH
  • このサーバーは Suhosin Extension 0.9.33 で保護されています

この「Suhosin」拡張機能が何か関係があるのではないかと思いますが、その方法はよくわかりません...

彼らのページ ( http://www.hardened-php.net/suhosin/a_feature_list.html ) では、いくつかの「保護」が行われている可能性があることが示唆されています。

  • 開いている phpinfo() ページの透過的な保護
  • 実験的な SQL データベースのユーザー保護
  • フィルタリング機能
    • 違反に対する設定可能なアクション
    • 違反している変数をブロックするだけです
    • HTTP 応答コードを送信する
    • ブラウザをリダイレクトする

実際、これは非常に疑わしいように聞こえます。このことについては、おそらくシステム管理者と話し合う必要があります。残念ながら、Suhosin に関するドキュメントはまばらすぎて、それが実際に原因であるかどうかを知ることができないため、まだ他のすべてを除外したくありません。

それでも、それは重要なことかもしれません。これらは Suhosin の設定です。私にはあまり意味がありませんが、一部の PHP ウィザードはいくつかの重要なキーワードを強調表示できる可能性があります。

Directive   Local Value Master Value
suhosin.apc_bug_workaround  Off Off
suhosin.cookie.checkraddr   0   0
suhosin.cookie.cryptdocroot On  On
suhosin.cookie.cryptkey [ protected ]   [ protected ]
suhosin.cookie.cryptlist    no value    no value
suhosin.cookie.cryptraddr   0   0
suhosin.cookie.cryptua  On  On
suhosin.cookie.disallow_nul 1   1
suhosin.cookie.disallow_ws  1   1
suhosin.cookie.encrypt  Off Off
suhosin.cookie.max_array_depth  50  50
suhosin.cookie.max_array_index_length   64  64
suhosin.cookie.max_name_length  64  64
suhosin.cookie.max_totalname_length 256 256
suhosin.cookie.max_value_length 10000   10000
suhosin.cookie.max_vars 100 100
suhosin.cookie.plainlist    no value    no value
suhosin.coredump    Off Off
suhosin.disable.display_errors  Off Off
suhosin.executor.allow_symlink  Off Off
suhosin.executor.disable_emodifier  Off Off
suhosin.executor.disable_eval   Off Off
suhosin.executor.eval.blacklist no value    no value
suhosin.executor.eval.whitelist no value    no value
suhosin.executor.func.blacklist no value    no value
suhosin.executor.func.whitelist no value    no value
suhosin.executor.include.allow_writable_files   On  On
suhosin.executor.include.blacklist  no value    no value
suhosin.executor.include.max_traversal  0   0
suhosin.executor.include.whitelist  no value    no value
suhosin.executor.max_depth  0   0
suhosin.filter.action   no value    no value
suhosin.get.disallow_nul    1   1
suhosin.get.disallow_ws 0   0
suhosin.get.max_array_depth 50  50
suhosin.get.max_array_index_length  64  64
suhosin.get.max_name_length 64  64
suhosin.get.max_totalname_length    256 256
suhosin.get.max_value_length    512 512
suhosin.get.max_vars    100 100
suhosin.log.file    0   0
suhosin.log.file.name   no value    no value
suhosin.log.phpscript   0   0
suhosin.log.phpscript.is_safe   Off Off
suhosin.log.phpscript.name  no value    no value
suhosin.log.sapi    0   0
suhosin.log.script  0   0
suhosin.log.script.name no value    no value
suhosin.log.syslog  no value    no value
suhosin.log.syslog.facility no value    no value
suhosin.log.syslog.priority no value    no value
suhosin.log.use-x-forwarded-for Off Off
suhosin.mail.protect    0   0
suhosin.memory_limit    0   0
suhosin.mt_srand.ignore On  On
suhosin.multiheader Off Off
suhosin.perdir  0   0
suhosin.post.disallow_nul   1   1
suhosin.post.disallow_ws    0   0
suhosin.post.max_array_depth    50  50
suhosin.post.max_array_index_length 64  64
suhosin.post.max_name_length    64  64
suhosin.post.max_totalname_length   256 256
suhosin.post.max_value_length   1000000 1000000
suhosin.post.max_vars   1000    1000
suhosin.protectkey  On  On
suhosin.request.disallow_nul    1   1
suhosin.request.disallow_ws 0   0
suhosin.request.max_array_depth 50  50
suhosin.request.max_array_index_length  64  64
suhosin.request.max_totalname_length    256 256
suhosin.request.max_value_length    1000000 1000000
suhosin.request.max_varname_length  64  64
suhosin.request.max_vars    1000    1000
suhosin.server.encode   On  On
suhosin.server.strip    On  On
suhosin.session.checkraddr  0   0
suhosin.session.cryptdocroot    On  On
suhosin.session.cryptkey    [ protected ]   [ protected ]
suhosin.session.cryptraddr  0   0
suhosin.session.cryptua Off Off
suhosin.session.encrypt On  On
suhosin.session.max_id_length   128 128
suhosin.simulation  Off Off
suhosin.sql.bailout_on_error    Off Off
suhosin.sql.comment 0   0
suhosin.sql.multiselect 0   0
suhosin.sql.opencomment 0   0
suhosin.sql.union   0   0
suhosin.sql.user_postfix    no value    no value
suhosin.sql.user_prefix no value    no value
suhosin.srand.ignore    On  On
suhosin.stealth On  On
suhosin.upload.disallow_binary  0   0
suhosin.upload.disallow_elf 1   1
suhosin.upload.max_uploads  25  25
suhosin.upload.remove_binary    0   0
suhosin.upload.verification_script  no value    no value

これのトラブルシューティングを手伝ってくれる人に前もって感謝します。そして、ここまで読んでいただきありがとうございます!

4

1 に答える 1

0

環境間の PHP 設定の違いについては、開発環境と本番環境での phpinfo() 実行の結果を比較する必要があります。バージョンによっては、magic_quotes を有効にしたり (BAD IDEA!)、コードに影響を与えるその他の構成を設定したりできます。1 つずつ比較するだけで違いが得られます。ほとんどすべての場合 (display_errors などを除く) は排除する必要があります。本番環境と開発環境では異なる必要があります)。

MySQL について: クエリに応じて使用する 2 つの異なるユーザーが必要です。 DROP は Web サイトでは必要なく、潜在的なセキュリティ エクスプロイトの対象となります)

通常、「読み取り」ユーザーを使用し、書き込みが必要な特定のクエリに対して「書き込み」に変更するだけです。

私はあなたの問題がPHPにあるとは思わない(ただし、phpinfoを確認してください)そしてMySQLにはないことを確認してください. 、もうわかりません。

スホシンについて聞いたことがありません。もし私があなたなら、最初のステップはそれを無効にすることです. PDO のバインディング関数php フィルターを使用することは、追加のプラグインなしで安全なオプションになります。

于 2013-11-06T22:42:41.680 に答える