- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在互联网上发现的另一个 JavaScript 问题,但我无法弄清楚它是如何工作的。这个问题主要是问密码是什么。密码不依赖于外部资源,并且不会随时间变化(不依赖于当前日期或时间)。另外,问题表明只有一个正确的密码。我是 JavaScript 初学者,所以如果这是一个简单的标准面试问题,我深表歉意。这是函数:
const checkPassword = a => {
if(a !== (a += '')) return false;
if(a !== (a = a.replace(/[^a-z]/g, ''))) return false;
a = (a.match(/^.{6}|.+/g) || []).join(({} + {})[7]);
a = [...a].reverse().join([] + []);
try{
Function('\'' + a + '\';++1..a')();
return false;
}catch(a){
return true;
}
};
alert(checkPassword(prompt('Enter password:')) ? 'Correct password.' : 'Wrong. Try again.');
起初,这对我来说并不难,因为一切都是开放的,所以我可以简单地逐行跟踪代码并弄清楚它是如何工作的。好的,我知道在检查函数的第一行中,他们检查密码是否是一个字符串(为什么?可以是其他东西吗?)。然后,如果我很好地理解了正则表达式,他们会检查脚本是否仅由小字母组成(或者我错了?)。所以,现在我知道我知道它一定只由字母组成。之后他们执行一些我无法完全理解的奇怪的正则表达式。在我看来,这个正则表达式将匹配整个字符串,那么为什么他们要加入它呢?
然后它们反转字符串并通过一个空数组连接(与通常反转字符串相同还是什么?)。之后在 try block 中我无法理解发生了什么? Function
构造函数在这里实际上做了什么? ++1..a
是什么意思?我只是想知道如何解决这样的问题?
最佳答案
我会直接跳到关键行:
Function('\'' + a + '\';++1..a')();
它创建并立即执行一个新函数,其函数体是从那个看起来很奇怪的字符串中设置的。如果变量 a
比如说,'abcde'
那么新函数的主体将是:
'\'' + 'abcde' + '\';++1..a'
这就像拥有这个功能:
function() {
'abcde';++1..a
}
或者加一些空格:
function() {
'abcde';
++1..a
}
请注意,第一行的字符串是根据 a
中的内容动态设置的。变量,但是 ++1..a
部分是硬编码的。
现在,请注意该函数位于 try/catch()
内 block ,如果新函数运行没有错误则 checkPassword()
将返回false
,但是如果新函数崩溃了checkPassword()
返回true
。换句话说,预计该动态函数的行为将更改为崩溃或不崩溃,具体取决于 a
中的字符串中的内容。变量。
那么函数第一行的什么字符串本身可能会改变函数的行为?只有一种可能性,那就是(将鼠标悬停以显示剧透):
'use strict'
...必须输入密码'tcirtsesu'
因为函数的前几行执行.match()
和.reverse()
.考虑到这一点,
++1..a
是什么并不重要。部分确实如此,但它基本上采用.a
1
的属性(property),即undefined
,并尝试增加它,这......在严格模式下会出错,但在非严格模式下不会出错。
为了完整起见,对这些行进行非常简短的解释:
a = (a.match(/^.{6}|.+/g) || []).join(({} + {})[7]);
a = [...a].reverse().join([] + []);
.match()
函数返回一个数组。/^.{6}|.+/g
匹配前六个字符,或任意数量的字符,这意味着"abcdefghijkl".match(/^.{6}|.+/g)
返回["abcdef", "ghijkl"]
。然后({} + {})[7]
基本上只是一个空格字符,因为{} + {}
是字符串"[object Object][object Object]"
。因此该行基本上在第六个字符后插入一个空格。
.reverse()
然后行反转结果。
关于JavaScript:猜测密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41031296/
我的问题在于处理大型 CSV 文件中的数据。 我正在寻找基于在该列中找到的值来确定(即猜测)该列的数据类型的最有效方法。我可能正在处理非常困惑的数据。因此,该算法应该具有一定的容错性。 这是一个例子:
我正在开发一个基于 map 的网络应用程序,我想为用户提供“使用当前位置”的功能 我可以轻松检查地理位置 api 的可用性,如下所示: if (navigator && navigator.geolo
我有一大组日期时间字符串,可以放心地假设它们的格式都相同。例如,我可能有一组日期“7/1/13 0:45”、“5/2/13 6:21”、“7/15/13 1:24”、“7/9/13 12” :41",
我正在尝试对是否可以接收 C2DM 消息进行最佳猜测。 我创建了一个应用程序,它依赖于在物理上无法访问时将信息推送到手机。我知道 C2DM 不能保证传递,但我至少想知道何时可以传递消息;如果不是,我们
我正在编写一个系统,以便用户可以编辑他发布的内容。简化它是一个存储在数据库中的文本区域/输入字段和一个检索它的页面。问题是,我认为编码不正确,因为字符串存储在数据库中,如“É”或其他东西(phpmya
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
只是好奇,但匹配 Guid 的概率是多少? 从 SQL 服务器说一个 Guid:5AC7E650-CFC3-4534-803C-E7E5BBE29B3D 它是阶乘吗?:(36 * 32)! = (11
这个问题已经有答案了: Guessing algorithm does not seem to work, guessing number by Python (3 个回答) 已关闭 5 年前。 程序
我正在创建一个非常简单的计算器,但我需要它在每次击键时进行更新。我似乎找不到该特定类别中的任何内容。有人能指出我正确的方向吗? 我正在寻找类似 A*1.325 + B*3.76 的内容,其中 B 是下
环顾四周this似乎是最接近我的问题的答案。然而它会导致其他问题...... 这是我的情况: $element.insertBefore($container); 此行有一个警告,指出 insertB
当我收到此页面时 http://booking.airasia.com/css/AKBase/Cultures/en-GB/far-min.css与 Node 的 http , toString方法给
我在代码中发现了这一点,但不知道哪个实例接收到。 var guess = require ('myModule1') ('myMmodule2') 最佳答案 看来 myModule1 导出了一个函数,
WARNING: No name was provided for external module 'moment' in output.globals – guessing 'momentImpor
我是一名优秀的程序员,十分优秀!