2016-10-13 15 views
0

PHPでsed shellコマンドを実行して、ファイル内の文字列を変更しようとしています。 ファイルが/etc/text.txtに位置しており、私は次のコードを使用して、そのファイル内のテキストを変更しよう:PHPがsed shellコマンドを実行します

$old_path = getcwd(); 
chdir('/etc/'); 
$cmd = "sed -i 's/footext/newtext/g' text.txt"; 
exec($cmd); 
chdir($old_path); 

しかしTEXT.TXTでテキスト「footextは」変更されません。

私はこの問題を解決するため

おかげで、私はシステムファイルを変更するには、(パブリック)は、Webサーバーを可能にする再反復固有の危険性をしたいすべての

+1

あなたの 'www-data'のようなものか、それともどんなユーザでもそのディレクトリに書き込む権限がありません。引用:_ Apacheユーザ(www-データ)が/ etcを書き込んだり修正することができれば、すべてのシステムが妥協しています。 –

+0

PHPスクリプトからアクセスするには、ファイルのグループ(chown参照)を同じグループに変更する必要がありますapache/phpが動作し、chmodを介して適切なグループ権限を与えます。セキュリティのために、apacheは/ etc内のファイルだけにアクセスする必要があります。 –

+0

正規表現を閉じる必要がある一重引用符がない場合は、誤植ですか? –

答えて

0

ファーストを助けてください。このを実行するとはシステムを侵害する攻撃者につながりますが、それは時間がかかることの唯一の質問です。

つまり、コードにはいくつかの問題があります。その第一は、外部の第三者(シェル)コマンドへの依存です。代わりに純粋なPHPで行うことができます。
テキストを編集することは、結局はPHPの主な強みの1つであり、コードは非常に簡単です。例として...これの

if (!$content = file_get_contents ($filename)) { 
    // Handle errors opening/reading the file here. 
} 

// Assuming case-sensitive search and replace here, as per the `sed` used. 
$content = str_replace ("old text", "new text", $content); 

if (!file_put_contents ($filename, $content)) { 
    // Handle errors with writing to the file here. 
} 

主な利点は、あなたが(sedはかなりユビキタスであっても)存在することが関係のない第三者のプログラムに頼る必要がないことです。これにより、コードは理解しやすく、自己完結型であり、プラットフォームには無関心です(可能な限り)。

あなたのコードがうまくいかない理由については、これもファイルのアクセス許可と関係があると思われます。コメントに記載されているように、www-dataユーザーにはデフォルトで/etc/フォルダーに書き込む権限がありません。したがって、ファイルをそこで編集できるようにするには、まずroot対応のユーザーでファイルを作成し、所有権をwww-dataに変更する必要があります。
ただし、ではなく、は、このフォルダ内の既存のファイルに対してこれを行います。意図しない致命的な副作用の可能性はあまりにも大きいです!

PHPスクリプトでシステムファイルを変更する必要がある場合は、シェルスクリプトを作成し、crontabなどのような方法で呼び出すことができます。 の後に入力が100%虐待から安全であることを100%保証しました。 (IE:印刷可能な文字のみ、好ましくはASCII。)

+0

さて、どうもありがとうございました。それは本当に私を助けてくれました。 – Mac

+0

私はお手伝いできることを嬉しく思います。 :) – ChristianF

関連する問題