Я работаю над библиотекой PHP, в которой мы будем предоставлять нашим клиентам зашифрованный код. Код будет включать основные классы, которые они могут создать, которые будут обрабатывать проверку лицензии и выставлять методы для их использования. Основной класс будет создавать несколько подклассов, каждый из которых содержится в их собственном файле. Как я могу запретить нашим клиентам включать файлы подкласса и создавать экземпляры самих подклассов для использования? Есть ли способ предотвратить создание вспомогательного класса, кроме нашего основного класса?Защита классов PHP от нежелательного экземпляра?
ответ
Wild догадки, но использовать Singleton для основного класса и фабрики/Singleton с инъекцией зависимостей (основного класса) для всех подклассов. Таким образом, подклассы даже не загружаются без действительной ссылки на экземпляр вашего основного класса.
EDIT: Поскольку этот ответ был принят, я решил привести пример для будущих читателей. Кроме того, не забудьте отметить все ваши классы как окончательные.
Primary Класс:
final class myPrimaryClass {
private static $instance = null;
private function __construct() {
// do something or not
return $this;
}
public static function getInstance() {
if (is_null(self::$instance) || !(self::$instance instanceof myPrimaryClass))
self::$instance = new myPrimaryClass;
return self::$instance;
}
}
Singleton Подкласс:
final class mySingletonSubClass {
private static $instance = null;
private function __construct(myPrimaryClass $primaryClassInstanceRef) {
return $this;
}
public static function getInstance(myPrimaryClass $primaryClassInstanceRef) {
if (is_null(self::$instance) || !(self::$instance instanceof mySingletonSubClass))
self::$instance = new mySingletonSubClass($primaryClassInstanceRef);
return self::$instance;
}
}
Фабрика Подкласс:
final class myFactorySubClass {
private function __construct(myPrimaryClass $primaryClassInstanceRef) {
return $this;
}
public static function getNewInstance(myPrimaryClass $primaryClassInstanceRef) {
return new myFactorySubClass($primaryClassInstanceRef);
}
}
Два примечания об этом примере; во-первых, конечно, я сильно упрощаю этот вопрос. Во-вторых, один простой трюк, который вы можете использовать, заключается в том, чтобы слегка модифицировать подклассы, чтобы методы getInstance()
не всегда нуждались в экземпляре первичного класса, переданного в качестве аргумента после первого раза. Я приведу здесь пример с одноплодным классом:
final class mySingletonSubClass {
private static $instance = null;
private static $classInstanceRef = null;
private function __construct(myPrimaryClass $primaryClassInstanceRef) {
return $this;
}
public static function getInstance(myPrimaryClass $primaryClassInstanceRef = null) {
if (!is_null($primaryClassInstanceRef))
self::$classInstanceRef = $primaryClassInstanceRef;
if (is_null(self::$instance) || !(self::$instance instanceof mySingletonSubClass))
self::$instance = new mySingletonSubClass(self::$classInstanceRef);
return self::$instance;
}
}
Обратите внимание, что это во многом зависит от PHP's type-hinting mechanism. Таким образом, вы должны read the manual entry on it, чтобы вы понимали нюансы (например, по умолчанию null).
Я не думаю, что есть язык, поддерживаемый языком, так что это будет трюки. Что вы можете сделать, так это добавить секретный аргумент в конструкторы вашего частного класса, который известен только вашему основному классу. Если этого нет, бросьте исключение NotAllowed.
Я знаю, что это некрасиво, и не очень безопасно (да никто не любит безопасность-через-неизвестность), но она может работать достаточно для вашего конкретного случая ...
Я знаю, что эта тема немного устарела, но я просто думал, что, как бы это сделать на Java, с проверкой стека вызовов вызывающего абонента, и нет ли у PHP чего-то подобного? На самом деле это делает, хотя это модуль PECL:
http://www.php.net/manual/en/function.apd-callstack.php
Получить стек вызовов, проверить его против ваших точек коды, бросить исключение, если он не соответствует. Вы даже можете создать общий суперкласс, который проверяет вас.
- 1. Защита класса от получения экземпляра перед main()
- 2. Защита PHP от инъекций MySQL
- 3. Защита сервера PHP от угонщика
- 4. Специальная защита от расширения PHP
- 5. Защита от удержания сеанса PHP
- 6. Php: Curl нежелательного выхода
- 7. Защита django от производства
- 8. Защита от XSS
- 9. Защита от веб-доступа
- 10. Защита от csrf
- 11. sql защита от инъекций?
- 12. Защита от несанкционированного перераспределения PHP-приложений
- 13. PHP - Защита POST-адресов от приложения iOS
- 14. Защита файлового менеджера PHP от его пользователей
- 15. Защита данных PHP от различных атак
- 16. Защита моей PHP-страницы от несанкционированных запросов
- 17. PHP Защита от сеанса Фиксация/угон
- 18. Защита переменных от кражи в php
- 19. Текстовая защита от mysql injection- PHP
- 20. Защита PHP CLI-скриптов
- 21. Защита от SQL-инъекции
- 22. Защита LocalDB от доступа пользователей
- 23. Защита от SQL-инъекции
- 24. Получение совпадений от нежелательного совпадения наполнителя
- 25. Защита Node.js: защита от несанкционированного изменения
- 26. php регулярное выражение для удаления нежелательного кода
- 27. Защита от взлома игры Javascript
- 28. PHP-защита загрузок
- 29. Защита приложения php
- 30. Защита от ввода параметров GET
Почему это не работает? –
Я, конечно, не могу создать экземпляр вашего класса. Вы сделали его невидимым! –
Вам нужно объяснить, что не работает. Отправьте код, который вы уже написали. – Yacoby