cwe - 492:使用内部类包含敏感数据
视图定制的信息:
内部类悄悄介绍几个安全问题因为他们翻译成Java字节码。在Java源代码中,似乎一个内部类可以声明只能封闭类,但是Java字节码没有一个内部类的概念,所以编译器必须将一个内部类声明转换成一个对等类与原有包级别访问外部类。更多的在不知不觉中,因为一个内部类可以访问私有字段在包含它的类中,一旦一个内部类成为同行类的字节码,编译器将私有字段访问的内部类转化为受保护的领域。
此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
相关的视图”研究概念”(cwe - 1000)
这个表指定不同的个人相关后果的弱点。标识应用程序范围的安全领域侵犯,而影响了负面的技术影响,如果敌人成功利用这个弱点。可能提供的信息如何可能的具体结果预计将看到列表中相对于其它后果。例如,可能会有高可能性,缺点将被利用来实现一定的影响,但较低的可能性,它将被利用来实现不同的影响。
示例1 下面的Java小程序代码错误地使用了一个内部类。
(坏的代码)
例如语言:Java
最后公共类urlTool延伸Applet {
私人最终类urlHelper { }
… }… 示例2 下面的示例显示了一个内部类的基本使用。这个类包含私有成员内部类InnerClass OuterClass。私有内部类InnerClass包括方法访问类的私有成员变量concat OuterClass输出的值的一个类的私有成员变量OuterClass并返回一个字符串,该字符串的连接的一个类的私有成员变量OuterClass,分隔符输入参数的方法和类的私有成员变量InnerClass。
(坏的代码)
例如语言:Java
公开课OuterClass {
/ /私有成员变量OuterClass
}私人字符串memberOne; 私人字符串memberTwo; / /构造函数OuterClass 瓦伦公共OuterClass(字符串,字符串varTwo) {
这一点。memberOne =瓦伦; }这一点。memberTwo = varTwo; / / InnerClass OuterClass成员内部类 私有类InnerClass {
私人字符串innerMemberOne; }公共InnerClass(字符串innerVarOne) {
这一点。innerMemberOne = innerVarOne; }公共字符串concat(字符串分隔符){
/ / InnerClass OuterClass访问私有成员变量
}system . out。println (“memberOne价值是:”+ memberOne); OuterClass.this返回。memberTwo +分离器+ this.innerMemberOne; 虽然这是一个可接受的使用内部类演示了一个内部类的内部类的弱点完全访问所有包含类的成员变量和方法甚至包括那些声明私有和保护。当内部类被编译和翻译成Java字节码JVM将内部类作为一个同行类包级别访问封闭类。 为了避免这种弱点的内部类,可以考虑使用静态内部类,局部内部类,或匿名内部类。 下面的Java示例演示了使用静态内部类使用前面的例子。内部类InnerClass声明使用静态修饰符,表明InnerClass OuterClass封闭类的静态成员。通过声明一个内部类作为一个封闭的类的静态成员,其他内部类只能访问静态成员和方法的封闭类和防止内部类访问非静态的成员变量和方法的封闭类。在这种情况下,内部类InnerClass只能访问静态成员变量包含的类memberTwo OuterClass但不能访问非静态的成员变量memberOne。
(好的代码)
例如语言:Java
公开课OuterClass {
/ /私有成员变量OuterClass 私人字符串memberOne; 私有静态字符串memberTwo; / /构造函数OuterClass 瓦伦公共OuterClass(字符串,字符串varTwo) {
这一点。memberOne =瓦伦; }这一点。memberTwo = varTwo; / / InnerClass OuterClass静态内部类 私有静态类InnerClass { 私人字符串innerMemberOne; 公共InnerClass(字符串innerVarOne) {
这一点。innerMemberOne = innerVarOne; }公共字符串concat(字符串分隔符){
/ / InnerClass OuterClass只有访问静态成员变量
返回memberTwo +分离器+ this.innerMemberOne; 唯一的限制与使用静态内部类是一个静态的封闭类成员内部类没有对封闭类的实例的引用。在很多情况下这可能不是理想的。另一种方法是使用一个本地内部类或一个匿名内部类,下一个例子所示。 示例3 在下面的例子中BankAccount类包含的私有成员内部类InterestAdder添加感兴趣的银行账户的平衡。BankAccount类的start方法创建内部类的对象InterestAdder, InterestAdder内部类实现了ActionListener接口的actionPerformed方法。定时器对象中创建开始BankAccount类的方法调用的actionPerformed方法InterestAdder类每30天添加银行帐户余额的利息基于利率传递到start方法作为输入参数。内部类InterestAdder需要访问私有成员变量BankAccount类为了平衡利益添加到银行账户的平衡。 然而如前面的例子所示,这是因为InterestAdder BankAccount类的非静态成员内部类,InterestAdder也BankAccount类的私有成员变量的访问,包括私有成员变量中包含敏感数据的银行帐户所有者的名字,社会安全号码、银行帐户号码。
(坏的代码)
例如语言:Java
公开课BankAccount {
/ / BankAccount类的私有成员变量 私人字符串accountOwnerName; 私人字符串accountOwnerSSN; 私人int accountNumber; 私人双平衡; / /为BankAccount类构造函数 accountOwnerSSN accountOwnerName公共BankAccount(字符串,字符串, int accountNumber、双initialBalance int initialRate) {
这一点。accountOwnerName = accountOwnerName; }这一点。accountOwnerSSN = accountOwnerSSN; 这一点。accountNumber = accountNumber; 这一点。平衡= initialBalance; this.start (initialRate); / /启动方法将增加利益平衡每30天 / /创建计时器对象和兴趣添加动作侦听器对象 公共空间开始(双) {
ActionListener加法器= new InterestAdder(率); }计时器t =新计时器(1000 * 3600 * 24 * 30,加法器); t.start (); / / InterestAdder BankAccount类的内部类 / /实现ActionListener接口 私人类InterestAdder实现ActionListener {
私人双率;
公共InterestAdder(双aRate) {
这一点。率= aRate; }公共空间actionPerformed (ActionEvent事件) {
/ /更新的兴趣
= BankAccount.this双重利益。平衡*率/ 100; BankAccount.this。平衡+ =利息; 在下面的示例InterestAdder类从上面的例子是本地声明在BankAccount类的start方法。作为本地内部类InterestAdder有其范围限制的方法(或封闭块)宣布,在这种情况下,只有开始的方法访问内部类InterestAdder,没有其他类包括封闭类的内部类知识以外的方法开始。这允许内部类访问私有成员变量的封闭类但只有封闭方法或块的范围内。
(好的代码)
例如语言:Java
公开课BankAccount {
/ / BankAccount类的私有成员变量 私人字符串accountOwnerName; 私人字符串accountOwnerSSN; 私人int accountNumber; 私人双平衡; / /为BankAccount类构造函数 accountOwnerSSN accountOwnerName公共BankAccount(字符串,字符串, int accountNumber、双initialBalance int initialRate) {
这一点。accountOwnerName = accountOwnerName; }这一点。accountOwnerSSN = accountOwnerSSN; 这一点。accountNumber = accountNumber; 这一点。平衡= initialBalance; this.start (initialRate); / /启动方法将增加利益平衡每30天 / /创建计时器对象和兴趣添加动作侦听器对象 公共空间开始(最终双率) { / / InterestAdder本地内部类 / /实现ActionListener接口 类InterestAdder实现ActionListener {
公共空间actionPerformed (ActionEvent事件)
{
/ /更新的兴趣
= BankAccount.this双重利益。平衡*率/ 100; BankAccount.this。平衡+ =利息; ActionListener加法器= new InterestAdder (); 计时器t =新计时器(1000 * 3600 * 24 * 30,加法器); t.start (); 类似的方法是使用一个匿名内部类是在下一个示例中演示。声明一个匿名内部类没有名称和只创建一个内部类的实例对象。与前面的示例匿名内部类有其范围限制在BankAccount类的方法开始。
(好的代码)
例如语言:Java
公开课BankAccount {
/ / BankAccount类的私有成员变量 私人字符串accountOwnerName; 私人字符串accountOwnerSSN; 私人int accountNumber; 私人双平衡; / /为BankAccount类构造函数 accountOwnerSSN accountOwnerName公共BankAccount(字符串,字符串, int accountNumber、双initialBalance int initialRate) {
这一点。accountOwnerName = accountOwnerName; }这一点。accountOwnerSSN = accountOwnerSSN; 这一点。accountNumber = accountNumber; 这一点。平衡= initialBalance; this.start (initialRate); / /启动方法将增加利益平衡每30天 / /创建计时器对象和兴趣添加动作侦听器对象 公共空间开始(最终双率) { / /匿名内部类实现ActionListener接口 ActionListener加法器= new ActionListener () {
公共空间actionPerformed (ActionEvent事件)
{ = BankAccount.this双重利益。平衡*率/ 100; BankAccount.this。平衡+ =利息; 计时器t =新计时器(1000 * 3600 * 24 * 30,加法器); t.start (); 示例4 在接下来的一个简单的Java例子applet提供了一个用户的能力在一个文本字段中输入一个URL,该URL在新的浏览器窗口中打开。小应用程序包含一个内部类,是一种行动提交按钮的侦听器,当用户单击submit按钮内部类动作监听器的actionPerformed方法将打开URL输入到文本字段在新的浏览器窗口中。与前面的例子以这种方式使用内部类创建一个安全风险暴露私有变量和方法。内部类创建一个额外的安全风险与applet applet在远程机器上执行通过web浏览器在同一个JVM并排,因此可能会与其他潜在的恶意代码。
(坏的代码)
公开课UrlToolApplet延伸Applet {
/ /私有成员变量为applet组件 私人标签enterUrlLabel; 私人TextField enterUrlTextField; 私人按钮submitButton; / /初始化方法,将组件添加到applet / /创建按钮的侦听器对象 公共空间init () {
setLayout(新FlowLayout ()); }enterUrlLabel =新标签(“输入URL:”); enterUrlTextField = new TextField (" ", 20); submitButton = new按钮(“提交”); 添加(enterUrlLabel); 添加(enterUrlTextField); 添加(submitButton); ActionListener submitButtonListener = new submitButtonListener (); submitButton.addActionListener (submitButtonListener); / /按钮侦听器UrlToolApplet类的内部类 私人类SubmitButtonListener实现ActionListener {
公共空间actionPerformed (ActionEvent evt) {
如果(evt.getSource () = = submitButton) {
字符串urlString = enterUrlTextField.getText (); }网址URL =零; 尝试{
url = new url (urlString); }捕捉(MalformedURLException e) {
System.err。println(“畸形的URL:“+ urlString); }如果(url ! = null) {
getAppletContext () .showDocument (url); }与前面的例子对这个问题的解决方案是使用一个静态的内部类,局部内部类或一个匿名内部类。另一种解决方案是使用applet实现动作监听器,而不是使用它作为一个内部类,如以下示例所示。
(好的代码)
例如语言:Java
公共类UrlToolApplet扩展Applet实现ActionListener {
/ /私有成员变量为applet组件 私人标签enterUrlLabel; 私人TextField enterUrlTextField; 私人按钮submitButton; / /初始化方法,将组件添加到applet 公共空间init () {
setLayout(新FlowLayout ()); }enterUrlLabel =新标签(“输入URL:”); enterUrlTextField = new TextField (" ", 20); submitButton = new按钮(“提交”); 添加(enterUrlLabel); 添加(enterUrlTextField); 添加(submitButton); submitButton.addActionListener(这个); / / actionPerformed方法ActionListener接口的实现 公共空间actionPerformed (ActionEvent evt) {
如果(evt.getSource () = = submitButton) {
字符串urlString = enterUrlTextField.getText (); }网址URL =零; 尝试{
url = new url (urlString); }捕捉(MalformedURLException e) {
System.err。println(“畸形的URL:“+ urlString); }如果(url ! = null) {
getAppletContext () .showDocument (url); }
这MemberOf关系表显示额外CWE类别和视图引用这个弱点作为成员。这些信息通常是有用的在理解一个弱点符合外部信息源的上下文中。
其他
移动代码,在这种情况下,一个Java Applet,代码通过网络传播,并在远程机器上执行。因为移动代码开发人员几乎没有如果任何控制他们的代码将执行的环境,特殊的安全问题成为有关。一个最大的环境威胁的风险结果移动代码将与其他一起运行,潜在的恶意移动代码。因为所有流行的web浏览器执行代码来自多个源在相同的JVM中,许多移动代码安全指导方针的重点是防止操纵对象的状态和行为的对手获得相同的虚拟机,您的程序正在运行。
更多的信息是可用的,请选择一个不同的过滤器。
|
使用常见的弱点枚举(CWE)和相关的引用从这个网站的使用条款。CWE赞助的美国国土安全部(DHS)网络和基础设施安全机构(CISA)和管理的国土安全系统工程和发展研究所这是由(HSSEDI)manbetx客户端首页(斜方)。版权©2006 - 2023,斜方公司。manbetx客户端首页CWE、水煤浆、CWRAF, CWE标志是斜方公司的商标。manbetx客户端首页 |