这段 jQuery 代码是否安全?

6
以下代码是否安全?
$iframe = $('<iframe id="iframe" src="' + $(this).attr('rel') + '" name="iframe">');
$area = $("#ajax-area");
$area.empty().append($iframe);

在以下情况下:

  1. $(this) 是被点击的链接。
  2. attr('rel') 保存了 iframe 的 src,而 rel 是由 PHP 创建的(这里没有用户输入)。
  3. $iframe 包含一个上传表单。

我的担忧是,由于在这种情况下 iframe 的 src 是一个变量,我担心恶意用户会以某种方式编辑 'rel' 属性,并打开他或她想要的 iframe。这有可能吗?

编辑

感谢您宝贵的答案。

PHP 使用以下内容来填充 rel:

App::basePath . '/some/path/to/my/folder';

basePath 是开发者选择的常量。

正如你们建议的那样,我会以更恰当的方式重新设计我的 jQuery。


1
一个明显的情况是当 $(this).attr('rel') 包含在 HTML 中有意义且需要转义的字符。你应该使用 attr() 来填充 src 属性。 - Álvaro González
2个回答

3

理论上,如果rel属性基于服务器常量,则除MiTM等不受控制的问题外,不应存在其他额外的安全问题。

但是,在这些事情上,您始终应该采取安全措施;jQuery通过允许将标记的属性作为构造函数的第二个参数传递来提供这种安全性:

$iframe = $('<iframe />', {
    id: "iframe",
    src=: $(this).attr('rel'),
    name: "iframe"
});

@Shaokan,你已经说过rel不是基于用户输入的了 :) - Ja͢ck
是的,这只是为了确保而已 :) 无论如何还是谢谢,当涉及到安全问题时,我有点偏执。 - Shaokan

1

除非攻击者能够获取链接的rel属性,否则它应该是安全的。

但是,没有详细查看运行环境,很难说一段代码是否安全。可能可以从不同的按钮访问“安全”的代码,从而使您对rel属性的控制失效。

但是,只要注意不允许用户代码在页面中呈现,您就应该是安全的。这意味着您必须转义每个用户提供的输入,特别是如果该输入在站点的其他位置输出(例如,新闻文章的评论)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接