powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Знатокам серилизации вопрос
19 сообщений из 19, страница 1 из 1
Знатокам серилизации вопрос
    #34089921
Фотография Vector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начитавшись теории, проверил следующий пример:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
 import  java.io.*;

 class  A  implements  Serializable {
	 private   void  writeObject(ObjectOutputStream out){
		System.out.println("A.writeObject()");
	}
	 private   void  readObject(ObjectInputStream in){
		System.out.println("A.readObject()");
	}
}

 public   class  test {
	 public   static   void  main(String[] args)  throws  Exception {
		A a= new  A();
		ObjectOutputStream out= new  ObjectOutputStream( new  FileOutputStream("a.out"));
		ObjectInputStream in= new  ObjectInputStream( new  FileInputStream("a.out"));
		out.writeObject(a);
		in.readObject();
	}
}

В результате, действительно все работает. Экземпляры классов ObjectOutputStream out и ObjectInputStream in легко вызывают ЗАКРЫТЫЕ методы класса А!!!(вместо своих). Естественно, они используют средства отражениея, т.е. анализируют объект Class класса A , и найдя, что в нем определены функции writeObject и readObject - вызывают их. Интерфейс Serializable не содержит данных методов!
Вопрос, как такое возможно? Ведь эти классы никак не связаны ни каких дружественных связей!
...
Рейтинг: 0 / 0
Знатокам серилизации вопрос
    #34089978
ponomarevvb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VectorВопрос, как такое возможно? Ведь эти классы никак не связаны ни каких дружественных связей!
"Такое" - это какое? Что private-методы вызываются? Так Вы же уже ответили, через reflection это делается... Вот кусок из кода ObjectOutputStream:
Код: plaintext
1.
2.
3.
4.
5.
writeObjectMethod = getPrivateMethod(
	cl, "writeObject", 
	 new   Class [] { ObjectOutputStream. class  }, 
	 Void .TYPE
);
--С уважением, ponomarevvb--
...
Рейтинг: 0 / 0
Знатокам серилизации вопрос
    #34089981
ponomarevvb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и там же, в ObjectOutputStream, смотрите код getPrivateMethod :)
--С уважением, ponomarevvb--
...
Рейтинг: 0 / 0
Знатокам серилизации вопрос
    #34090009
Фотография Vector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. вы хотите сказать, что любой класс может получить доступ к закрытым членам класса через механизм отражения???
Зачем тогда вообще нужны эти спецификации доступа?
Если и так все очень просто:
1.Получил от любого объекта объект Class,
2.Изучил его с помощью механизма отражения,
3.Делай что хочешь...

А если у тебя в закрытом члене класса хранится открытый пароль???
...
Рейтинг: 0 / 0
Знатокам серилизации вопрос
    #34090040
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VectorТ.е. вы хотите сказать, что любой класс может получить доступ к закрытым членам класса через механизм отражения???
Зачем тогда вообще нужны эти спецификации доступа?
Если и так все очень просто:
1.Получил от любого объекта объект Class,
2.Изучил его с помощью механизма отражения,
3.Делай что хочешь...

А если у тебя в закрытом члене класса хранится открытый пароль???

Механизм отражений - вещь специфическая и в коде применяется не часто.
Спецификации доступа нужны для написания грамотного кода.
Вас где штампуют таких красивых, которые хотят пароль хранить в члене класса?
...
Рейтинг: 0 / 0
Знатокам серилизации вопрос
    #34090047
Фотография Vector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А где еще его хранить после дешифрования???
В Java есть только объекты, исключая примитивные типы, да и те можно определить только в классе. Или впервые слышите об этом?
Если где-то открытый пароль и будет хранится (даже на время проверки), то только в классе - больше негде.
...
Рейтинг: 0 / 0
Знатокам серилизации вопрос
    #34090053
Фотография Vector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или может привести другой пример? Для чего думаете введено слово transient?
Именно для того чтобы скрывать от серилизации такие секретные сведения из класса.
...
Рейтинг: 0 / 0
Знатокам серилизации вопрос
    #34090239
Фотография Vector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вообще! Я не знаю как эт называется, но вот этот код работает на ура!:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 import  java.io.*;
 import  java.lang.*;
 import  java.lang.reflect.*;

 class  A {
         private   void  XMethod() {System.out.println("private A.XMethod()");}
}

 public   class  testX {
	 public   static   void  main(String[] args)  throws  Exception {
		A a= new  A();
		 Class  ac=a.getClass();
		Method wrOb=ac.getDeclaredMethod("XMethod");
		wrOb.setAccessible(true);
		wrOb.invoke(a);
	}
}

Получается, что нет закрытых членов класса!!! Это просто ж...
...
Рейтинг: 0 / 0
Знатокам серилизации вопрос
    #34090293
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VectorА где еще его хранить после дешифрования???
Если где-то открытый пароль и будет хранится (даже на время проверки), то только в классе - больше негде.
Спокойно. Не нужно нервничать.
Вы не с той стороны подходите к проблеме.
Пароль не нужно расшифровывать. Это глупо, опасно и неправильно.

Пароль нужно шифровать и сравнивать с уже зашифрованным. Если они совпадают - вуаля, всё хорошо. А если вы в применении к БД этот вопрос поднимаете - так вам вообще задумываться об этом не нужно - просто передали в БД то, что пользователь ввёл в форме и забыли о нём.
...
Рейтинг: 0 / 0
Знатокам серилизации вопрос
    #34090294
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vector
Именно для того чтобы скрывать от серилизации такие секретные сведения из класса.
Нет. Почему - см. мой предыдущий пост.
...
Рейтинг: 0 / 0
Знатокам серилизации вопрос
    #34090300
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VectorНу вообще! Я не знаю как эт называется, но вот этот код работает на ура!:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 import  java.io.*;
 import  java.lang.*;
 import  java.lang.reflect.*;

 class  A {
         private   void  XMethod() {System.out.println("private A.XMethod()");}
}

 public   class  testX {
	 public   static   void  main(String[] args)  throws  Exception {
		A a= new  A();
		 Class  ac=a.getClass();
		Method wrOb=ac.getDeclaredMethod("XMethod");
		wrOb.setAccessible(true);
		wrOb.invoke(a);
	}
}

Получается, что нет закрытых членов класса!!! Это просто ж...

Вы такие конструкции постоянно используете в своём коде?
Почему вас так возбудили отражения? Я не могу понять :)
...
Рейтинг: 0 / 0
Знатокам серилизации вопрос
    #34090328
Фотография Vector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет паролей Вы правы.
Дело не в механизме отражения, а в возможности доступа к закрытым членам класса, которые предназначены только для внутреннего использования.
Ну, к примеру, это может быть связано с сокрытием реализации, с нежеланием давать доступ к некоторым алгоритмам внутри класса.
Например, исправив некотрые закрытые члены класса класс может может сделать запрещенную операцию. А это источник потенциальной опасности.
Или, как любят говорить, дыра, уязвимость and etc.

Просто после С++ такие вещи просто шокируют.
...
Рейтинг: 0 / 0
Знатокам серилизации вопрос
    #34090334
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Настрой SecurityManager не по дефолту (разрешено все) а как надо, и не будет у тебя доступа к приватным данным.


=====================================
Страну, в которой все ходят на бровях,
на колени не поставишь...
=====================================
...
Рейтинг: 0 / 0
Знатокам серилизации вопрос
    #34090342
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VectorНасчет паролей Вы правы.
Дело не в механизме отражения, а в возможности доступа к закрытым членам класса, которые предназначены только для внутреннего использования.
Ну, к примеру, это может быть связано с сокрытием реализации, с нежеланием давать доступ к некоторым алгоритмам внутри класса.
Например, исправив некотрые закрытые члены класса класс может может сделать запрещенную операцию. А это источник потенциальной опасности.
Или, как любят говорить, дыра, уязвимость and etc.

Просто после С++ такие вещи просто шокируют.

А что мешает на сях поставить прерывание на функцию и поправить адрес возврата в стеке?
...
Рейтинг: 0 / 0
Знатокам серилизации вопрос
    #34090365
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что один написал, то другой завсегда сломать может :)
...
Рейтинг: 0 / 0
Знатокам серилизации вопрос
    #34090387
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кувалдин РоманНастрой SecurityManager не по дефолту (разрешено все) а как надо, и не будет у тебя доступа к приватным данным.


=====================================
Страну, в которой все ходят на бровях,
на колени не поставишь...
=====================================

+1
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Class.html#getDeclaredMethod(java.lang.String, java.lang.Class[])
...
Рейтинг: 0 / 0
Знатокам серилизации вопрос
    #34090649
Фотография Vector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно пример с SecurityManager в контексте класса А.

Т.е. к примеру, я создаю свой класс, который позже будет использоваться кем-то еще. Как мне надо настроить безопасность, чтобы другой программист не мог добраться до private методов даже с помощью методов, указанных выше.
...
Рейтинг: 0 / 0
Знатокам серилизации вопрос
    #34090996
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VectorА можно пример с SecurityManager в контексте класса А.

Т.е. к примеру, я создаю свой класс, который позже будет использоваться кем-то еще. Как мне надо настроить безопасность, чтобы другой программист не мог добраться до private методов даже с помощью методов, указанных выше.

Вы точно уверены, что вам нужен именно такой путь? Вот честно скажу - не видел в жизни еще, чтобы требовалось прятать private методы так чтобы их никто никогда не нашел.

Ведь насколько я помню - securityPermission'ы настраиваются на экземпляре JDK или в runtime?
Что помешает другому программисту сказать AllPermission?
...
Рейтинг: 0 / 0
Знатокам серилизации вопрос
    #34091100
Фотография Vector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот именно.
Всем участникам огромное спасибо за обсуждение!
Всем удачи.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Знатокам серилизации вопрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]