私の状況は次のとおりです。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
これのトラブルシューティングを手伝ってくれる人に前もって感謝します。そして、ここまで読んでいただきありがとうございます!