● トラブルシューティング・よくある質問

1.ページ全体が文字化けします。
まず、お客様のPerl/CGIプログラムの文字コードをご確認ください。サーバサイドSHTML for Perl/CGI(体験版を含む)は、難読化したいと考えておられる文字コードが特定されている必要があります。引数を省略された場合には、お客様が申し込みをされた際にご記入いただいたメインの文字コードでエンコードされていると解釈して難読化を行います。内部的に、文字コードの自動判定などは行っておりません。

文字コードの自動判定は100%の精度では不可能な場合がありますし、また、毎回判断させるのも無駄な話であり、多少動作速度に影響するはずです。

Advancedコースの場合、複数の文字コードに対応していますので、メインの文字コードをEUC-JPとされた場合に、Shift_JISやUTF-8の文字列を難読化したい場合には、それぞれ、第4引数に「sjis」「utf8」を指定していただく必要があります。第4引数を省略されている場合には、「EUC-JP」と判断されてしまいます。

 Standardコースの場合、一つの文字コードにしか対応していません(有料オプションで使いした場合を除く。)ので、第4引数は無視されます。登録申請時の文字コードであると仮定して難読化するため、登録申請時以外の文字コードでエンコードされた文字列を引数に渡すと確実に文字化けします。

例えば、Standardコースをご利用で、EUC-JP版をご購入いただいた場合を考えてみます。Shift_JISでエンコードされた文字列をEUC-JP版では処理できませんので、Jcode.pmやjcode.plなどでお客様の自前プログラムにて、一旦、EUC-JPに文字コードを変換していただきます。その後、弊社プログラムにて難読化処理を行っていただく必要があります(必要に応じて、難読化後の文字列をEUC-JP→Shift_JISに再変換していただく必要がある場合もあるでしょう)。ただし、Shift_JIS→EUC-JPの文字コード変換の際に問題になりやすい文字(機種依存文字など)には細心のチェックが必要です。機種依存文字が含まれていないという保証があるのであれば問題ありませんが、機種依存文字が含まれている場合には、気をつけないと、難読化処理の前の文字コード変換時に文字化けが発生してしまっていることも十分に考えられます。ご注意ください。


難読化対象の文字列の文字コードが想定していたものであるのに文字化けが発生している場合には、
print "Content-type: text/html; charset=EUC-JP\n\n";

のように、文字コードをレスポンスヘッダの中で明示するようにしてください。また、HTMLソースのヘッダ部で、<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">と明示するようにしてください。


2. 特定のページで、レイアウトが崩れます。
いくつかの条件が重なると、レイアウトが崩れることがあります。それは仕様ですが、解決方法はあります。

まず、レイアウトが崩れる条件がある場合ですが、
  • プロテクトコード(どこでもSHTMLで作成した右クリック禁止などのJavaScript)以外のJSファイルを使っている場合で、
  • かつ、JSファイル内で「document.writeメソッドを使っている場合で、
  • かつ、そのdocument.writeメソッドが実行されるタイミングがページ本体のロード完了前である場合です。(ボタンをクリックしてサブウインドウが開く場合などにdocument.writeメソッドを使用している場合は関係がありません。)
この場合、JSファイル内でdocument.writeされているソースは、元々のレイアウトにかかわらず、ページの最下部に表示されます(Internet Explorerの場合。Firefoxでは問題ありません)。

対策は、
getEncryption_shtml関数を呼び出すのを複数回に分けていただくことです。問題のJSファイルを含むソースを境界にしてソースを分割して難読化させるようにします。例を挙げて説明しますと、 shtml_logo.jsというJSファイル内にて、Flashファイル表示用のHTMLソース(objectタグやembedタグ)をdocument.writeしている場合を考えてみます。

体験版及び製品版のfaqフォルダー内のサブフォルダー=logo内のshtml_logo_layout.cgiをご覧ください。


shtml_logo.jsのソース:


この場合、本来は、「あいうえお→SHTMLのロゴ(flash)→かきくけこ」と表示されてほしいのに、Internet Explorerの場合には、「あいうえお→かきくけこ→SHTMLのロゴ(flash)」と表示されてしまいます。改善方法を下記に示します。



このように、ソースを分割していただければ、「あいうえお→SHTMLのロゴ(flash)→かきくけこ」と期待通りに表示されるようになります。

(問題を起こすソース部分=$contents2の部分が例えば、Google AdSenseのような、他社のスクリプトである場合には、これを難読化しなければならない理由は多くの場合ないでしょうし、むしろするべきでない場合も多いでしょうから、単にこの部分は平分のままprintしていただくようにしても、レイアウト崩れの問題は解決します。)

なお、JSファイル内でdocument.writeするのではなく、HTML本体内でdocument.writeしている場合には、レイアウトの崩れは、この対策をしていない場合でも生じません

 もっとも、外部ファイル(JSファイル)を使用せずに、Flash表示用のHTMLタグをHTML本体内のソース内に書いた場合、Flashのアクティブ化対策の問題(「クリックするとこのコントロールをアクティブにして使用します」というメッセージが表示される)がありますが、このアクティブ化対策の方法を変更することで可能です。若干の注意事項はありますが、弊社でその対策用のコードの書き方を教授させていただくことは可能です。サポートにお問い合わせください。

また、別の対策もあります。JSファイル内でdocument.writeメソッドを使用せずにinnerHTMLを使用するようにします。上記の例で言えば、

のように書き換えます。(体験版及び製品版のfaqフォルダーの中のlogoフォルダー内にありますshtml_logo_inner.cgiが該当します。)

もう一例、改善策をご紹介します。JSファイルの中で直接document.writeするのではなく、JSファイル内では、あくまでもdocument.write用の関数のみを定義し、その関数を呼び出すのはHTML本体内から行うようにします。(体験版及び製品版のfaqフォルダーの中のlogoフォルダー内にありますshtml_logo_header.cgiが該当します。)



shtml_logo3.jsの中身は下記のようになります。


なお、外部ファイルを書き換える際にshtml_logo4.jsのように書き換え、shtml_logo_fail.cgiのようにしてしまうと失敗します。flashWrite関数の呼び出しは必ず、JSファイル内からではなくHTML本体からやらなければ意味がありません。


3. 空白ページが表示されます。
空白ページが表示される場合、いくつかの可能性が考えられます。まず、空白のページでHTMLソースを表示させてみてください。その時、
  • 「<HTML></HTML>」の場合

  • 「<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><META http-equiv=Content-Type content="text/html; charset=shift_jis"></HEAD><BODY></BODY></HTML>」の場合

  • 難読化したソースを外部ファイル化(JSファイル化)している設定にしている場合

  • 「サーバサイドSHTML for Perl/CGIで難読化したソース(JavaScript)もしっかりと表示されている場合」とで、原因は異なります。

「<HTML></HTML>」の場合、「どこでもSHTML」で作成したプロテクトコードが不適切なために、想定外の時にプロテクトコードが働き、真っ白のページ(about:blank)が表示されているものと思われます。ですから、どこでもSHTMLでJSファイルを作成しなおす必要があります。

「<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 〜」の場合ですが、ブラウザが出力する文字列が存在しないときに、Windows版Internet Explorerが勝手に作成しているソースです。即ち、原因はprintする際に、print対象の変数名(難読化された文字列が入っている変数の名称)を書き間違えているか何かで、空の文字列をprintしていることが原因であると思われます。

また、第3の「サーバサイドSHTML for Perl/CGIで難読化したソース(JavaScript)もしっかりと表示されている場合」の場合ですが、
  • getEncryption_shtml関数に引き渡す難読化対象の文字列が入った変数名の名称を間違っていないかどうかご確認ください。この変数名を間違っておられた場合、空の文字列を難読化することになりますますから、やはり、何も表示されません。

  • 難読化を行うと、HTMLソースのほとんどが英数字だけになります。そのため、ブラウザによっては、文字コードの自動判別に失敗することがあります。この場合に、何も表示されないように見える場合があります。実際には、サイト訪問者がエンコードを手動で修正すれば表示されます。ただし、もちろん、これは不恰好ですから、必ず、プログラム側にて、「下記のようにレスポンスヘッダで適切なcharsetを出力する」、「メタタグによるcharsetの指定」(<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">など)が不可欠です。

    print "Content-type: text/html; charset=EUC-JP\n\n";
    のように、レスポンスヘッダー内で文字コードを明示させてください。

  • 引数に渡している難読化対象の文字列の文字コードを確認してください。EUC-JP版の「サーバサイドSHTML for Perl/CGI」の場合は、基本的にEUC-JPでエンコードされた文字列しか処理できません。Advancedコースをご利用の場合なら、第4引数を指定して、Shift_JISでエンコードされた文字列やUTF-8でエンコードされた文字列を処理できますが、その場合でも、第4引数の値と、第1引数である難読化対象の文字列のエンコードが一致している必要があります。一致していなければ文字化けが発生し、その結果、JavaScriptエラーが発生し、ブラウザに何も表示されない現象が発生することがあります。
最後に、難読化したソースを外部ファイル化(JSファイル化)している設定にしている場合ですが、JSファイルを生成することになっているディレクトリーに書きこみ権限が設定されているかどうかをご確認ください。suexecを利用していない場合には、nobodyもしくはwebuserに書き込み権限がなければ動作しません。

4.Shift_JISでプログラムしていますが、「予」「能」「申」など一部の文字とその後続の文字が文字化けします。
まず、確認していただきたいのは、難読化前から文字化けが発生していなかったかということです。Shift_JISの場合、2バイト目がASCIIと重なるため、問題が発生しやすいです。いわゆる「5C問題」はその典型です。

ソЫⅨ噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿杤歃濬畚秉綵臀藹觸軆鐔饅鷭偆砡纊犾

は通称「ダメ文字」と言われ、Shift_JISで扱う際には細心の注意が必要です。

print "ソースを表示されると、画像のパスなどが予測可能です。";
では、「メ[スを侮ヲされると、画像のパスなどが卵ェ可狽ナす。」と文字化けします。

print "ソ\ースを表\示されると、画像のパスなどが予\測可能\です。";
のように、文字化けを引き起こす文字の後ろに「\(バックスラッシュ)」をつけなければなりません。もしくは、シングルクォートで囲むようにして、
print 'ソースを表示されると、画像のパスなどが予測可能です。';
としなければなりません。

Shift_JISのページで、これらの対策を難読化前にされていない場合は、サーバサイドSHTMLで難読化後もやはり文字化けします。ただし、文字化けのされ方は全く同じというわけではなく、文字化けの範囲が難読化前よりも広がる場合があることも弊社で確認しています(文字化けの範囲は、後続の文字によって左右されます。)ので、十分にお気をつけください。

 datファイルやHTMLファイルなど別ファイルにこれらのダメ文字がShift_JISで保存されていて、それをPerl/CGIプログラムからopenして読み込み処理する場合は、特別な処理をせずとも、文字化けしません。

5. 「domin error」というアラートが表示されます。
「サーバサイドSHTML for Perl/CGI」(体験版/製品版とも)は、ご登録していただいたサーバでのみ動作するようにしてあります。サーバ名の名称を「$server_name_shtml=$ENV{'SERVER_NAME'};」でチェックさせていただいています。

サブドメインの違いは問いませんので、http://www.example.com でご登録いただいた場合には、test.example.comやlocalhost.example.comなどをテストサーバ名として運用していただければと存じます。つまり、お手数ですが、テストサーバで動作させる場合には、テストサーバのサーバ名を一時的にでも、hostsファイルやhttpd-vhosts.confを調整することで、ご登録のサーバ名(ドメイン名)と一致化させるようにしてください。

テストサーバの名称をどうしても調整できない場合には、サポートにお問い合わせください。

6.「Internal Server Error」「内部サーバエラー」「500 エラー」になります。
まず、難読化を行わない形なら、「Internal Server Error」が発生しないことを確認してください。次に、エラーログを確認することで、原因をつかめることがあります。

弊社がさまざまなテストをする中で経験した原因の一つは、
  • IISで運営している場合に、ライブラリのパスを相対パスで指定している場合にInternal Server Errorになったことを経験しました。ライブラリのパスをIISでは絶対パスで指定してください。

  • 同様に、ScriptAliasを使用していて、CGI-BINでのみCGIファイルが動作するようにしている場合、弊社提供のライブラリ群はCGI-BINに入れるのではなくて、別のディレクトリーに設置し、絶対パスでライブラリを読み込むようにしてください。

  • 当プログラムを使用するためには、Perl 5.8以上をご利用か、もしくはJcode.pm及びMIME::Base64が利用可能である必要がありますが、この条件はクリアされていますでしょうか? 体験版及び製品版内のcheck/check.cgiを実行してご確認ください。また、Jcode.pmやMIME::Base64が利用可能であったとしても、ライブラリーパスが通っていない可能性があります。BEGIN ブロックでライブラリパスを指定することで、現象が解決するか確認してみてください。もしくは、グローバルな特殊配列@INCの中身を確認してみてください。

  • どうしても、原因が分からない場合には、エラーログの該当部分をサポートに送ってみてください。また、公開用ページの場合には、必ず、難読化前の状態に一旦戻してください。


7. md5エラーが表示されます。
体験版及び製品版内のma_shtml.plというファイルは触らないようにしてください。ライセンス管理上、MD5でハッシュ値を生成させ、チェックしています。改行コードはCRLFもしくはLFのどちらでもOKなようにはしてあります(お客様サーバがMacサーバである場合には、改行コードCRでも動作するようにもちろんします)が、MD5の特性上、改行が一つ増えたりするだけでもハッシュ値が変わり、動作しなくなる原因になります。




HTMLソース難読化用Perlライブラリ
「サーバサイドSHTML for Perl/CGI」
© 株式会社プランセスお問い合わせ