为什么我在此构造中收到安全警告消息“此文件包含可能不安全的动态内容”

时间:2011-12-20 23:57:45

标签: wolfram-mathematica

我终于能够重现我偶尔会收到的这条消息。

这是在V8.04上,在Windows 7上。

在尝试时,我发现当我打开带有Manipulate的笔记本时,Mathematica如何生成上述信息。

首先是错误消息屏幕:

enter image description here

我现在点击'启用动态',一切似乎都很好。但每次我重新打开笔记本时,我都会再次收到消息。 (必须关闭M,然后再次启动,然后打开笔记本以查看消息)。

所以我不明白这条警告信息,以及它出现的原因,以及我需要在代码中更改以删除它。

生成它的代码是:

Manipulate[

  DynamicModule[{p},
   p["x"] = 0;
   Row[{Dynamic[
      Refresh[p["x"]++; Row[{"p[x]=", p["x"]}],
       TrackedSymbols -> {n}]]}]
   ],

  Button["update counter", n++],
  {{n,0}, None}
  ]

以上是在自己的笔记本上,笔记本中没有别的东西。

我关闭M,然后启动它,然后打开笔记本,我看到上面的消息。

现在,我认为要删除消息,我需要将p [“x”]更改为p [x],所以我关闭了上面的笔记本,用这段代码制作了一个新的笔记本:

Manipulate[

  DynamicModule[{p},
   p = 0;
   Row[{Dynamic[Refresh[p++; Row[{"p=", p}], TrackedSymbols -> {n}]]}]
   ],

  Button["update counter", n++],
  {{n, 0}, None}
  ]

然后关闭M,再次启动它,打开上面的笔记本, 现在我没有看到警告信息。但是当我重复这个过程时,我看到同样的错误又回来了。

(我把这个问题发布到了数学小组,但这很慢,我的帖子甚至都没有出现在那里,但在那篇文章中我说当我将p [“x”]改为p时错误就消失了[x],因为它实际上一开始就做了,但是当我后来尝试它时,消息又回来了,我不明白为什么)

p [“x”]是一个索引对象,如本页所述:

http://reference.wolfram.com/mathematica/tutorial/MakingDefinitionsForIndexedObjects.html

问题是:上面代码中的内容会显示此警告?我在上面的例子中写错了什么?

启用动态后,

代码运行正常。顺便说一句,我打开这个笔记本从同一个文件夹打开我所有的其他笔记本,没有任何改变,这是在家用电脑上,没有网络共享文件夹,没有任何异常。

以下是笔记本安全性的相关链接

http://reference.wolfram.com/mathematica/tutorial/NotebookSecurity.html

我在上面没有看到与我在做什么相关的任何事情。所有我能说的,都与在Manipulate中使用DynamicModule []有关,它本身就是一个DynamicModule。但是我不太清楚这一点,以确定这是一个问题。

更新1

我不知道这与路径有什么关系。我可以通过简单地将内部动态注释掉来删除错误:

Manipulate[


 (*
   DynamicModule[{p},
   p["x"]=0;
   Row[{Dynamic[Refresh[p["x"]++;Row[{"p[x]=",p["x"]}],TrackedSymbols-> \
   {n}]]}]
   ],
 *)

 n,
 Button["update counter", n++],
 {{n, 0}, None}
 ]

保存笔记本,关闭M,启动M,打开笔记本。错误消失了。

所以,它在代码中。

更新2

试图重现尤达在答案中所报告的内容,我无法做到。

  1. 制作新笔记本,输入Dynamic@DateString[]
  2. 输入评估。
  3. SAVE
  4. 关闭M
  5. 打开M
  6. 打开笔记本
  7. 没有错误
  8. enter image description here

    2001年12月21日更新

    在数学小组,John Fultz非常友好地回复我的帖子,我不认为如果我在这里发布他的答案以便其他人看到

    > > So, why is using p["x"] causing the security warning message?
    
    That is a bug, which has already been fixed in development sources.
    John Fultz
    User Interface Group
    Wolfram Research, Inc.
    

    很抱歉,我没有链接包含他的回复,我现在无法在谷歌上找到链接。我使用thunderbird来阅读新闻组。

    现在这个问题应该保持开放吗?还是应该关闭?如果我需要关闭它,我可以接受其中一个答案,以便关闭它。

4 个答案:

答案 0 :(得分:3)

这更像是Yoda的答案和评论的延续,而不是单独的独立答案,但正如已经说明的那样,如果您从不受信任的目录中打开笔记本和,您在输出单元格中有动态内容你会得到一个安全警告。如果您评估以下代码:

CurrentValue[$FrontEnd, {"NotebookSecurityOptions", "TrustedPath"}]

CurrentValue[$FrontEnd, {"NotebookSecurityOptions", "UntrustedPath"}]

NotebookDirectory[]

您将能够确定您的笔记本电脑是否处于受信任或不受信任的路径中(尽管出现或未出现安全警告)。

答案 1 :(得分:3)

假设您使用默认选项设置(即“TrustByDefault” - >自动),您将看到三种行为之一。

  • 如果笔记本位于“TrustedPath”中列出的目录中,则认为内容是安全的,您将永远不会看到警告。

  • 如果笔记本电脑位于“UntrustedPath”中列出的目录中,则认为内容不安全,您将始终看到警告。

  • 如果笔记本位于“TrustedPath”和“UntrustedPath”中都没有列出的目录中,则可能会也可能看不到警告,具体取决于笔记本中存储的DynamicBox表达式的内容。 Mathematica将在尝试评估之前检查表达式。如果它只包含来自“安全”表达式的短白名单的表达式,那么您将看不到警告。如果它包含任何未包含在“安全”表达式白名单中的表达式,那么您将看到警告。

答案 2 :(得分:2)

这不是因为特定的代码示例,而是由于Mathematica的安全功能。来自tutorial/NotebookSecurity

  

当用户打开包含动态内容的笔记本时,Mathematica   将首先确定笔记本的目录是否可信,   不信任,或两者都没有。

     
      
  • 如果笔记本电脑的目录受信任,笔记本电脑将被允许自动执行动态评估而不发出警报   用户。
  •   
  • 如果笔记本电脑的目录不受信任,用户将在笔记本电脑尝试进行动态评估时收到提醒。   enter image description here
  •   

默认情况下,只有$InstallationDirectory$BaseDirectory$UserBaseDirectory是“受信任的”。此外,还有一组总是不受信任(可以更改)的目录。这些是你的下载
现在的解决方案是将当前工作目录添加到可信文件夹列表中。

转到Preferences > Advanced > Open Options Inspector,在Global Preferences下,开始搜索trusted,您会看到弹出的三个选项。你可以在这里添加它们。

enter image description here

答案 3 :(得分:2)

我在笔记本电脑上出现这个消息时遇到了问题我之前认为它没有出现,但我现在确信这是因为笔记本中存在动态输出以及动态输出运行的事实前端。因此,当您打开具有动态输出的笔记本时,FE将尝试运行它。如果从笔记本中删除所有动态输出,保存它,关闭它(甚至关闭并重新打开Mathematica以确保)然后重新打开笔记本,因为没有动态输出,所以不应出现消息。

我按照yoda的建议做了,我打开了Option Inspector并在全局首选项中编辑了TrustedPath。我发布这个“答案”作为yoda答案的延续,因为我必须做一些游戏来弄清楚如何添加TrustedPath的路径。

我将Documents作为可信路径添加如下(在Mac OS 10.6上)(我小心不要保存任何我不相信的东西):

  1. 单击TrustedPath的Value列左侧的小编辑按钮。
  2. 在打开的窗口中单击“添加”。
  3. 您将看到

    FrontEnd`FileName [{$ RootDirectory}, “X”

  4. 将x替换为您想要信任的路径,例如:

    FrontEnd`FileName [{$ RootDirectory},“/ Users / John / Documents /”]

  5. 现在我从来没有收到存储在Documents或其任何子文件夹中的笔记本的恼人警告。