通常、私の職務記述では、Webアプリケーションのコードレビューに限定されています。最近では、サーバーサイドPHPの最適化を支援するように依頼されましたが、慣れていますが経験がありません。
と呼ばれる構成設定に遭遇しました:
disable_functions
この設定を使用することで知っておくべき影響はありますか(明らかな関数x()が無効になり、関数x()を使用するアプリケーションが機能しなくなる場合を除きます)?
それが私が利用すべきものである場合、私は危険であるかもしれない多くの機能のリストを思い付くことができますが、いくつかは関係なく必要になるかもしれません。誰かがリストを持っていますか、またはどの機能を無効にする必要があるか、なぜ私が見落とし/見落としているのかについて追加するためのいくつかの提案がありますか?
安全ではない機能をたくさん知っていますが、サーバー構成の経験が不足しているので、洞察をいただければ幸いです。
[〜#〜] edit [〜#〜]:トピックがオンかオフかに関する質問を明確にするために、PHP環境の最適化を支援するように依頼されましたセキュリティ、しかし私は前述の構成設定について具体的に尋ねています。 :)
ここで理解しなければならないことがいくつかあります。
strlen
などはおそらく安全ですが、コードの残りの部分が安全でない場合、外部の世界と通信する関数は驚きをもたらす可能性があります。disable_functions
を使用して、危険と思われる一部のアクションを禁止できますが、この方法で禁止できるのは特定のクラスのアクションのみです。たとえば、exec,Shell_exec,popen,passthru,proc_open,system,pcntl_exec
を無効にすると、コードから外部プログラムを実行できなくなる可能性があります-しかし、これらのプログラムによって行われるほとんどのことは、PHPの意味でも行えます。そして「ファイルの書き込み」などを回避しようとしても機能しない可能性があります。これは、PHPではなくOSの権限で行う必要があります。そのため、最初に禁止する内容を明確に定義し、それが可能かどうかを確認します。それは不可能かもしれません。security=On
を設定するだけでは行われませんphp.ini
、残念ながら。これに関して心配する必要がある唯一の問題は、実際に必要な機能を無効にすることです。機能を無効にすることは間違いなく乱用を防ぐのに役立ちます。実際、exec、Shell_execなどの機能があり、共有ホスティング環境ではほとんど使用すべきではありません。
ただし、この機能に依存するだけでなく、一般的なセキュリティへの取り組みを検討する必要があります。たとえば、suPHPなどを使用すると、一連の攻撃全体を防ぐことができ、セキュリティの確保が少し簡単になります。機能を無効にすることはあなたが心配する最後の事であるはずです、あなたはそれを心配する前にあなたのサーバーは安全でなければなりません。
WebサイトまたはWebサーバーをホストしている場合、PHPに関数があり、PHPスクリプトを使用してWebサイトまたはWebサーバーを悪用するために使用できます。この危険な関数ハッカーを使用すると、ルートレベルまでWebサーバーを完全に制御できます。
PHP developmentで危険な関数のリスト
「Apache_child_terminate、Apache_setenv、define_syslog_variables、escapeshellarg、escapeshellcmd、eval、exec、fp、fput、ftp_connect、ftp_exec、ftp_get、ftp_login、ftp_nb_fput、ftp_put、ftp_raw、ftp_rawlist、pass_inlog、inp_inlog、inp_restore_initiator_inp_get_inlog、in_get_inlog、in_get_inlog、in_get_inp_in_log、in_get_inp_log、in ___ in___in___in_log_in_get_file 、php_uname、phpAds_remoteInfo、phpAds_XmlRpc、phpAds_xmlrpcDecode、phpAds_xmlrpcEncode、popenの、posix_getpwuid、posix_kill、posix_mkfifo、posix_setpgid、posix_setsid、posix_setuid、posix_setuid、posix_uname、proc_close、proc_get_status、ではproc_nice、は、proc_open、proc_terminate、もしくはshell_exec、syslogの、システム、xmlrpc_entity_decode」
PHPで危険な関数を無効にする方法
"php.ini"
ファイルを見つけます。disable_functions=
を見つけます次に、上記のすべての関数を次のようにdisable_functionsに追加します
disable_functions = "eval、system"
^^ここで私は2つの機能のみを無効にしました。disable_functions = "無効にする機能のリストをコンマで区切って、機能のリストを与えることにより、任意の数の機能を無効にできます"
上記の各機能が正確に何を意味するかを知りたい場合は、上記の機能をここで検索してください
しないでください[〜#〜]しない[〜#〜]disable_functionsをセキュリティ機能と見なしてください。
Stackoverflowの別の質問の 私の以前の回答 を参照してください-でもPHPは考慮しませんdisable_functions
および実際のセキュリティ機能と同様。
PHPには本質的に危険な関数はありません。 OTOH PHPのコア機能を使用するだけで、非常に安全でないプログラムを書くのは非常に簡単です。 IMHO、 'disable_function'は、システムを適切に保護できない、またはできない人々のためのプラシーボです。
誤解しないでください-システム管理者として、サーバーを保護するために他にも多くのことを行う必要があります-可能な限りopen_basedirを設定する、強力なアクセス許可モデルを適用する、ドキュメントルートの外部にインクルードパスを保持する(または直接) HTTPアクセスはこれらのディレクトリから無効にされました)、そしてもっとたくさん。
サーバー側のいくつかの支援を依頼されましたPHP最適化
ここで最適化またはセキュリティについて話しているのですか?
2019年現在、私はスタートアップと協力して、開発を始めているときにホワイトリストを作成することに反対していましたが、ブラックリストが必要でした。 AWS SDKのファイルシステムとcURLライブラリへのアクセスが必要でしたが、カスタムHTTP呼び出しを使用しているため、ソケットストリームを使用してSDKに依存できません。
重要なのは、これはシステムを保護するために利用される唯一の手法とはかけ離れていたということです。ただし、さまざまなエクスプロイト/シェルでよく見られるスクリプトやテクニックがいくつか使用されているため、誰かが許可できないものをなんとか編集して、さらにダメージを制限したいというシナリオでは、私が使用したリストは:
disable_functions = Apache_child_terminate,Apache_setenv,chgrp,chmod,chown,curl_multi_exec,define_syslog_variables,eval,exec,highlight_file,openlog,parse_ini_file,parse_ini_string,passthru,php_uname,popen,posix_kill,posix_setpgid,posix_setsid,posix_setuid,proc_open,Shell_exec,show_source,syslog,system
私はPHPにかなりの数年触れていませんが、私が読んだことから
disable_functions
共有ホスティングの状況に最適です。