【问题标题】:Best Practices - Disabling/Avoiding Content Copying [closed]最佳实践 - 禁用/避免内容复制 [关闭]
【发布时间】:2014-01-08 00:53:58
【问题描述】:

伙计们,我正在为我的网站开发一个测试系统,我认为人们可能会尝试复制我的问题并在谷歌上搜索它们,或者可能会在测试后打印屏幕来研究问题。

这些是复制信息的可能方式:
1) 按 PrintScreen 键;
2) 按组合键:Alt + PrintScreen;
3)按鼠标右键,点击复制;
4) 按组合键:Control + C;
5) 使用打印工具,如 fraps 或 ms 截图工具;

那么我怎样才能强制用户关闭所有程序,并阻止他使用上面列出的方法呢?可能是 Javascript 或 Jquery,但如何?

【问题讨论】:

  • 这两种保护方法都不会真正起作用,所以不要再惹你的用户了。
  • 绝对没有意义。 “总是”有另一种解决方法。你只会勾引人们,投入时间和金钱试图阻止他们,到头来却一无所获。
  • 你不能。由于 JavaScript 在客户端运行,因此它可以由用户操作。例如,他们可以简单地在浏览器中禁用 JavaScript。或者他们可以运行脚本来禁止您尝试使用他们的程序和组合键进行调整。
  • .... 然后总有一个相机可以放在屏幕前拍照。这就是为什么进行在线测试但希望保护其测试问题的组织(例如Toefl.org)仅在有人监视每个参与者的受控环境中进行测试
  • 尽管如此,有一种直接的方法可以使问题至少无法复制+粘贴:将其呈现在图像中。

标签: javascript php jquery testing


【解决方案1】:

正如其他人所说,没有实际的解决方案可以阻止人们复制内容。此外,如果您强制 ALT 键停止工作,那么残障人士将无法再使用您的页面。所以我会做一些完全不同的事情:当你不想发生的事情发生时,让你的页面无法阅读(除非参加测试的人知道如何在他们的浏览器中使用开发者工具)。

如果我们假设这是您的 CSS 样式:

body { 
    user-select:none;  /* try to prevent highlighting of text */
}
.readable {     /* readable = contrasting colors */
     color:black;
     background-color:white;
}
.unreadable {    /* unreadable = the same color */
     color:white;
     background-color:white;
}
.unreadable::selection {     /* for highlighted text, if user-select fails */
     background-color:white;
     color:white;
}

那么这里是一个基本的可读性改变函数:

function canYouReadMe(yes) {
    if(yes) {  //we can read black on white
        document.body.setAttribute('class','readable');
    } else {   //we can't read white on white
        document.body.setAttribute('class','unreadable');
    }
}

这是用于处理控制、打印屏幕和 alt 的 JQuery。键按下,您无法阅读该页面。键上升,你可以再读一遍。

$(window).keydown(function(e){
    if (e.ctrlKey              //control key
           || e.keyCode == 44  //print screen
           || e.keyCode == 18  //alt key
      ) {
        canYouReadMe(false);
        if(e.ctrlKey) {
           e.preventDefault();  //stop copy-paste but not alt
           return false;
        }
    }
});
$(window).keyup(function(e){
    if (e.ctrlKey              //control key
           || e.keyCode == 44  //print screen
           || e.keyCode == 18  //alt key
      ) {
        canYouReadMe(true);
        if(e.ctrlKey) {
           e.preventDefault(); 
           return false;
        }
    }
});

另一个处理鼠标右键(即数字 3):

$(window).mousedown(function(e) {
    if (e.which == 3) { 
        canYouReadMe(false);
        e.preventDefault();  //stop the menu from appearing
        return false;
    }
});
$(window).mouseup(function(e) {
    if (e.which == 3) { 
        canYouReadMe(true);
        e.preventDefault();
        return false;
    }
});

这是您停止其他程序和非焦点打印屏幕所需要的:除非处于焦点,否则您的页面将无法读取。因此,如果他们切换到另一个窗口,他们将什么也看不到。这也可以防止他们在另一个窗口中键入内容时简单地阅读您的页面。

$(window).focus(function() {
    canYouReadMe(true);  //read on focus
});

$(window).blur(function() {
    canYouReadMe(false);  //unreadable when focus is lost
});

如果窗口焦点/模糊失败,您还可以考虑使用 CSS 来呈现仅在全屏时可读的内容。我不确定这是否可行。

我没有测试过这些——这只是我的理论,它应该可以工作,这里和那里有一些调整。

编辑:为了解决人们谈论视图源等问题:您应该使用 ajax 来呈现您的文本。这样,如果他们禁用 JavaScript,他们将什么也看不到,如果他们使用查看源代码,他们仍然什么也看不到。同样,他们可以使用开发人员工具(例如 Inspect Element)来解决它,但如果他们那么精明,无论如何你都不会阻止他们。

【讨论】:

    【解决方案2】:

    正如所有之前的海报所说,没有办法阻止用户进行任何这些操作。

    但是,您可以通过 css 禁用文本选择,并使其更加“不方便”,并且可能会阻止您的普通日常用户如此轻松地复制+粘贴。当然,精明的用户甚至可以绕过这个,所以它也不是万无一失的。

    -webkit-touch-callout: none;
    -webkit-user-select: none;
    -khtml-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
    

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      没有技术解决方案,要么太难,要么不可行。

      教师有哪些传统方法来减少使用复制?制作多个版本。改变一些变量,会有不同的结果。

      也许你有更好的想法?

      【讨论】:

        猜你喜欢
        • 2019-04-03
        • 1970-01-01
        • 2012-01-25
        • 1970-01-01
        • 2022-10-01
        • 2010-11-28
        • 1970-01-01
        • 2012-02-19
        • 1970-01-01
        相关资源
        最近更新 更多