执行 CGI 脚本时出现软件错误

2023-12-19

我有一个用于上传的cgi脚本如下

#!/usr/bin/perl
use CGI;
use CGI::Carp qw(fatalsToBrowser);

my $cgi = new CGI;
my $file = $cgi->param('file');
$file=~m/^.*(\\|\/)(.*)/; # strip the remote path and keep the filename
my $name = $2;
open(LOCAL, ">/home/Desktop/$name") or die $!;

while(<$file>) {
  $data .= $_;
}
print $cgi->header();
print "$file has been successfully uploaded... thank you.\n";
    print $data;

HTML文件如下

<html>
<head>
    <title>Test</title>
</head>

<body>
    <form enctype="multipart/form-data" action="upload.cgi" method="post">
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
            Send this file: <input name="userfile" type="file" />
<input type="submit" value="Send File" />
</form>
</body>
</html>

我现在收到一个奇怪的错误..

软件错误:

是 htdocs/upload.cgi 第 9 行的目录。

如需帮助,请发送邮件至本网站的网站管理员,提供此错误消息以及错误的时间和日期。


TL;DR

Stop.搁置你的脚本现在。这是一个巨大的安全漏洞waiting被剥削。阅读以下资源:

  • perlsec http://perldoc.perl.org/perlsec.html
  • the CERT Perl 安全编码标准 https://www.securecoding.cert.org/confluence/displa/perl/CERT+Perl+Secure+Coding+Standard(特别是关于输入验证和数据清理 https://www.securecoding.cert.org/confluence/display/perl/01.+Input+Validation+and+Data+Sanitization)
  • OWASP 页面无限制文件上传 https://www.owasp.org/index.php/Unrestricted_File_Upload
  • 信息安全页面完整的文件上传漏洞 http://resources.infosecinstitute.com/file-upload-vulnerabilities/
  • CWE 页面危险类型文件无限制上传 http://cwe.mitre.org/data/definitions/434.html
  • SANS 建议实现安全文件上传的 8 条基本规则 http://software-security.sans.org/blog/2009/12/28/8-basic-rules-to-implement-secure-file-uploads.

当你读完并理解了所有这些内容后,停下来想一想,如果你really需要让用户上传文件到你的服务器上。思考long and hard.您真的能解释所有列出的漏洞吗?如果您仍然觉得需要这样做,请考虑寻求安全专家的帮助。遵循上述资源中规定的准则小心并了解设计中的错误可能会损害您的整个网站。


我知道这只是一个测试脚本,而不是一个生产应用程序(至少,我真的希望是这样),但即便如此,你正在做的事情(特别是how你正在做这件事)是一个非常,very 馊主意。这里有一个选择few的 原因,来自 OWASP 页面无限制文件 上传 https://www.owasp.org/index.php/Unrestricted_File_Upload:

  • 该网站可能会被篡改。
  • Web服务器可以通过上传并执行Web-Shell来受到危害,该Web-Shell可以:运行命令、浏览系统文件、浏览本地资源、攻击其他服务器、利用本地漏洞等。
  • 此漏洞可能使网站容易受到 XSS 等其他类型的攻击。
  • 可以通过将恶意文件上传到服务器来利用本地文件包含漏洞。

更多来自 OWASP:

上传的文件对应用程序构成重大风险。第一步 很多攻击都是为了获取一些代码到被攻击的系统中。然后攻击 只需要找到一种方法来执行代码即可。使用文件上传有帮助 攻击者完成第一步。

不受限制的文件上传的后果可能会有所不同,包括完全 系统接管、文件系统过载、将攻击转发到后端 系统和简单的破坏。

很可怕的东西,是吧?

存在的问题

你的代码

让我们首先看看您发布的代码存在的一些问题。

没有严格,没有警告

开始推杆use strict; use warnings;在顶端你的每一个 Perl 脚本 曾经写过。我最近有幸修复了一个 CGI 脚本,其中包含 像这样的片段:

my ($match) = grep { /$usrname/ } @users;

此代码用于检查在 HTML 表单中输入的用户名是否与 有效用户列表。问题一:变量$usrname曾是 拼写错误(应该是$username带“e”)。既然严格 检查关闭,Perl 愉快地插入了(未声明的)全局值 多变的$usrname, or undef。这把看似无辜的片段变成了这个怪物:

my ($match) = grep { // } @users;

哪个匹配一切在有效用户列表中并返回第一个 匹配。您可以在表单的用户名字段中输入您想要的任何内容 并且脚本会认为您是有效用户。由于警告也已关闭, 在开发过程中从未发现这一点。当您打开警告时, 该脚本仍然会运行并返回一个用户,但你也会得到类似的东西 这:

Name "main::usrname" used only once: possible typo at -e line 1.
Use of uninitialized value $usrname in regexp compilation at -e line 1.

当您还打开严格时,脚本将无法编译,甚至无法运行 全部。此代码片段还存在其他问题(例如,字符串“a”将与用户名“janedoe”匹配),但严格和警告至少提醒我们注意一个主要问题。我怎么强调都不为过:总是,always use strict; use warnings;

无污染模式

Web 开发的第一条规则是, “始终清理用户输入。”跟我重复一遍:始终清理用户输入。再一次:始终清理用户输入。换句话说,从来没有 盲目信任用户输入而不首先验证它。用户(即使是那些没有恶意的用户)非常擅长将创意值输入到表单中 可能会破坏您的应用程序(或更糟)的字段。如果你不限制他们的创造力 恶意用户对您的网站造成的损害是没有限制的(请参阅多年生 #1 OWASP Top 10 漏洞, 注射 https://www.owasp.org/index.php/Top_10_2013-A1-Injection).

Perl 的污染模式可以帮助解决这个问题。污点模式强迫你 在某些潜在危险的操作中使用之前检查所有用户输入,例如system()功能。污点模式就像枪上的安全装置:它可以防止很多痛苦 意外事故(不过如果你真的想搬起石头砸自己的脚,你可以 始终关闭安全性,例如当您在未实际删除危险字符的情况下取消污染变量时)。 打开污点模式您编写的每一个 CGI 脚本。您可以通过传递来启用它-T标志,像这样:

#!/usr/bin/perl -T

启用污点模式后,如果您尝试执行以下操作,您的脚本将引发致命错误 在危险情况下使用受污染的数据。这是我在互联网上的随机脚本中发现的这种危险情况的示例:

open(LOCAL, ">/home/Desktop/$name") or die $!;

好吧,我撒谎了,该片段不是来自随机脚本,而是来自your代码。孤立地看,这个片段只是在乞求被击中目录遍历攻击 http://en.wikipedia.org/wiki/Directory_traversal_attack,恶意用户在其中输入相对路径以访问他们不应访问的文件。

Fortunately, you've done something right here: you ensured that $name will contain no directory separators by using a regex*. This is exactly what taint mode would require you to do. The benefit of taint mode is that if you forget to sanitize your input, you will be alerted immediately with an error like this:

Insecure dependency in open while running with -T switch at foo.cgi line 5

与严格一样,污点模式迫使您通过导致程序失败来立即解决代码中的问题,而不是让它静静地跛行。

* 你做了一些thing是的,但你也做了一些things wrong:

  • 如果用户只传递一个没有目录分隔符的文件名,你的程序将会死掉,例如foo
  • 您不会删除可由 shell 解释的特殊字符,例如|
  • 你永远不会清理变量$file但您稍后尝试在代码中使用它来读取文件
  • 您不检查要写入的文件是否已经存在(请参阅下面的“不检查文件是否存在”)
  • 您允许用户选择将存储在您的服务器上的文件的名称,这给了他们比您应该熟悉的更多的控制权(请参阅下面的“允许用户设置文件名”)

CGI::鲤鱼 fatalsToBrowser

我会在这个问题上给你一个无罪推论,因为你仍在测试你的脚本,但以防万一你不知道并且因为我已经在谈论 CGI 安全问题,切勿在生产环境中启用 CGI::Carp 的 fatalsToBrowser 选项。它可以向攻击者透露有关脚本内部工作原理的详细信息。

两个参数open()和全局文件句柄

两个参数open(), e.g.

open FH, ">$file"

has a 许多与之相关的安全风险 https://www.securecoding.cert.org/confluence/pages/viewpage.action?pageId=76775519当允许用户指定文件路径时。您的脚本通过使用硬编码的目录前缀来缓解其中的许多问题,但这绝不会削弱使用两个参数 open 可以非常危险。一般来说,您应该使用三参数形式:

open my $fh, ">", $file

(如果允许用户指定文件名,这仍然很危险;请参阅下面的“允许用户设置文件名”)。

另请注意,而不是全局文件句柄FH我切换到词法文件句柄$fh。请参阅 CERT 的页面不要使用裸字文件句柄 https://www.securecoding.cert.org/confluence/display/perl/FIO00-PL.+Do+not+use+bareword+file+handles由于某些原因。

不检查文件是否存在

您不检查文件是否已存在于/home/Desktop/$name当你打开它进行书写时。如果文件已经存在,您将截断它(擦除其内容)一旦open()调用成功,即使您从未向文件写入任何内容。用户(恶意的和其他的)可能会破坏彼此的文件,这不会让用户群感到非常高兴。

文件大小没有限制

“但是等等,”你说,“我设定了MAX_FILE_SIZE在我的 HTML 表单中!” 请注意,这只是对浏览器的建议;攻击者可以轻松编辑 HTTP 请求以消除这种情况。切勿依赖隐藏的 HTML 字段来确保安全。隐藏字段在页面的 HTML 源代码和原始 HTTP 请求中清晰可见。您必须限制最大请求大小服务器端防止用户将大量文件加载到您的服务器并帮助减轻一种类型的拒绝服务攻击。设置$CGI::POST_MAX变量位于 CGI 脚本的开头,如下所示:

$CGI::POST_MAX=1024 * 30;  # 30KB

或者更好的是,在您的系统上找到 CGI.pm 并更改$POST_MAX为所有使用 CGI 模块的脚本进行全局设置。这样您就不必记住在编写的每个 CGI 脚本的开头设置变量。

CGI 与 HTML 表单不匹配

用于 HTML 表单中文件路径的 POST 变量,userfile,与您在 CGI 脚本中查找的变量不匹配,file。这就是您的脚本失败并出现错误的原因

Is a directory

的价值

$cgi->param('file')

is undef所以你的脚本尝试打开路径

/home/Desktop/

作为常规文件。

处理上传的过时方法

您正在使用旧的(并且过时的)方法来处理 CGI.pm 的上传,其中param()用于获取文件名和轻量级文件句柄。这不适用于严格的并且不安全。这upload()方法在 v2.47 中添加(早在 1999 年!)作为首选替代方法。像这样使用它(直接从CGI.pm 的文档 http://perldoc.perl.org/CGI.html#PROCESSING-A-FILE-UPLOAD-FIELD):

$lightweight_fh  = $q->upload('field_name');
# undef may be returned if it's not a valid file handle
if (defined $lightweight_fh) {
    # Upgrade the handle to one compatible with IO::Handle:
    my $io_handle = $lightweight_fh->handle;
    open (OUTFILE,'>>','/usr/local/web/users/feedback');
    while ($bytesread = $io_handle->read($buffer,1024)) {
        print OUTFILE $buffer;
    }
}

where field_name是保存文件名的 POST 变量的名称(在您的情况下,userfile)。请注意,示例代码不会根据用户输入设置输出文件名,这引出了我的下一点。

允许用户设置文件名

Never允许用户选择将在您的服务器上使用的文件名。如果攻击者可以将恶意文件上传到已知位置,他们就会更容易利用它。相反,生成一个新的、唯一的(以防止破坏)、难以猜测的文件名,最好位于 Web 根目录之外的路径中,这样用户就无法直接使用 URL 访问它们。

其他事宜

你甚至还没有begun以解决以下问题。

验证

谁可以使用您的网络应用程序上传文件?您如何确保只有授权用户才能上传文件?

访问控制

用户是否可以看到其他用户上传的文件?根据文件内容,可能会存在重大隐私问题。

上传数量和速率

一名用户允许上传多少个文件?用户在固定时间内允许上传多少个文件?如果您不限制这些,即使您强制规定最大文件大小,一个用户也可能很快耗尽您的所有服务器资源。

危险文件类型

您将如何检查用户没有将危险内容(例如可执行的 PHP 代码)上传到您的服务器?仅仅检查文件扩展名或内容类型标头是不够的;攻击者已经找到了一些非常有创意的方法来规避此类检查。

“但是,但是,我只在公司内部网上运行这个......”

如果您的脚本无法从 Internet 访问,您可能会想忽略这些安全问题。但是,您仍然需要考虑

  • 办公室里的恶作剧者
  • 心怀不满的同事
  • 需要访问您的应用程序或不应访问您的应用程序的协作者和外部承包商
  • 经理们非常喜欢您的应用程序,以至于他们决定在您不知情的情况下(可能是在您调到另一个团队或离开公司之后)在互联网上向用户开放该应用程序

“我应该怎么办?”

废弃您现有的代码。仔细阅读我在第一段中列出的资源。他们又来了:

  • perlsec http://perldoc.perl.org/perlsec.html
  • the CERT Perl 安全编码标准 https://www.securecoding.cert.org/confluence/display/perl/CERT+Perl+Secure+Coding+Standard(特别是关于输入验证和数据 消毒 https://www.securecoding.cert.org/confluence/display/perl/01.+Input+Validation+and+Data+Sanitization)
  • OWASP's 无限制文件上传 https://www.owasp.org/index.php/Unrestricted_File_Upload
  • 信息安全的完整的文件上传漏洞 http://resources.infosecinstitute.com/file-upload-vulnerabilities/
  • CWE's 危险类型文件无限制上传 http://cwe.mitre.org/data/definitions/434.html
  • SANS 建议实现安全文件上传的 8 条基本规则 http://software-security.sans.org/blog/2009/12/28/8-basic-rules-to-implement-secure-file-uploads

仔细考虑一下,如果您really需要这样做。如果您只需要为用户提供存储文件的位置,请考虑使用 (S)FTP。这当然不会消除所有安全风险,但它会消除一个很大的风险:您的自定义 CGI 代码。

如果经过仔细考虑后您仍然认为这是必要的,请采取一些措施recentPerl 教程 http://perl-tutorial.org/#index3h1确保您可以使用并理解现代 Perl 编程约定。使用类似的框架代替 CGI.pmCatalyst http://www.catalystframework.org/, Dancer http://perldancer.org/, or 莫乔利西斯 http://mojolicio.us/,所有这些都有可以处理用户身份验证和会话等棘手领域的插件,因此您不必重新发明轮子(很糟糕)。

遵循上述资源中列出的所有安全准则,并考虑寻求网络安全专家的帮助。请小心行事:代码中的一个错误可能会让攻击者危及您的整个站点,甚至可能危及网络上的其他计算机。根据您的公司和用户所在的国家/地区,这甚至可能会产生法律后果。

肥皂盒>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

执行 CGI 脚本时出现软件错误 的相关文章

  • 如何在html5画布中向前和向后移动圆圈中的对象?

    我正在 html5 canvas 中开发一个小应用程序 我需要使用键盘按键以圆周运动移动对象 我可以使用键盘按键移动对象 但存在错误 该对象不会从同一位置向后或向前移动 任何人都可以帮助我完成此操作 请检查以下代码 任何形式的帮助将非常感激
  • 将 javascript 对象分配给 html 元素的最佳方法

    我通过 ajax 获取一个 javascript 对象 我需要将此对象附加到 div 以便稍后恢复 例如 在单击事件上 如果我有一个变量而不是一个对象 我会将它推入 html 标签 如下所示 div div 我会像这样恢复它的价值 var
  • 提交ajax表单并停留在同一页面不起作用

    我想将用户的评论存储在我的数据库中 当用户提交时 我不想将他们重定向到新页面 我有以下代码 但它不起作用 我的 HTML 代码
  • 在 Bootstrap 按钮下拉列表标题/占位符文本中显示所选项目

    这个问题已经在 Stackoverflow 上被问过几次了 但是我仍然无法弄清楚它的真相 而且我的查询正在抛出更多的下拉菜单 所以我有两个下拉菜单和一个搜索 我想从下拉列表和 选定 中进行选择以替换下拉占位符文本 但我还需要记住 点击搜索后
  • 如何在CSS中嵌套多个计数器?

    我想用 CSS 嵌套两个不同的编号 以获得如下所示的自动编号 1 第 1 节 1 1 小节1 1 2 小节1 2 第 2 节 2 1 小节2 2 2 小节2 这是我实现这一目标的尝试
  • Javascript显示/隐藏div onclick

    我有一个页面 其中包含三个 div 每个 div 是一个段落 我想使用 javascript 在用户从导航栏中按下每个 div 时仅在页面中显示这是导航栏 https i stack imgur com 1LnsS png WebDev 只
  • 标题的固定高度和更改宽度(HTML 表格)

    我需要确保表格标题的高度是固定的 并且宽度是根据标题单元格内容进行调整的 标题文本最多显示两行 我们如何使用样式来做到这一点 另外 我想确保表行的宽度与标题行的宽度相同 即标题行决定宽度 注 目前 交易部门负责人别名 是按行排列的 它需要分
  • 文本区域下的额外填充

    我的文本区域下面有额外的填充 但我似乎找不到它的来源 我已将单独的代码放在此页面上 http jsfiddle net wfuks http jsfiddle net wfuks 我似乎找不到它的来源 它有类 field field bac
  • 文本区域值高度[重复]

    这个问题在这里已经有答案了 我有一个 textarea 其 css 高度设置为 85px 用户可能会在该文本区域内键入内容行 我想知道文本 值的高度 而不是文本区域本身 有没有办法检查内部文本的高度 包括换行符 我会将文本区域的内容复制到另
  • 将 html 源拆分为多个文件

    HTML 是否支持将源代码拆分为多个文件 我正在寻找 C 的等价物 include 或者也许是类似 C 的东西partial 可以采用源路径并在该位置注入文件内容的元素 如果之前有人问过这个问题 我们深表歉意 Google 和 SO 搜索没
  • 使用 XPath 获取内部有链接的段落文本

    我正在使用 XPath 解析 HTML 页面 并希望获取某些特定段落的完整文本 包括链接文本 例如我有以下段落 p class main content This is sample paragraph with a href http g
  • 从 firebase 数据库获取最高分值

    在我的网站上有一些我从 firebase 获得的电影 电影的分数在0到100之间 我已经在我的网站上找到了所有电影 我还想按降序显示它们 例如评分最高的 5 部电影 我怎样才能实现这一点 感谢您的回答 const app initializ
  • 如何使用 jQuery 将各种元素包装在 div 标签中?

    我有一个 html 结构 如下所示 h5 Title h5 p Content p ul li Item li li Item li ul p Content p h5 Title h5 p Content p ul li Item li
  • 在java中将DataURL图像转换为图像文件

    我在我的 java servlet 中接收图像 DataURL 它看起来像 data image jpeg base64 9j 4AAQSkZJRgABAQAAAQABAA 我需要将其另存为图像文件 我该怎么做 The simplest w
  • 下拉菜单导致滚动条

    我用过这个W3C 的示例 http www w3schools com bootstrap bootstrap dropdowns asp div class dropdown div
  • 如何创建环境变量来保护我的网站的 Google 地图 API 密钥(或任何其他秘密值)?

    我正在学习使用 Bootstrap 编写自己的网站 并使用 Google 地图 API 密钥和 Google Developers 的脚本轻松地将地图放置在我的页面上 理想情况下 我会有类似的东西 即我已经尝试过这个 Html PHP
  • 适用于 HTML5 混合应用程序的 CORS

    我读过很多关于 CORS 的文章 以及允许 Access Control Allow Origin 如何成为 Web 服务器的安全漏洞 但没有一篇文章解释了如何允许 HTML5 混合应用程序访问某些不允许使用通配符 的域上托管的 Web 服
  • 使用js获取选择选项的onclick事件

    我有一个非常令人沮丧的问题 我有这个代码 它过滤掉我的结果并将它们输入到选择框中 var syn
  • CSS交付优化:如何推迟CSS加载?

    我在尝试着优化 CSS 交付遵循针对开发人员的谷歌文档https developers google com speed docs insights OptimizeCSSDelivery example https developers
  • HTML标题属性样式[重复]

    这个问题在这里已经有答案了 如何在不使用 javascript 或 CSS 的情况下更改以下标记中标题属性的样式 因为我将 HTML 插入到原本无法编辑的文档中的特定位置 span title This is information Thi

随机推荐

  • 解压文件跳过文件夹

    我正在创建一个 php 文件 该文件将从 BitBucket Git 存储库 中拉出后更新我的网站 它下载整个主文件或提交的 zip 文件 然后将其解压缩到网站的文件夹中 我遇到的问题是有一个随机命名的文件夹 其中包含 zip 文件中的所有
  • 解决方案的 NuGet 包还原失败(仅在命令行上)

    我最近切换到 NuGet 最新推荐的方法 该方法为项目使用 packages json 文件 dependencies Newtonsoft Json 9 0 1 RestSharpSigned 105 2 3 frameworks net
  • IE 中的 SVG 动画笔划-dashoffset - 笔划宽度为 0

    我正在尝试使用 SVG 制作圆形填充动画 它在 Chrome FF Safari 中工作得很好 但在 IE 中动画不会发生 我正在使用 jQuery animate 不是 css 动画 IE 11 及以下版本不支持 SVG 简化的动画代码
  • 当应用程序进入后台时如何继续运行 NSTimer

    我正在创建益智游戏应用程序 并使用 NSTimer 显示时间 即 01 20 当应用程序进入后台时 NSTimer 会暂停 但即使应用程序处于后台状态 我也想继续它 例如当应用程序进入后台时 计时器计数为 15 秒 and I 放置5秒现在
  • 如何在Python中格式化浮点数? [复制]

    这个问题在这里已经有答案了 我想将浮点数格式化为小数点后两位 gt gt gt x 5 0 gt gt gt y float 0 2f format x gt gt gt y 5 0 我希望我的输出采用这种格式 5 00 对于较新版本的 p
  • 什么时候*不*使用准备好的语句?

    我正在重新设计一个使用最小数据库的 PHP 驱动的网站 原始版本使用 伪准备语句 进行引用和参数替换的 PHP 函数 来防止注入攻击并将数据库逻辑与页面逻辑分开 用使用 PDO 和真正准备好的语句的对象替换这些临时函数似乎很自然 但在阅读它
  • Android Beep 或 Light 没有通知对象?

    有没有办法在没有通知实例的情况下启动蜂鸣声 是的 蜂鸣声 或打开设备的灯 有了通知就很简单 如下所示 http developer android com guide topics ui notifiers notifications ht
  • Ruby 1.9 与 Rails 2.3 兼容吗?

    ruby 1 9 可以与rails 2 3 一起使用吗 我知道 Rails 2 3 5 可以与 ruby 1 9 1 一起运行 但是 您需要仔细检查要与 ruby 1 9 一起使用的任何 gem 或插件 看看它们是否有效
  • keras 中一维卷积网络的输入维度

    确实很难理解卷积 1d 的输入维度layer http keras io layers convolutional convolution1d在喀拉斯 输入形状 具有形状的 3D 张量 样本 步长 input dim 输出形状 形状为 sa
  • Woocommerce 更新结帐 ajax

    由于我对 1 个产品使用 onepager 因此当我将产品添加到购物车时 我想利用 wordpress ajax 来更新现场结账 产品添加到购物车按钮已经是ajax了 我已经尝试过 body trigger update checkout
  • 在 R 中使用 ggplot 绘制谷歌地图

    我正在尝试绘制使用 RgoogleMaps 包查询并将其与 ggplot 结合起来 最后 我想显示使用的总人口geom point 有点类似于下图 但由于过度绘制 我试图将注意力集中在蒙哥马利地区 我很沮丧 因为我无法在 R 中绘制查询的地
  • 如何在SQL Server 2008中部署CLR功能

    我在 VS2008 中创建了一个名为 RegularExpression 的 SQL Server 项目 在该项目中 我创建了一个 Regex cs 类 并编写了一个有关正则表达式的函数 然后我构建解决方案 现在我的问题是通过脚本在SQL
  • 为什么 expat 拒绝短划线字符作为无效字符?

    在我的 XML 输入文件中 有以下行
  • 在 x86 汇编中,ESP 是否在调用后递减两次,然后在数据保存到堆栈之前压入?

    长话短说 我正在学习 Singh 和 Triebel 写的一本名为 8088 和 8086 微处理器 的书 以学习old那些特定CPU的汇编 现在 我练习的计算机是我最近组装的主计算机 因此寄存器更大 也就是说 这本书 我发现这非常有帮助
  • Jest 无法使用 fs/promises 打字稿

    我正在尝试将 jest 添加到我的打字稿项目中进行测试 但是当我运行 jest 时 它一直给我错误 Test suite failed to run Cannot find module fs promises from src path
  • 我们可以从 Azure AD B2C 中的“配置文件编辑策略”更改用户的电子邮件地址吗?

    我正在开发一个使用 Azure B2C 身份验证的项目 我们必须登录 注册 更改用户电子邮件地址和密码 我在个人资料属性中没有看到电子邮件地址字段个人资料编辑政策 我们可以从 Azure AD B2C 中的 配置文件编辑策略 更改用户的电子
  • Rails 中 url 助手的文档在哪里?

    我如何知道 Rails 中 url 助手接受哪些参数 例如 我如何知道 url helper 仅采用下面的一个参数 我知道这些方法是元编程的 但它们的文档在哪里 link to New Ticket new project ticket p
  • 有没有办法为 Visual Studio 设置默认浏览器以用于调试,该浏览器与我的系统默认浏览器不同?

    有没有办法为 Visual Studio 设置默认浏览器以用于调试 该浏览器与我的系统默认浏览器不同 我使用 Visual Studio 2010 我的系统默认浏览器是 chrome 但我希望 VS 使用 Firefox 右键单击解决方案资
  • 如何在 Nightwatch 中进行调试

    我正在尝试在 Nightwatch 中进行调试 当我放入 console log 时 它会在测试运行之前打印 同时它会进行某种测试的构建 编译 我还尝试了 Visual Studio 代码调试器和同样的事情 在测试实际运行之前断点命中 感谢
  • 执行 CGI 脚本时出现软件错误

    我有一个用于上传的cgi脚本如下 usr bin perl use CGI use CGI Carp qw fatalsToBrowser my cgi new CGI my file cgi gt param file file m st