2

PHP(ライブラリのようなもの)を使用して適切に文書化された多くのメソッドを持ついくつかのクラスを作成しました。

さて、他の開発者が行うことは、コードで作成した PHP ライブラリを要求し、その中で定義済みの関数を使用することです。

(私が作成したライブラリの) PHP コードを他の PHP 開発者 (ファイルが必要) から隠して、内部のコードを表示せずに関数名、パラメーター、およびそのドキュメントを表示することは可能ですか? 可逆的な難読化について話しているのではなく、ユーザーが実際にコードを表示できないようにすることについて話しているのです。

例えば。

/**
 * 
 * CREATE A NEW THREAD
 * @param unknown_type $uid User ID of person who is creating the thread
 * @param unknown_type $participant An array having collection of UID of people who are participating in this conversation 
 * @param unknown_type $msgtype Message Type Flags (1-normal, 2-chat, 3-sent as email, 4-profile post, 5-group post, 6-customer support)
 * @param unknown_type $subject Subject of the thread
 * @param unknown_type $tname Thread Name
 * @param unknown_type $tpic Thread Cover Picture (Defaults to "")
 * @param unknown_type $tflag Thread Flag (1-allowed,2-under review,3-blocked) (Defaults to 1)
 * @return string|Ambigous <string, unknown> Thread ID on success, "" on failure
 */
public function createthread($uid,$participant,$msgtype,$subject,$tname,$tpic="",$tflag="1")
{
    $randobj=new uifriend();
    $tid=$randobj->randomstring(30,DB_MESSAGE,MSG_OUTLINE,msgoutline_tid);
    $socialobj=new socialoperations();
    $listid=$socialobj->createlist("threadlist_".$tid, "2",$msgtype,"1",$uid);
    if($socialobj->addtolist($participant, $listid, $uid)!="SUCCESS")
    {
        return "";
    }
    if($listid=="")
    {
        $lasterror="An error occured in creating thread! Unable to Create Lists!";return "";
    }
    $dbobj=new dboperations();
    $res=$dbobj->dbinsert("INSERT INTO ".MSG_OUTLINE." (".msgoutline_tid.",".msgoutline_subject.",".msgoutline_fid.",".msgoutline_participantid.",".msgoutline_msgtype.",".msgoutline_threadpic.",".msgoutline_threadflag.") VALUES
            ('$tid','$subject','$uid',$listid,'$msgtype','$tpic','$tflag')",DB_MESSAGE);
    if($res=="SUCCESS")
    {
        return $tid;
    }
    else
    {
        $lasterror="Unable to create Thread!";return "";
    }
}

他の開発者は、私が関数名とパラメーターを含む関数の上に書いたドキュメントのみを表示できる必要がありますが、コードには決してアクセスできないようにする必要があります。

これが必要な理由: PHP ファイルには、他の開発者に見せたくない安全なコードがたくさんありますが、関数を呼び出して戻り値を読み取ることはできます。

4

2 に答える 2

4

他の開発者が関数を直接呼び出せるようにしたい場合、コードを他の開発者から隠すことはできません。あなたにできることは、Web サービスを作成し、そのドキュメントを他の開発者に提供することです。

于 2013-04-07T13:26:49.193 に答える
3

メタ投稿があったため、これが再開され、この質問をフォーマットするための別のメタ投稿があったため、この質問に適切に回答できるよう最善を尽くします。これはこれを行うための唯一の方法であり、投稿の最後に制限が記載されていることに注意してください。

API

リモートサーバー

別のドメインでWeb APIを作成し、メイン ドメインからアクセスできます。それがどのように機能するかを説明するには、実際の例を使用するのが最善の方法だと思います。ライブラリに 2 つの引数を取る関数「joinstrings()」が含まれているとします。次に、分離された Web でそれを取得します。

http://apiweb.com/functions.php

<?php
// Your API. I hope the real one is more complex than this (;
function joinstrings($s1, $s2)
  {
  return $s1 . $s2;
  }
// More functions

リモート サーバー アクセス ポイント

これは公開されている (ただしキーが必要な) アクセス可能なページです。

http://apiweb.com/joinstrings/index.php

<?php
// Check if the key is valid and if $v1 and $v2 aren't empty. Else, 'exit;'
include '../validate.php';
// Your API
include '../functions.php';
// The called function
echo joinstrings(urldecode($_GET['v1']), urldecode($_GET['v2']));

ラッパー

これで、すべてのプログラマーにこの API の使用方法を学習させることができます。または、それを正しく行いたい場合は、彼らの生活を楽にするラッパーを作成します。アクセス可能にしたいすべてのメソッドを持つクラスがあります。関数でこのラッパーを実行することもできますが、オブジェクトとメソッドを使用する方が簡単で優れていると思います。

htpp://web.com/library.php

<?php
class DevelopersLibrary
  {
  private $Url = "http://apiweb.com/";
  // Press your hand against the keyboard. A-Z0-9. Copy it in http://apiweb.com/validate.php
  private $Key = "g139h0854g76dqfdbgng";

  // Accesible method
  public joinstrings($v1, $v2)
    {
    // Encode only the user input. You don't want to encode '?' nor '&'
    if ($Return = file_get_contents($this->Url . 'joinstring'
                                    '?key=' . $this->Key .
                                    '&v1=' . urlencode($v1) .
                                    '&v2=' . urlencode($v2)))
      {
      return $Return;
      }
    }
  }

開発者のコ​​ード

最後に、開発者が行うこと:

http://web.com/index.php

<?php
include './library.php';
$Lib = new DevelopersLibrary();
echo $Lib->joinstrings("Are you sure this is better", "than giving your developers access to the code?");

どのコードもテストされていないため、いくつかのタイプミスが予想されます。

制限事項

ほとんどの制限に対する解決策を思いつくことができますが、この投稿を拡張 (さらに) するために、ここでは書きません。コメントで制限の解決策が必要な場合は、質問してください。最善を尽くします。通常の使用では、これらの制限はそれほど重要ではありません。

  • パラメータが渡されました。上記のようにこのメソッドを使用すると、数値または文字列のみを関数パラメーターとして渡すことができます。他の型を渡すにはjson_encoding()を確認してください。

  • API または渡されたパラメーターにバグがある場合に、間違った値が返されます。API にバグがある場合、開発者はそれを修正できず、返される値が間違っている可能性があります。これは些細なことのように思えるかもしれませんが、2 つの文字列の結合を取得し、エラー テキストを含む別の [間違った] 文字列を取得しようとしている場合はどうなるでしょうか? 注: 有効なXMLを返し、それをラッパーで解析することを検討してください。

  • ランダムなユーザーが API を使用できないようにするための一意のキーのみがあり、開発者から隠されることはありません。

  • 速度が遅い。これも説明不要かと思います。

  • 開発者の追加作業。これは、ラッパーの実装で解決されます。

  • URL の長さ。file_get_contents()の PHP マニュアルには何も見つかりませんでしたが、ほとんどのブラウザーには 2000 文字の URL の長さ制限があります。GET の詳細については、この SO の質問をお読みください。

  • もちろん他にもありますが、主に思いつくのはこれらです。

この長い長い答えがあなたや誰かに役立つことを願っています.

于 2013-04-08T14:39:36.760 に答える