無標題文檔

由 IE8 User-Agent 更新想到的

IE 开发团队更改了 IE8 的 User-agent ,更改的部分信息如下:

IE8 on Windows Vista (Compatibility View)
    Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0) 

IE8 on Windows Vista
    Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)

除了 IE8 因 Compatibility View 功能 造成单浏览器「原生」多个 User-agent 外,还有个情况也变得非常的有趣,就是几乎每个浏览器都将自己渲染引擎的标识加入到了 User-agent 中(Gecko、 WebkitTrident) )。

User-agent 信息常被用作检测浏览器类型和版本的最佳途径( YUIjQuery ),而上述的改动是否意味着以后类似的检测脚本会变得更加的复杂?回答这个问题之前,让我们看下 Mootools 如何检测浏览器信息

var Browser = {
    Engine: {name: 'unknown', version: 0},
    Features: {
        xpath: !!(document.evaluate),     // 是否支持 XPath
          air: !!(window.runtime),        // 是否支持 Air 扩展
        query: !!(document.querySelector) // 是否支持 CSS 选择器
    },
    Engines: {
        // 判断 Opera
        presto: function() {
            return (!window.opera) ? 
                false : ((arguments.callee.caller) ? 
                    960 : ((document.getElementsByClassName) ? 950 : 925));
        },
        // 判断 IE,根据 ActiveX 和 特有的 XMLHttpRequest 对象
        trident: function() {
            return (!window.ActiveXObject) ? 
                           false : ((window.XMLHttpRequest) ? 5 : 4);
        },
        // Webkit 核心的浏览器,如 Safari 和 Chrome
        webkit: function() {
            return (navigator.taintEnabled) ? 
                false : ((Browser.Features.xpath) ? 
                    ((Browser.Features.query) ? 525 : 420) : 419);
        },
        // Mozilla Gecko 核心浏览器,如 Firefox
        gecko: function() {
            return (document.getBoxObjectFor == undefined) ?
                false : ((document.getElementsByClassName) ? 19 : 18);
        }
    }
};

Browser.detect = function() {
    for (var engine in this.Engines){
        var version = this.Engines[engine]();
        // 如果具有特定的浏览器对象
        if (version){
            this.Engine = {name: engine, version: version};
            this.Engine[engine] = this.Engine[engine + version] = true;
            break;
        }
    }
    return {name: engine, version: version};
};

Browser.detect();

上述代码让人感到耳目一新,它是根据浏览器功能而非 User-agent 判断浏览器类型。仔细考虑一下, User-agent 信息可以被伪造 ,同时浏览器厂商日后也会更改 User-agent 信息,所以此种情况下根据功能判断浏览器类型会可靠得多。

延伸下此策略,比如我们会编写这样的代码:

if (ie) {
  // ie only
} else {
  // other browsers
}

这样因浏览器差异而编写的「硬代码」,往往会造成维护两套实际相同功能的代码,并造成逻辑上的混乱。何不先抛开浏览器兼容的问题,然后再判断相应的对象是否被浏览器支持。

OK,有关编程思想的问题就不继续了…

-- Split --

PS,目前判断是否是 IE8 可这样编写(来自 舜子 ):

var isIE8 = !!window.XDomainRequest;

2009 年,IE6 走好

https://friable.rocks/_/2009_01_03/1230920848.png

根据 Dotzler 的统计 ,IE6 的份额正在缩水,这可能是 2009 年本人听到的第一个好消息。于此同时, Gmail 的浏览器支持列表中已经将 IE6 给剔除 ,Google 官方 推荐用户使用 Firefox 或者 Chrome 可获得双倍的速度和用户体验。

那么, 似乎又回到 了 IE6 的话题。

IE6 为什么存在着?

IE6 的发布时间可以追溯到 2001 年的 Windows XP 的发布。是的,IE6 已经成为了世上最「长寿」的浏览器。而问题是,IE6 为什么能够如此顽强的存在着。抛砖引玉,本人先列举几条,欢迎补充:

操作系统的「潜规则」

Windows 系统和 IE 紧紧的捆绑,使得升级浏览器变得如履薄冰。正如我们看到的,几年来 Windows 系统的补丁也仅仅是在原有的基础上缝缝补补 -- 微软显然不愿冒这个风险。

Vista 的失败

Vista 已经变成了第二个 Windows ME 。撇开这个先不谈,用户升级浏览器的另种情况,就是操作系统的升级。Vista 商业上的失败,注定 IE6 搭载的 XP 这艘船能够续航更长的一段时间。

IE7 也不是什么好鸟

2006 年底发布的 IE7 远远的没有达到市场的预期。从当时的 IE7 发布情况看,注定 IE7 只是个过渡性的产品。

IE8 开发进展缓慢,并远被甩在了后面

「现在这个功能,我们也有了」, D2 上微软兄弟幽默的言语 也折射出一个事实,目前根本就没有用户敢用 IE8。IE6-8 三个版本并存的混乱局面,越发说明了微软的这个坑是被自己越挖越大、越挖越深了。

普通用户不在乎

是的,这是事实。普通用户而言,上网仅仅是双击某个图标,输入某个网址就可以。他不了解什么是浏览器,当然也没必要了解。对于他们而言,能够完成自己的目标才是最重要的。

国内「特殊的情况」

譬如:国内的软件几乎都是免费的,获取没有任何的成本、国内的教程几乎都是介绍怎么使用 Dreamweaver、 Firefox 在国内病毒式的推广 ,在部分「不明真相」的用户心中,俨然已经是恶意软件的代名词,等等…

「2009 年,IE6 真的会消亡吗」

那么,在接下来的 2009 年,IE6 真的会消亡吗?在本人看来,至少不会完全消亡。IE6 的完全消亡,需要我们大家共同的参与。例如,作为名前端(或者其他与浏览器打交道的兄弟),应该怎么做?

浏览器的表现不完全一致

不同的浏览器提供的功能和性能不完全一致,所以页面没必要在所有的浏览器中完全的一致。我们要让我们的同伴、用户了解,至少那 2001 年发布的浏览器所表现的性能,不可能和现代的浏览器完全一致。

对于 IE6 的优雅降级

我们可以尝试先丢下 IE6 的包袱,开始针对现代的浏览器开发,然后 优雅的降级 到老版本的浏览器。例如,我们可以高版本的 CSS 特性,然后再针对 IE6 使用单独的脚本去实现它。

继续布道

我们要让更多的人了解 IE6 是个糟糕的浏览器,并推荐他们使用更好的浏览器,譬如 Firefox、Chrome 等。

-- Split --

最后,解铃还须系铃人。2009 年微软 即将发布的 Windows7 ,从另个侧面也将推动 IE6 的灭亡。总之,09 新年伊始,是时候给那老态龙钟的 IE6 钉上棺材钉了。

Magic quotes 的问题

对于 Magic quotes,对于 PHPer 而言是个老生常谈的问题。今天无意间 看到篇文章 ,结合 PHP Manual 以及其回复,在这里做个简单的汇总。

简而言之,Magic quotes 开启后会自动转义输入的数据。其中,所有的单引号(')、双引号(\")、反斜线、和 NULL 字符都会被转义(增加个反斜线), 其实这操作本质上调用的是 addslashes 函数

为什么使用 Magic quotes

方便快捷

PHP 的设计者在设计之初的构想就是能够快速方便的编程。例如插入数据库时,Magic quotes 会自动将数据转义,这很方便。

对初学者有利

Magic quotes 可以从一定程度上,让初学者带离脚本的安全风险。例如在没有任何保护措施的代码下,开启了 Magic quotes 后会少很多的风险,例如 注入问题 。当然,单一使用此方法,并不能完全阻止此类安全问题。

「我没有权限去关闭」

很显然你已经可能意识到了这个问题,但是主机空间并非完全由自己控制。

为什么不使用 Magic quotes

可移植性

无论此功能是否开启,它都会影响脚本的可移植性,因为它影响我们后续过滤数据的操作。

性能问题

在获取所有的外部数据之前都会被转义,这无疑会增加运行时的花销(而且并不是所有的数据都需要转义)。

造成困惑

正如上述所言,并非所有的数据都需要被转义。有可能出现的一种情况,就是当你为了获取未被转义的数据,而「疯狂的」使用 stripslashes 函数。

PHP6 已经不支持

PHP 的设计者显然已经意识到了自己的「错误」,所以在 PHP6 中已经将其废弃。

如何禁用 Magic quotes

按照本人观点,使用 php.ini 配置文件全局禁用 Magic quotes 是最靠谱的。参考下面的代码

; Magic quotes
;
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off
; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off
; Use Sybase-style magic quotes (escape ' with '' instead of ').
magic_quotes_sybase = Off

然而线上的主机可能无法让你修改 php.ini 文件,那么可以使用 .htaccess 文件禁用,加入下面的代码

php_flag magic_quotes_gpc Off

上述可移植的代码而言,无论是否禁用 magic_quotes,数据必须保持一致。那么下面的代码可以帮助您

		

我的照片

嗨!我叫「明城」,八零后、码农、宁波佬,现居杭州。除了这里,同时也欢迎您关注我的 GitHubTwitterInstagram 等。

这个 Blog 原先的名字叫 Gracecode.com 、现在叫 「無標題文檔」 。 要知道作为码农取名是件很难的事情,所以不想在取名这事情上太费心思。

作为八零后,自认为还仅存点点可能不怎么被理解的幽默感,以及对平淡生活的追求和向往。 为了避免不必要的麻烦,声明本站所输出的内容以及观点仅代表个人,不代表自己所服务公司或组织的任何立场。

如果您想联系我,可以发我邮件 `echo bWluZ2NoZW5nQG91dGxvb2suY29tCg== | base64 -d`

分类

搜索

文章