1

我正在构建一个简单的 HTML 页面,我有一个输入字段,后跟一个搜索按钮;这是代码:

<input type="text" id="sfield" placeholder="Write something">
<button id="search">Search!</button>

我目前正在编写 javascript 来为按钮和输入字段分配一些操作,当时我认为添加一个需要光标位于字段上才能开始搜索的功能是个好主意。我会更好地解释它:如果有人想搜索某些东西,它将看起来就像一个普通的输入字段并像那样工作。但是,如果有人试图启动一个脚本来自动提交表单,它就会像没有插入任何输入一样。

例如,如果有人尝试注入此脚本:

document.getElementById('sfield').value="Some stuff";
document.getElementById('search').click();

搜索将开始,但不会保存“一些东西”字符串,就好像用户单击搜索按钮而不在搜索字段中写入一样。此外,添加行

    document.getElementById('sfield').focus();

也不应该做任何事情,因此将光标放在字段中的唯一方法是用户手动操作。

我想知道是否有可能制作这样的东西;我已经设法使用 EventListener 将搜索字段设为空白,但我不知道如何让脚本辨别用户是否将光标放在该字段上。

我宁愿不使用 JQuery,但也可以。任何想法都会被极大地接受。谢谢。

4

2 回答 2

0

在这种情况下,程序需要保留状态。我会这样做...

http://jsbin.com/hopicucuyi/edit?js,控制台,输出

<input type="text" id="sfield" placeholder="Write something" data-validated = "false">
<button id="search">Search!</button>

<script>
   const inputField = document.getElementById('sfield');
const searchButton = document.getElementById('search');

inputField.onfocus = () => {
    inputField.setAttribute("data-validated", "true") 
}
searchButton.onclick = () => {
    const isValidated = inputField.getAttribute("data-validated");
    console.log('Is Validated: ' + isValidated);
}
</script>
于 2017-01-11T16:00:37.387 回答
0

通常,这些解决方案都不会阻止使用浏览器的机器人(这是一个运行 javascript 的机器人)。没有 100% 的解决方案,但有比检查某事是否有焦点更强大的解决方案。请记住,javascript 环境是完全可以从浏览器方面控制的。例如,要通过您的安全性,我所要做的就是将相关输入的状态更改为data-validated="true",这样您的安全性就会崩溃。

但是,浏览器供应商已经考虑到了这种可能性,并为您提供了一个鲜为人知的解决方案。查看来自鼠标单击或击键的事件数据。可以生成该事件数据。过去在旧浏览器中使用new Event()来欺骗事件更容易,但现在现代浏览器使用键盘和鼠标的特定事件。使这些欺骗变得非常困难的部分是,如果有一些属性是只读的。更具体地说,有一个名为“trusted”的事件属性不能由 javascript 设置。如果您欺骗MouseEventKeyboardEvent,“trusted”属性设置为 false,但如果您使用实际的鼠标或键盘,“trusted”属性设置为 true。

此处有关 isTrusted 属性的信息:https ://developer.mozilla.org/en-US/docs/Web/API/Event/isTrusted

注意:这也不是 100%,因为机器人可以运行创建真正“可信”事件的键盘/鼠标宏。然而,它确实使系统更难破解,因为许多人不知道这个安全技巧,而且大多数机器人不会内置鼠标/键盘控制。如果你遇到使用鼠标/键盘的机器人,你已经减少了可以进行安全竞争,并对事件和界面使用进行进一步分析。

如果您将此方法与浏览器指纹识别等其他方法结合使用,它会使您的整体反机器人安全性更加强大,并阻止更多可能的机器人。

编辑:不要只使用这种方法和其他方法,混淆你的代码,这样任何攻击者都必须花时间去混淆并遍历一堆标记不佳的函数和加密字符串,如果他们想看看你的安全性是如何工作的。

于 2020-02-11T09:53:03.260 回答