【问题标题】:Is it Ok to use '../' in relative paths?在相对路径中使用“../”可以吗?
【发布时间】:2012-09-05 12:29:20
【问题描述】:

我正在使用 extjs4 构建一个驻留在 drupal 中的 webapp。
我的许多 ajax 调用都是针对 drupal 中模块中的菜单项。
我的 css 指向的图像有时位于我的 extjs 文件夹中,有时位于 drupal 中。

一位同事坚持认为使用“../dir_a/”的相对路径是糟糕的设计,并且容易产生风险。

这是正确的吗? 还有其他方法吗?

我的文件夹结构:

- drupal
   - v2 (extjs home folder)
      - css
      - extjs
   - sites
      - mySite
          - modules
              - webApp

我的 css 文件包含如下调用:

.x-action-col-cell img.restart-test-icon {
    background-image: url(../extjs/examples/sandbox/images/gears.png);
}

我的应用程序有这样的调用:

Ext.Ajax.request({
   url: '../webapp/tests/create/',
   method: 'Post'
});

编辑:评论者要求澄清。 同事对此的两个主要问题是:
1.“如果服务器端代码将生成像/a/b/c 这样的地址,而没有尾随/,您可能会遇到/a/b/c../d 的情况”
是吗?这听起来更像是服务器端问题。
2. “你见过其他人使用它吗?”
在我看来,这是一种非常糟糕的决定方式。
但我继续使用 firebug 测试了一些 JS 密集型网站(gmail、aws),发现在他们的 JS 或 CSS 中没有使用 ../
谁能帮我支持我的说法,即完全没问题?

【问题讨论】:

  • 问问你的同事他指的是哪些风险
  • 相对路径最常用于 CSS 文件,而在实际网页/应用程序中,我建议绝对路径可能更常见——这当然是我一直以来的处理方式——但每个他们自己的。
  • 没关系,但我认为使用相对于根目录的URL更好,因为如果使用../很容易出错。例如,假设您想向上移动 5 个目录,但只使用了四个 ../
  • 我能想到的唯一风险是,如果您使用像 PHP 这样的服务器端语言并允许用户查看服务器上的文件,而无需通过 fileviewer.php?file=somefile.txt 对路径进行清理/沙箱化。您不希望他们阅读../../my_secret_passwords.txt。就客户端而言,我想不出任何风险
  • @lorenzo.marcon 我已经编辑了我的帖子。

标签: javascript css drupal extjs relative-path


【解决方案1】:

不使用相对路径的主要问题是每次移动引用其他文件(例如您的 css、html 和 js 文件)的文件都需要您更改此文件中的引用文件。

另外,如果你有一个 html 源的 javascript 源另一个源 css 文件的 javascript,那么开发人员通常不清楚相对路径是什么(开发人员在这个领域犯错误是很常见的 - 是它是包含 HTML 路径还是引用的调用者路径?)

此外,正如一条评论中提到的,这种做法会导致在服务器端级别使用相同的模式,这在某些情况下可能会导致轻微的安全风险。

使用相对网址的主要原因是它允许您将整个项目从一个目录移动到另一个目录,而无需更改任何内容。如果您使用的是相对于根的 url,则无法做到这一点。

总而言之,这个决定真的取决于个人和项目。我通常更喜欢根相对 url,但我也只有相对 url。

顺便说一句,最好的办法是拥有一个可以用作根的服务器端或编译时变量,这可以为您提供稳定性和灵活性,但通常这是很少有人拥有的奢侈品.

【讨论】:

  • 我考虑过你的最后一个建议,但是在 JS 中这意味着一个全局变量,这从来都不是一件好事。 CSS也会忽略它。所以我们并没有取得太大的成就。谢谢你的回答。
【解决方案2】:

这是一个非常糟糕的论点,类似于说:

如果你不清理你的数据库输入,你可能容易受到 SQL 注入攻击,因此,我不会使用数据库。

这几乎是相同的情况,只是清理输入的问题。

很可能您使用的任何服务器端堆栈都有内置功能(或库)来处理这些事情,类似于 C# 中的 Path 类:http://msdn.microsoft.com/en-us/library/3bdzys9w(v=vs.71)

【讨论】:

    【解决方案3】:

    一个。 “如果服务器端代码将生成像 /a/b/c 这样的地址而没有尾随 / 你可能会遇到这样的情况 /a/b/c../d" 是吗?这听起来更像是服务器端的问题。

    如果您的文件中的路径配置正确,我想不出任何问题。

    b. “你见过其他人使用它吗?”在我看来,这是一种非常糟糕的决定方式。

    确实是(1),这是一种糟糕的方式。我尝试了第一个可用的网站(stackoverflow.com),请参阅此页面中包含的 all.css:

    .review-diff-bar .review-diff-bar-helper {
        background: url("../Img/diff-icons/full-html-diff.png") no-repeat scroll 0 0 transparent;
        ...
    }
    
    .openid-identifier {
        background: url("../img/openid-large.png") no-repeat scroll left center transparent;
        ...
    }
    

    这是一个css,但同样适用于js文件。

    (1) 有关此类谬误的信息:http://www.fallacyfiles.org/ignorant.html

    【讨论】:

    • 谢谢伙计。好答案。我怎么没想到在这里搜索?
    【解决方案4】:

    如果服务器端代码将生成像 /a/b/c 这样的地址而不 尾随 / 您可能会遇到 /a/b/c../d

    这不是它的工作原理。如果您在/a/b/c 并引用../d,浏览器会请求/a/b/d,因为c 不是目录,/a/b/ 是。现在,如果您只是连接字符串,我可能会发现存在问题(请注意,许多语言都具有组装路径的功能)。这不一定是风险,你最终只是要求错误的文件。

    现在,我看到一些非常愚蠢的爬虫通过我的网站,同时尝试使用与 base 标记相结合的相对 URL,并最终在我的日志中出现数千个 404... 因为他们没有考虑到事实上,我所有的相对链接都应该以我的基本标签的 href 开头。不使用基本标签,我没有遇到任何问题(我不提倡相对与绝对的任何一种方式)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-11
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      • 2015-06-23
      • 2015-09-27
      • 2016-01-23
      相关资源
      最近更新 更多