【问题标题】:Clear OS memory buffer using Java使用 Java 清除操作系统内存缓冲区
【发布时间】:2013-03-18 11:29:54
【问题描述】:

我很抱歉,因为我知道这个问题太笼统了,但我是新手,所以我很难让这个问题更具体。
我正在开发一个应用程序,其中客户有一些安全问题。他不希望用户能够打印屏幕或复制(ctrl+c 程序的数据。现在当我开始处理这个问题时,我发现当这些击键时,他的操作系统会复制其缓冲区中的数据。现在我试图检查每当用户点击ctrl+cprintscreen 的击键时,我的应用程序会突然刷新缓冲区(或缓存我们所说的任何内容)。现在我的问题是

1: 如何使用 Java 刷新窗口的缓冲区?我应该检查哪个类 API?(因为我搜索了很多但我没有找到方法 :( 所以现在是 SO 专家的时候了)

2:此 flushBuffer 代码是否适用于所有操作系统?或者我需要对 Windows/Linux/Mac 进行单独检查。
谢谢

【问题讨论】:

  • 假设您已经成功地做到了这一点,那么您如何防止用户拿起他的智能手机/相机并拍摄他的电脑屏幕:)?
  • 别忘了您还需要处理屏幕录像机(Gimps、camstudio 等)、屏幕截图辅助程序(截图工具)等程序。我记得很久以前的一个程序,Realplayer,它似乎无法打印屏幕,因为每当我尝试它时,视频根本不在屏幕截图中,而是显示黑屏。显然它所做的是直接写入视频内存 - 您可以尝试这样做,但请注意它是可绕过的(通过更改 Windows 中的视频设置)。
  • 基本上你不能可靠地做到这一点。如果您的客户对适用于普通用户但不是更高级的东西感到满意(或者,就像 gerrytan 提到的,任何使用相机的人),那么只有远程可能的东西。另请注意,由于您将清除所有程序共享的复制缓冲区,因此您有破坏其他软件的危险。
  • @eis 理解 :) 但是清除缓冲区的方法是什么?
  • @despicable 添加为答案

标签: java linux winapi operating-system buffer


【解决方案1】:

要禁用应用程序中任何组件的复制+粘贴,您可以执行此操作(取自 Disabling 'paste' in a jTextfield

textComponent.setTransferHandler(null);

但除此之外的任何东西都将是一个 hack。您可以使用jnativehook 在全球范围内收听打印屏幕,然后可能会以某种方式关闭您的窗口。我不知道,偏执是一件很棘手的事情。

【讨论】:

    【解决方案2】:

    您可以按照此处的说明清除复制粘贴缓冲区:

    只有空文本并将其复制到缓冲区。

    除此之外,您可以做的可靠的事情并不多。

    代码类似于:

    Action action = new DefaultEditorKit.CopyAction();
    action.actionPerformed(
       new ActionEvent(this, ActionEvent.ACTION_PERFORMED, null));
    

    编辑:对于网络应用,请参阅 this answer,使用 clipboard jquery plugin this way

    【讨论】:

    • 但是如果我想在一些网络应用程序中做呢?我应该使用javascript吗?
    • @despicable 哦,你说的是网络应用?这改变了整个问题,并且不再与 java 有太大关系......添加到我的答案中。
    • 所以实际上我忘了在问题中提及这一点是我的错,但无论如何所有答案对这个主题都很有用。这个解决方案也适用于 Linux 吗?
    • @despicable 如果在浏览器上安装并启用了 Flash。显然,flash 10 安全限制也存在一些问题 - home page 上有更多信息,包括对零剪贴板解决方法的引用。
    • 很棒的东西.. thnaks :)
    【解决方案3】:

    根据要求/安全问题,清除内存(在允许数据写入后)是错误的设计。最好覆盖击键。比如ctrl/alt+(any key)printscr

    要覆盖关键行为,您需要实现KeyListener。一旦您为该键定义了自定义行为,它将不允许默认操作(如复制/剪切..)

    【讨论】:

    • 你能覆盖 printscreen 吗?
    • 你能解释一下我如何覆盖这些键
    • @Patashu ... 没试过,但是因为 java 也有一个键码,所以它可以被覆盖
    【解决方案4】:

    这个替代方法怎么样:

    1. 假设你的程序使用 Swing UI,只在用户关注窗口时显示敏感数据,当用户关注另一个窗口/程序时,使数据不可见
    2. 假设您使用的是 Windows,您可以使用 post 中提到的组策略禁用打印屏幕
    3. 使用其他发帖人建议的防止复制粘贴机制

    说实话,我还没有尝试过,我不确定它是否会起作用。它也可能依赖于操作系统

    【讨论】:

    • 难道不能在你的 GUI 中创建所有文本显示组件(标签、文本框等)的子类版本,当你按下 ctrl+c 时,它会消耗输入并且什么都不做?如果在程序中仍然需要复制和粘贴,那么您甚至可以将其复制到程序的全局剪贴板缓冲区,而不是让操作系统使用它。
    • when you press ctrl+c, consumes the input and does nothing 我该怎么做?我正在寻找这个功能的方法
    猜你喜欢
    • 2013-01-23
    • 2011-02-17
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    相关资源
    最近更新 更多