単一のバグを特定した経験、またはコードを作成する必要がない方法

この記事では革新的なものは提案されていないことをすぐに言わなければなりません。 他の人のコードを扱う小さなケースを1つだけ説明します。 おそらく経験豊富な開発者は笑顔になるでしょう。なぜなら、彼ら自身はおそらく似たような開発者に出会った可能性があり、さらに悪いことかもしれないからです。 これがすべて新しい人は、特に公開プラグインに関しては、コードを作成する必要がないことに注意してください。 この記事では、無関係なワードプレスプラグインの使用についてさらに説明しています。 「冒険」の後、プラグインの名前については一切言及したくありません。そのため、プラグインを参照する可能性を可能な限り排除するために、ソースコードの一部で変数と関数の名前を変更しました。



多くの場合、PHPプログラマーや一般的なプログラミング言語としてのphpについて人々がひどく話すことを理解しています。 私自身は言語の問題に遭遇したことはありません。小さなプロジェクトを書いています。サードパーティのフレームワークを使用せず、人生を楽しんでいます。 時々、友達がリクエストをします。 タスクが面白かったり、時間がかかる場合は、通常私は拒否しません。 そして友人から、さまざまなソーシャルネットワーク上の自動投稿プラグインがInstagramで正常に機能しない理由を確認するように依頼されました。 長い間考えずに、それについて複雑なことは何もないと考えました-崇高なテキストを開き、プラグインのソースをダウンロードし、Instagramで投稿コードを検索して修正しますが、そこにはありませんでした...



FtpSyncをセットアップし、プラグインフォルダーをダウンロードし、名前に一致するファイルを開いて、次のようなものを見ました。



if (!function_exists('CutFromTo')){ function CutFromTo($string, $from, $to){$fstart = stripos($string, $from); $tmp = substr($string,$fstart+strlen($from)); $flen = stripos($tmp, $to); return substr($tmp,0, $flen);}}
      
      





正確に言うと、1行に複数の操作がある場合、合計行数のファイルは1,000を超えます。 その後、物事が悪いことに気付き、phpstormを開きました。Tools-> Deploymentでftpへのアクセスを構成しました。 次に、Ctrl + Shift + Alt + Lを使用して、コードを整理して読みやすくしました。



 if (!function_exists('CutFromTo')) { function CutFromTo($string, $from, $to) { $fstart = stripos($string, $from); $tmp = substr($string, $fstart + strlen($from)); $flen = stripos($tmp, $to); return substr($tmp, 0, $flen); } }
      
      





プラグインの問題は、タイトルの代わりに写真を公開するときに、おおよそのコンテンツ「画像を/ tmp / FILE_NAMEにアップロードできません」でエラーが表示されたが、この場合は写真が正常に書き込まれることでした。 ファイルを検索することで(Ctrl + Shift + F)、そのようなテキストが使用されているコード内の唯一の場所にすぐに到達しました。 (ちなみに、文中の単語のステートメントにさまざまなバリエーションがある同様のエラーテキストは、コード内のさまざまな場所にありました。開発者は、テキストを定数に入れるか、パラメーターに応じてさまざまなバリエーションを取得する関数を作成する必要があります。一般に、コピー/貼り付けプログラミングの存在)



私の友人はエラーをグーグルで検索しようとし、同じ問題を抱えたプラグインフォーラムでユーザートピックを見つけました。 プラグインの代表者は、人がphpをよりよく理解する必要があることを明示的に説明しようとしました。コードではシステム関数のみが使用され、問題は自分の側ではないことを示し、FAQを読むように申し出ました。 一般的に、サポートは少ないです。



文字列に単語を追加する簡単なテストで、呼び出されたコードで見つかった関数であることを確認しようとしましたが、呼び出されていません。 少し驚いた後、ボタンをクリックすると一連の呼び出しを追跡し始めました。 まったく同じ形式でフォーマットされたjavascriptコードで、どのアクションがajaxを介して送信されるかを見つけました。再び検索して、phpコードで場所を見つけ、



 echo “aga”;
      
      





コードでこの場所に来るまで、私は常に正しい道を進んでいることを確認しました。



 $nt = new SomeClass(); $nt->debug = false; if (!empty($options['ck'])) $nt->ck = $options['ck']; if (!empty($options['proxy']) && !empty($options['proxyOn'])) { $nt->proxy['proxy'] = $options['proxy']['proxy']; if (!empty($options['proxy']['up'])) $nt->proxy['up'] = $options['proxy']['up']; }; $loginErr = $nt->connect($options['uName'], $pass); if (!$loginErr) $ret = $nt->post($msg, $imgURL, $options['imgAct']); else { $badOut['Error'] .= 'Something went wrong - ' . print_r($loginErr, true); $ret = $badOut; }
      
      





phpstorm ideとは別に画像:



画像



だから私は宣言されていないクラスに来ました。 まず、サーバーからエンジンとプラグインの他のすべてのソースをダウンロードし、すべてのファイルを検索して、クラス定義を見つけようとしました。 何も見つからなかったとき、私は非常に驚きました。 つまり、画像の投稿は、ソースにないクラスで発生します。



プラグインの種類を友人に尋ねた結果、プラグインが公開されていることがわかりました。具体的には、この変更(Instagramに投稿)は有料で、開発者はインド人です。 他のすべてのソーシャルネットワークはうまく機能します。 起こっていたことに対する私の驚きは激化しただけでしたが、大丈夫です。



次のコード:



 $reflector = new ReflectionClass('SomeClass'); echo $reflector->getFileName();
      
      





別のプラグインでファイルにアクセスし、指定されたコード行で「eval」関数の呼び出しを見つけました。



 $t = get_site_option($this->c); $d = $this->k . 'decode'; if (!empty($t)) { $t = $d($t); eval($t); }
      
      





このような機能を備えたプラグインは、Instagramを接続するための有料アドオンでもあります。 プレミアムネットワークを操作するためのソースコードはデータベースに保存され、「download using」「eval」ごとにデータベースからロードされます。



最後に、エラーが表示されていないコードに到達しました。今度は、さらなる分析のためにphpstormでコードを開く必要がありました。データベースからコードをファイルに書き込み、evalの代わりに必要なものを変更する可能性があります:



 $t = get_site_option($this->c); $fileName = $path . $this->c . '.php'; $d = $this->k . 'decode'; if (!empty($t)) { $t = $d($t); if (file_exists($fileName)) { require_once $fileName; } else { eval($t); file_put_contents($fileName, "<?php $t ?>"); } }
      
      





プラグインは、システムの/ tmpフォルダーに公開されたイメージの中間保存を提供し、それが失敗した場合は、ダウンロード用のWordPressフォルダーに保存します。 エラー行は、さまざまな一時フォルダーでの書き込みと書き込みのチェックのために、コード内のいくつかの場所と残りのコードで使用され、開発者はエラーテキストを単にコピーしてわずかに変更しました。 実際には、ファイル保存エラーのみが変数に書き込まれました。



 if (!is_writebale($path)) { $variable = “can not upload image from /tmp/FILENAME”; if (!tryToSaveImageInWordpressFolder()) { return $variable; } }
      
      





instagramに投稿するときにcaption属性のコードで同じ変数が後で使用された理由は明確ではありません。



 sendImageToInstagram(array('caption' => $variable));
      
      





変数を変更して完了しました。 バグを特定して修正するには5分、指定したバグのある必要なコードの場所を見つけるには約2時間かかります。



おそらく、全体の状況からいくつかの結論を引き出す必要があります。 実際、これには高い道徳はありません。 「冒険」の後、私はただ共有したかった。 ですから、すでに冒頭で書いたように、これは他人のコード、悪いコードの経験からのほんの小さな話です。 誰かがまだ笑顔で、誰かが他の人のコードを分析するアプローチで自分自身に新しいことに気づき、誰かが自分のコードをより良く書く方法についてメモを取ったことを願っています。



分析の過程で、私は多くのスタンプの問題に遭遇しました。それらの最も基本的なものです。





他の多くのマイナーな省略があり、コードが部外者にとってもう少し読みにくくなりました。 最大の問題は、PHP構文により、これらすべてを実行できることです。残念ながら、この自由を他の目的に使用できます。 お金を請求するエンジンデータベースにソースコードを保存することで、アクセスしにくくすることを試みましたが、これは非常に間違ったアプローチです。 最も平凡な議論:私の経験に基づいて、このアプローチは機能しませんでした-私は問題なく有料ソースに行き着きましたが、無駄に時間を浪費したため、この有料コードを無料で配布したいという欲求が強まっただけで、ゼロでした。 開発者と意図的に競争するために、まったく同じ機能を備えた独自のプラグインを作成することも考えました。 一般に、ソースを非表示にできない場合は、他の開発者が読めるようにします。 これは間違いなくあなたの収益性に悪影響を与えることはありませんが、あなたの評判に非常に良い影響を与え、将来より多くの収入を得るチャンスを増やすだけです。



All Articles