【问题标题】:java, javascript signed applet (file choosing, ftp upload) security/socket exceptionjava、javascript 签名的小程序(文件选择、ftp 上传)安全/套接字异常
【发布时间】:2012-09-10 04:35:35
【问题描述】:

我有一个 java 小程序,它使用一个具有 3 个函数的类(不包括测试函数):

  • 用于运行文件选择器并将选定文件(类型 FileContents )添加到数组中。
  • 如有必要,第二次从数组中删除一些文件。
  • 第三个是上传文件到 ftp 服务器。

    它们都是从Javascript 代码调用的。两个第一个功能工作得很好。 上传功能不起作用,它会抛出:

java.security.AccessControlException:访问被拒绝 ("java.net.SocketPermission" (dest.ftp server) "resolve")

Applet 是自签名的。我正在使用[Yii Framework][1]
重要代码:- Uploader上传功能:

public void upload( String ftpServer, String username, String password, String filePath )
throws MalformedURLException, IOException
{
    if ( ftpServer != null && filePath != null && this.filesArray.length > 1 ) {
        StringBuffer sb = new StringBuffer( "ftp://" );
        //check for authentication, if username and password not provided assume annonymous access
        if ( username != null && password != null ) {
            sb.append( username );
            sb.append( ':' );
            sb.append( password );
            sb.append( '@' );
        }

        sb.append( ftpServer );
        sb.append( ":21" );
        sb.append( '/' );

        if ( !filePath.equals( "" ) ) {
            sb.append( filePath );
            sb.append( '/' );
        }

        StringBuffer sb2 = new StringBuffer( sb.toString() );
        //below: i < this.filesArray.length - 1 becouse last field is always empty
        for ( int i = 0; i < this.filesArray.length - 1; i++ ){ 
            sb.append( this.filesArray[ i ].getName() );
            sb.append( ";type=i" );

            BufferedInputStream bis = null;
            BufferedOutputStream bos = null;

            try {
                URL url = new URL( sb.toString() );
                URLConnection urlConn = url.openConnection();

                bos = new BufferedOutputStream( urlConn.getOutputStream() );
                bis = new BufferedInputStream( this.filesArray[ i ].getInputStream() );

                int j;
                //read byte by byte until end of stream
                while ( ( j = bis.read() ) != -1 ) {
                    bos.write( j );
                }
            }
            finally {
                if ( bis != null ) {
                    try {
                        bis.close();
                    }
                    catch( IOException ioe ) {
                        ioe.printStackTrace();
                    }
                }
                if ( bos != null ) {
                    try {
                        bos.close();
                    }
                    catch ( IOException ioe ) {
                        ioe.printStackTrace();
                    }
                }
            }
            sb = sb2;
        }
    }
    else {
        System.out.println( "Ftp address incorrect or input file not available." );
    }
}

部署代码

    <script>
var attributes = { id:'uploader1Applet',
    code: 'filesUpload.uploaderApplet',
    archive:'<?php echo Yii::app()->getBaseUrl(true); ?>/java/uploaderApplet.jar',  width:1, height:1} ;


var parameters = {jnlp_href: '<?php echo Yii::app()->getBaseUrl(true);?>/java/upload-applet.jnlp'};   


     deployJava.runApplet(attributes, parameters, '1.6') ;

  • javascript 声明 + 初始化(初始化的唯一工作就是将新的 FileContents 数组分配给 Uploader 属性;与上面相同的视图,不同的脚本):
var uploader = document.getElementById( 'uploader1Applet' ).getUploader();
      uploader.initialize();
  • 上传方法调用(与上传者声明相同的脚本+初始化):

uploader.upload(connAddress, connUsername, 'session[ 'ftpPassword' ]; ?>', connRootFolder != null ? connRootFolder : "" );

任何想法如何解决我的问题?

【问题讨论】:

  • 您是如何签署小程序的,您可以在这里发布这些命令吗?
  • (代替下面的keytool:/usr/java/jdk1.7.0_06/bin/./keytool ; jarsigner 相同)(1):keytool -genkey -keystore pKeyStore -alias me(2 ): keytool -selfcert -keystore pKeyStore -alias me (3): jarsigner -keystore pKeyStore ./uploaderApplet.jar me
  • 附言。 Ftp 服务器不在我的托管范围内。

标签: java javascript security sockets


【解决方案1】:

从 Javascript 调用的 Java 方法通常需要包装在 AccessController.doPrivileged(..) 调用中,才能被信任。

【讨论】:

  • 但这对我来说似乎有点危险。此外,我试过了,但我不知道如何将必要的参数(连接参数、文件数组)传递给包装在 .doPrivileged() 中的代码。
  • 链接页面顶部有示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 2010-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
  • 2016-07-09
相关资源
最近更新 更多