プランセスSPHP・トラブルシューティング


  1. 難読化すると動作しなくなりました(挙動が変わりました)。何が原因でしょうか?
  2. 難読化したら文字化けしました。対処法は?
  3. 前までは動いていたのに、今日気づいたら、MD5エラーが出るページがあります。なぜですか?
  4. 特定のPHPソースで動作しないなどの既知の問題はありますか?
  5. オリジナルのファイルをなくしました。復元していただけますか?
  6. クレジット表示機能(アラート形式)を利用していますが、表示されないことがあります。なぜでしょうか?
  7. 「『<?php』に対応する『?>』が見つからない。」とのエラーが出ますが、これはわざとです。このエラーメッセージが出ないようにしたいのですが・・・
  8. 「Warning: Cannot modify header information - headers already sent〜」のエラーが出ることがあります。
  9. アドバンスドでライブラリー(外部ファイル)を難読化してみると、「Warning: require(./****.php) [function.require]: failed to open stream: No such file or directory in 〜」のエラーが出ます。
  10. PHPソースは確かに難読化されましたが、PHPファイルを実行した後、ブラウザでソースを表示させてみると、そのままです。
  11. 体験版を使っていますが、難読化すると実行速度が少し遅くなります。
  12. 正規表現でpreg_replaceを使っていますが、正しく動作しません。PHPの実行エラーが発生したり、プログラムソースの一部がそのままブラウザに表示されます。
  13. 自社の環境では問題ないのですが、クライアント先の環境では一部文字化けするという報告をもらいました。どのような原因が考えられますか?
  14. 難読化を行っていたら、エンコードのアルゴリズム「ベーシック」では駄目なので、「ベーシック強化版」や「アドバンスド」を使うようにというエラーメッセージが出ます。
  15. グローバル変数を関数内で参照するために、「global $hogehoge;」のようにしていますが、エンコードのアルゴリズムを「ベーシック強化版」や「アドバンスド」にすると警告が出ます。「ベーシック強化版」のままで難読化するにはどうすればいいのでしょうか?
  16. 「Fatal error: Call to undefined function: mb_convert_encoding() in 〜」と表示されます。
  17. SPHPで難読化していると、「『』の数が合っていないとプログラムは判断しました。〜error_code=close_tag_again」と表示されます。絶対そんなことはないはずなのに、どうしてでしょうか?
  18. 難読化すると、register_globals=onにしているのに、変数を取得できません。
  19. コマンドライン版のPHPソースを難読化して実行すると、$argvや$argcを取得できません。

1.難読化すると動作しなくなりました(挙動が変わりました)。何が原因でしょうか?
申し訳ありませんが、まず、こちらのページに書かれている手順に従った診断テストをお客様側で行っていただいてから、サポートにご相談いただけますと幸いです。


2.難読化したら文字化けしました。対処法は?
まずは難読化前は文字化けしていなかったかをご確認ください。難読化前は文字化けしていなかった場合は、「header("Content-type: text/html;charset=Shift_JIS");」(Shift_JIS出力の場合。)のように、文字コードを明示的にレスポンスヘッダーで指定するようにしてください。

また、オリジナルのPHPソース(文字コードがEUC-JP)では文字化けしないのに、特定の文字のみ文字化けする場合は、こちらをご参照ください。


3.前までは動いていたのに、今日気づいたら、MD5エラーが出るページがあります。なぜですか?
エンコードのアルゴリズムを「アドバンスド」にされている場合だと思われますが、考えられる理由は外部ファイルのファイル名を使いまわしてはいけない場合に使いまわしている場合です。

  1. PHPファイルの文字コードが違う場合。

  2. 「6.ライセンス管理及びお試し版(trial)提供のための補助機能」の設定が少しでも異なる場合。

  3. 「プランセスSPHP」をアップデートした場合。
はファイル名を変えていただく必要があります。この場合、エラーが出ているPHPファイルの難読化をもう一度やり直していただければ、動作するはずです。


4.特定のPHPソースで動作しないなどの既知の問題はありますか?
こちらをご参照ください。

  

5.オリジナルのファイルをなくしました。復元してくれますか?
オリジナルのファイルは必ずバックアップしてから難読化作業を行うようにしてください。オリジナルのソースへの復元は有料となります。サポート(info@sphp.jp)にご相談ください。また、必ず復元できるという約束もできません。少なくとも、削除されたコメント・タブ文字などの復元は不可能です。

  


6.クレジット表示機能(アラート形式)を利用していますが、表示されないことがあります。なぜでしょうか?
いくつかの理由が考えられます。第一に、このPHPプログラムの実行のたびにアラート形式でクレジットを表示させる機能は、アラートをJavaScriptで表示させていますので、ブラウザのJavaScriptを無効にされている場合は表示されません。

第二に、この機能は、表示頻度を毎回ではなく「3回に1回」「10回に1回」などと選択できるようにしています。お客様がそのように(意図せずに)設定されている可能性もありえます。お手数ですが、念のため、ご確認ください。

第三に、Content-type出力が「text/html」以外である場合、例えば「image/jpeg」などの場合は、表示されません。

もう一つ理由が考えられますが、ここには書くことができません。お手数ですが、サポート(info@sphp.jp)にご相談ください。

  


7.「『<?php』に対応する『?>』が見つからない。」とのエラーが出ますが、これはわざとです。このエラーメッセージが出ないようにしたいのですが・・・
ステップ1で、「【コーディングスタイル】ファイル終端における PHP ブロックの終了タグ「?>」を省略している。」というチェックボックスにチェックを入れてください。バージョン1.03c(2012年6月23日リリース)以降で対応しています(下の画像参照)。構文チェックがスキップされますので、難読化が可能になります。



しかし、この機能はできるだけ使わないようにしてください。お尋ねのエラーメッセージが表示される場合のほとんどは、お客様が意図的に終了タグの「?>」を省略される書き方をされているからと思われますが、そうでないのに表示される場合は、該当ソースに対して、弊社の難読化対象の文字列を決定するプログラム(SPHP)に問題があるということになります。このような場合に、「【コーディングスタイル】ファイル終端における PHP ブロックの終了タグ「?>」を省略している。」機能が有効になっていますと、本当は難読化対象の文字列を決定するプログラム(SPHP)に不具合が発生しているのに強行突破されることになりますから、生成されるPHPソースもほぼ100%バグっている結果になるでしょう。そうなりますと、難読化後のソースに問題が発生しても、何が問題で不具合が発生しているのか特定するのが非常に困難になります。

ですから、includeやrequireして読み込まれるファイルだからという理由などで意図的に「?>」を省略されていた場合も、「?>」の後ろに余計な改行やスペースを入れないように注意していただきながら「?>」を追加していただき、「【コーディングスタイル】ファイル終端における PHP ブロックの終了タグ「?>」を省略している。」のチェックはしないままにしていただいた方が、難読化による不具合を避けるという観点では無難です。

  


8.「Warning: Cannot modify header information - headers already sent〜」のエラーが出ることがあります。
他のPHPファイルからrequireもしくはinclude読み込む外部ファイルの難読化+クレジット表示機能(アラート形式)を行われていませんか? その場合の解決策は、こちらをご参照ください。

  


9. アドバンスドでライブラリー(外部ファイル)を難読化してみると、「Warning: require(./****.php) [function.require]: failed to open stream: No such file or directory in 〜」のエラーが出ます。
まず、他のファイルからrequire(or include)されている外部ファイル(ライブラリー)を難読化する際は、ステップ1のファイル選択画面で、左のような「ライブラリーである旨」のチェックボックスにチェックを入れていただくと、その場合の諸注意事項がウイザード途中で随所に現れますので、大方のトラブルは回避できるはずです。

ステップ1でライブラリーである旨のチェックをしていただいた上で、アドバンスドを選択していただくと表示される注意書きにありますように、

・外部ファイルA(難読化対象のお客様ファイル)から別の外部ファイルB(ステップ2で指定していただいたファイル名の外部ファイル)を呼び出すことになりますので、少し複雑です。ステップ2で指定していただいたファイル名を持つ外部ファイル(外部ファイルB)のパスは、お客様のライブラリー・ファイル(ファイルA)から見た相対パスではなく、お客様のライブラリーを読み込んでいるメインプログラムから見た相対パスにしなければならないと思われますので、場合によっては、生成されたファイルAの難読化ソースのうち冒頭の「$path_lib_sh」の値を書き換えていただく必要がある場合もあると思われますので、御注意ください。


ファイルAの中の$path_lib_shの値を書き換えていただくと、requireに関するエラーは消えると思われますので、お試しください。

ここでこの難読化済み外部ファイルを不特定多数の人たちに配布する場合、この書き換え作業をユーザーにお願いしなければならないケースもありえるということが注意点です。なお、配布するライブラリーAは、メインプログラムと同じディレクトリーに入れていただくようにライブラリー使用者に説明していただくことが可能であれば、ライブラリーAと外部ファイルB、そしてライブラリーAを読み込むお客様クライアントのファイルともすべて同じディレクトリーにあることになりますから、パス関係のトラブルは書き換えなくても起きないはずです。

  


10. PHPソースは確かに難読化されましたが、PHPファイルを実行した後、ブラウザでソースを表示させてみると、そのままです。
プランセスSPHPは、主に、クライアントや見込み客の方に配布するアプリケーションのPHPソースを、納品先クライアントや見込み客の方に見られないようにする(ロジックを真似されないように・重要な情報が見られないようにする・改ざんされないようにする)などの目的で御利用いただく商品です。

ブラウザに出力されるHTMLソースを動的に生成される部分まで含めて難読化されたい場合は、弊社製品の「サーバサイドSHTML for PHP」を御利用ください。「サーバサイドSHTML for PHP」は主にサイト訪問者から画像やテキストを保護されたい場合に使用していただく商品です。

このように両製品の目的の違いをご理解の上、使い分けるようにしてください。

  


11. 体験版を使っていますが、難読化すると実行速度が少し遅くなります。
プランセスSPHPで難読化されたプログラムは、まず難読化を解除する処理が実行されてから、本来のプログラムが実行されるという仕様になっていますので、そのまま実行されるよりは、やはり遅くなります。まずは、ステップ1の「4.ダブルクォテーションで囲まれた文字列を『\x(16進数)』形式の文字に難読化する。」の機能をご利用の場合は、厳選してみてください。(バージョン1.04a(2012年6月30日リリース)以降の機能です。)ファイルサイズが大幅に減るはずですから、実行速度の改善も期待されます。

また、どれだけ遅くなると感じるかは人によって違うでしょうが、より精密に調べていただくために、下記の方法をお試しいただければと思います。

  • オリジナルのファイルをshowdata.phpというファイル名であるとします。

  • showdata.phpを複製(コピーして)して、showdata2.phpというファイルを作成してください。

  • showdata.phpをプランセスSPHPで難読化して、showdata_crypted.phpを作成してください。

  • showdata2.phpの頭に、

    を追加してください。次に、showdata2.phpの末尾に、

    を追加して、上書き保存してください。

  • showdata2.phpを実行して、オリジナルのPHPファイルの場合、何秒かかるかどうかテストしてみてください。

    アラートが表示されない場合、スクリプトのどこかでexitしていてないかご確認ください。

  • showdata_crypted.phpの頭に、

    を追加してください。ただし、「ソース内の著作権表示(コメント)を編集削除できないようにする機能」を使われている場合は、そのコメントによる著作権表示のに、上記のスクリプトを挿入してください。

    次に、showdata_crypted.phpの末尾に、

    を追加して、上書き保存してください。

  • showdata_crypted.phpを実行して、難読化後のPHPファイルの場合、何秒かかるかどうかテストしてみてください。

    アラートが表示されない場合、オリジナルのスクリプトのどこかでexitしていている箇所がないかご確認ください。

  • 「e.」の結果と「g.」の結果を比べてみてください。念のため、5回とか10回など試験回数を増やしていただいてデータの精度を上げていただいたほうが良いと思います。

    たとえば、弊社でテストしてみたところ、オリジナルのファイルで0.006秒かかるファイルが、難読化後、0.070秒かかりました。単純に10倍かかっているともいえますが、実際には0.064秒であり、0.1秒にも満ちません。

    比較的処理に時間がかかるファイルでもテストしみました。オリジナルのファイルで約2.4秒ほどかかるファイルの場合で、難読化後、3.0秒前後かかりました。この0.6秒の差を大きいと考えられるか、無視できるかはお客様次第だと思っています。ご購入前に体験版でしっかりとお試しください。

  • 正しいテストをしていただくための重要なご注意点としまして、プロセス時間を計測する関数やプログラム部分を、難読化ソース内に入れないことです。オリジナルのソース(showdata.php)を難読化してからgetProcessTime()の関数部分は追加しているということです。オリジナルのソースにgetProcessTime()の関数部分を追加したshowdata2.phpを難読化するわけではないということが重要です。
体験版の場合、アラート表示が強制的になされるため、そのアラートを消さないと次の処理(JavaScriptなど)が行われないため、体感的な速度で遅く感じやすい傾向があることは確かだと思いますが、製品版になっても、サーバ上での実行速度はほとんど変わらないと思われますので(あったとしても0.1秒程度)、その点はご理解ください。

<<その他のTips>>
・たくさん機能を使われれば使われるほど、セキュリティは高まったり機能が追加されますが、てんこ盛りにしすぎると、その分、どうしても重くなりがちですので、減らせるものは減らしていただいて、速度がどうなるかお調べください。

・PHPソースの一部分だけを難読化するメニューがありますので、そちらを使っていただき、難読化する箇所を減らしていただいた場合にどうなるか、お試しください。

・可能であれば、違うサーバ(Windows端末上のローカルサーバも含みます。)でテストしてみてください。当然ながらPHPの実行速度は、サーバの処理能力にも依存します。

・もし、上記のテスト方法でサーバ上の実行時間が2秒以上違う場合は、お客様のプログラムとの相性があるのかもしれません。可能であれば、弊社に、現象を再現できる最小単位のコードを送っていただくか、最低、「どんなプログラムなのか(データベースに接続している・外部サーバと通信している・GDを使っているなど。)」「オリジナルのPHPファイルは何KBで、難読化ごは何KBになっている。」「ご利用のサーバについての詳細」をサポートにお知らせください。

  


12. 正規表現でpreg_replaceを使っていますが、正しく動作しません。PHPの実行エラーが発生したり、プログラムソースの一部がそのままブラウザに表示されます。
申し訳ありませんが、正規表現中に「?>」が含まれていることが原因かもしれません。その場合は、こちらを参照してください。

  


13. 自社の環境では問題ないのですが、クライアント先の環境では一部文字化けするという報告をもらいました。どのような原因が考えられますか?
以下の条件が全て揃っている場合は既知のケースになります。
  • PHPソースの文字コードにEUC-JPで書かれています。
  • いわゆる機種依存文字(「髙」「德」「彅」「恵」など)が含まれている。(「①」「Ⅰ」などのNEC選定文字の一部は問題ありません。)
  • サーバのPHPのバージョンが5.2.1未満である場合。
上記の場合、該当文字は文字化けします。これは仕様です。問題解決のためには、「該当文字を使用しない。」「該当文字を数値文字参照(&#39641;など。)で」「PHPのバージョンを上げる」「PHPの文字コードを変更する。」などの対策が考えられます。詳細はこちらを参照してください。

たとえば、PHPソースの文字コードがEUC-JPで書かれていて、機種依存文字を含んでおり、お客様のサーバのPHPのバージョンが5.3.0で、お客様クライアントのPHPのバージョンが4.4であれば、御相談のような事象が発生しえます。

  


14. 難読化を行っていたら、エンコードのアルゴリズム「ベーシック」では駄目なので、「ベーシック強化版」や「アドバンスド」を使うようにというエラーメッセージが出ます。
PHPソースのブロックとHTMLソースのブロックを交互に複雑に入り混じる形のソースにされている場合、右のようなエラーメッセージが表示される場合があります。解決方法など詳細は、こちらを参照してください。

  


15.グローバル変数を関数内で参照するために、「global $hogehoge;」のようにしていますが、エンコードのアルゴリズムを「ベーシック強化版」や「アドバンスド」にすると警告が出ます。「ベーシック強化版」のままで難読化するにはどうすればいいのでしょうか?
関数内でグローバル変数を参照するために「$GLOBALS["hogehoge"]」もしくは「global $hogehoge;」のようにされている場合、たしかに右のようなダイアログを表示します。

エンコードのアルゴリズムを「ベーシック」に変更されたくない場合は、大変お手数ですが、プログラムを書き換えていただく必要があります。書き換え方の一例など詳細はこちらを参照してください。

  


16.「Fatal error: Call to undefined function: mb_convert_encoding() in 〜」と表示されます。
プランセスSPHPをご利用の場合、mbstring系の関数が有効になるように設定してください。現在の設定はphpinfo()でご確認ください。Windowsサーバの場合はphp_mgstring.dllが読み込まれるようにphp.iniを編集するなどしてください。

  


17.SPHPで難読化していると、「『<?php』と『?>』の数が合っていないとプログラムは判断しました。〜error_code=close_tag_again」と表示されます。絶対そんなことはないはずなのに、どうしてでしょうか?
このエラーは、正規表現などに使われている「?>」をPHPソースのブロックの閉じタグと誤認していることから起こります。正規表現での問題の詳細と対象方法はこちらを参照してください。

正規表現を使われていない場合も、本質的には、上記リンク先で書かれている原因とほぼ同じ原因だと思われ、対処法もほぼ同じになると思われますので、お手数ですが、一度参照してみてください。

  


18.難読化すると、register_globals=onにしているのに、変数を取得できません。
ステップ2のエンコードのアルゴリズムで「ベーシック強化版」や「アドバンスド」を選ばれていると思います。「ベーシック」を使用してください。

  


19.コマンドライン版のPHPソースを難読化して実行すると、$argvや$argcを取得できません。
ステップ2のエンコードのアルゴリズムで「ベーシック強化版」や「アドバンスド」を選ばれていると思います。「ベーシック」を使用してください。

もしくはベーシック強化版を使われたい場合は、以下のことを試してみてください。まず、オリジナルのPHPソースを少しだけ書き換えます。

▼オリジナルのPHPソース


▼変更後のPHPソース


その上で、難読化を行ってください。その際、
右上のような確認メッセージが表示されますが、ここで「キャンセルボタン」を押して続行してください。ベーシック強化版で難読化しても、コマンドラインの引数を取得できる可能性があります。