【问题标题】:Avoid developers to see included plain text code.避免开发人员看到包含的纯文本代码。
【发布时间】:2013-04-07 13:14:57
【问题描述】:

我制作了一些类,其中包含许多使用 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 文件中有很多安全代码,我不想向其他开发人员展示,但仍然允许他们调用函数并读取返回值。

【问题讨论】:

  • 您不能隐藏要包含的代码,因为 PHP 解释器也无法读取文件的内部文本。
  • 如果您允许他们说include 'yourfile.php';,您就是授予 PHP 访问该文件的权限,否则无法包含该文件。如果您授予它这样做的权限,开发人员所要做的就是readfile('yourfile.php'); 并获取它的内容。
  • 这个问题不是重复的。至少不是关于代码混淆的 2 个相关问题。这显然是不显示任何代码。任何有权这样做的人,请重新打开它。
  • @vignesh,答案现在已经关闭,this comment is too narrow to contain the answer 但我会尝试:另一种方法是在单独的网站中制作某种 API。例如,如果您的开发人员输入 apiforweb.org/functionname?v1=5&amp;v2=7 ,那么您可以将其链接到具有两个参数的函数 functionname()v1v2,其值为 57,并回显返回的值 (他们会拿来的)。如您所见,这会带来很多麻烦、额外的开发人员时间和更长的页面加载时间,但它可能会根据您的需要进行调整。
  • @FrankPresenciaFandos 如果您想将您的 cmets 移到答案中,该问题已重新打开 :)

标签: php


【解决方案1】:

如果您想让其他开发人员直接调用您的函数,您不能对他们隐藏您的代码。您可以做的是制作一个Web 服务,并将其文档提供给其他开发人员。

【讨论】:

  • 其实可以的。 ionCube 或 Zend 等工具已存在多年
  • @WebnetMobile 我不是在谈论混淆/编码,这些方法会让人很难理解/理解代码,但不会隐藏它。
  • @WebnetMobile:但正如神秘所说,不会 readfile('yourfile.php');给出相应 PHP 文件的内容?
  • @vignesh - 不,你会这样得到加密文件
  • @WebnetMobile:使用ioncube和zend进行混淆可以解密:dezender.net
【解决方案2】:

因为我有meta post so this was reopenedanother meta post for formatting this question,所以我会尽力正确回答这个问题。请注意,这只是一种方法,其限制在帖子末尾说明。

API

远程服务器

您可以在不同的域中创建一个web API,然后从您的主域访问它。我认为解释它是如何工作的最好方法是用一个实际的例子。想象一下,您的库包含函数“joinstrings()”,它接受 2 个参数。然后你把它放在你分离的网络中:

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?");

没有任何代码经过测试,因此您应该预料到会有一些拼写错误。

限制

我可以想到解决大多数限制的方法,但不能扩展(更多)这篇文章,我不会在这里写它们。如果您在 cmets 中需要它,请寻求限制的解决方案,我会尽力而为。 在正常使用情况下,这些限制都不重要

  • 参数传递。使用如上所述的这种方法,您只能将数字或字符串作为函数参数传递。查看 json_encoding() 传递其他类型。

  • 返回值错误,当 API 中存在错误或传递的参数时。如果 API 有 bug,开发者无法修复,返回值可能是错误的。现在这似乎微不足道,但如果他们试图检索 2 个字符串的连接并检索另一个包含错误文本的 [错误] 字符串怎么办?注意:考虑返回有效的 XML,然后在包装器中解析它。

  • 只有一个唯一密钥用于防止随机用户使用您的 API,而不是对开发人员隐藏。

  • 速度较慢。我认为这甚至不需要解释。

  • 开发者的额外工作。包装器的实现解决了这个问题。

  • 网址长度。大多数 浏览器 的 url 长度限制为 2000 个字符,尽管我在 the PHP manual 中没有找到 file_get_contents() 的任何内容。阅读this SO question for more info about GET

  • 当然还有更多,但我能想到的主要是这些。

我希望这个长长的答案对您或某人有用。

【讨论】:

  • 谢谢。我已经从您的评论中理解了您所说的内容,但这是一个详尽的答案,可能对其他人有所帮助。 :-) 只是好奇.. 如果代码没有隐藏,像 facebook 这样的大公司是如何运作的?开发人员是否可以看到所有代码,或者它们是否遵循其他机制?如果他们这样做,也许我也可以切换到那个。
  • 你是什么意思,内部开发人员还是外部开发人员?对于后者,facebook 使用facebook API,对于前者我实际上并不知道。我只能猜测the separation of concerns 和强大的规范(工业工程中的black box model)可能使团队能够在一小部分代码中工作,而只有少数人可以访问整个代码。
  • 例如,您可以聘请程序员制作一个获取任何类型的 html 并返回 XSS 安全的函数。他可能会询问 HTML 的最大大小以及更多其他内容,但随后他应该能够为您提供您要求的功能,经过调试并准备好由您/受信任的人审查并插入您的代码。
  • 我实际上是在询问内部开发人员。抱歉没有具体说明。那么,使用黑盒模型完成的一切是否会导致开发后的集成变得困难。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多