javascript - 如何在 express 中处理非 UTF-8 编码的 url

标签 javascript node.js iis url-encoding bing

我们有一个 node js 应用程序,我们最近从在 IIS 7 上运行(通过 IIS Node )转移到在 Linux 上运行(Elastic Beanstalk)。自从我们切换后,我们收到了很多非 UTF-8 的 url 被发送到我们的应用程序(主要来自爬虫),例如:

Bj%F6rk哪个 IIS 正在转换为 Björk .这现在被传递给我们的应用程序,我们的网络框架(express)最终调用到

decodeURIComponent('Bj%F6rk'); URIError: URI malformed at decodeURIComponent (native) at repl:1:1 at REPLServer.self.eval (repl.js:110:21) at repl.js:249:20 at REPLServer.self.eval (repl.js:122:7) at Interface.<anonymous> (repl.js:239:12) at Interface.emit (events.js:95:17) at Interface._onLine (readline.js:203:10) at Interface._line (readline.js:532:8) at Interface._ttyWrite (readline.js:761:14)

有没有推荐的安全方法,我们可以在将 url 字符串发送到 express 之前执行与 IIS 相同的转换?

牢记在心

  1. 我们收到了对这些编码错误的 URL 的请求,并且
  2. 有一种方法可以使用 deprecated unescape javascript function 对它们进行解码。和
  3. 对这些 URL 的大部分请求来自 Bing Bot,我们希望尽量减少对我们搜索排名的不利影响。

    • 我们真的应该对所有传入的 URL 都这样做吗?
    • 我们是否应该关注任何安全或性能影响?
    • 我们应该关注 unescape在不久的将来会被移除?
    • 有没有更好/更安全的方法来解决这个问题(是的,我们确实阅读了上面链接的 MDN 文章)

最佳答案

Should we really be doing this for all incoming URLs?

不,你不应该。发出的请求使用非 UTF8 URI 组件。这不应该是你的问题。

Are there any security or performance implications we should be concerned about?

URI 组件的编码不是安全问题。通过查询字符串或路径参数的注入(inject)尝试是。但那是另一个话题。在性能方面,每个中间件都会使您的响应时间更长一些。但我什至不会担心这个。如果你想自己解码 URI,那就去做吧。只需几毫秒。

Should we be concerned about unescape being removed in the near future?

其实你应该。 unescape 已弃用。如果您还想使用它;只需先检查它是否存在。即 'unescape' in global。您还可以使用内置的替代: require('querystring').unescape() 不会在每种情况下产生相同的结果,但不会抛出 URIError。 (虽然不推荐)。

为了尽量减少对搜索排名的不利影响:

确定您的快速应用在这些情况下返回的状态代码。可能是 500 (INTERNAL SERVER ERROR) 看起来很糟糕,而 404 (NOT FOUND) 会告诉爬虫您没有查询结果(可能不是真的)。

在这些情况下,我建议您通过返回诸如 400 (BAD REQUEST) 之类的客户端错误来覆盖它,因为问题的根源是请求的格式错误的 URI 组件,应该是在 UTF-8 中,但不是。爬虫/机器人应该关注这一点。

// middleware for responding with BAD REQUEST
app.use(function (err, req, res, next) {
    if (err instanceof URIError) {
        res.status(400).send();
    }
});

首先,尝试为格式错误的 URI 返回结果还有其他副作用。首先,您将允许一个错误的请求 - 不可能是好的 :)。其次,这意味着您有一个错误 URI 的结果,当爬虫/机器人获得 200 OK 响应时,该 URI 将被存储并传播。然后你将不得不处理更多的错误请求。

总结;不要通过 unescape 解码。 Express 已经尝试通过正确的方式进行解码:decodeURIComponent。如果失败了,那就顺其自然吧。

关于javascript - 如何在 express 中处理非 UTF-8 编码的 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32653145/

相关文章:

javascript - iframe 手机问题

javascript - 将 jQuery 选择器与 Ajax 响应结合使用

node.js - NodeJs : How to handle a very high amount of timers?

windows - 带有 applicationInitialization 和 Kestrel 的 .NET Core

c# - 在 IIS 中部署时,复选框在 TreeView 控件的节点上不可见

iis - 将 asp.net core 配置排除在源代码和管道之外

javascript - 如何快速获取html文本输入值和输出

java - 无法从 javascript 调用支持 bean 方法

Node.js/CouchDB : Use . json 文件而不是数据库 + 版本控制

javascript - 我正在将 ytdl-core 用于音乐机器人,它一直输出播放未定义