我应该寻找什么Javascript/jQuery事件来检测Javascript/jQuery以编程方式填充的表单字段?
如果这是我表格上的电子邮件输入字段:我应该寻找什么Javascript/jQuery事件来检测Javascript/jQuery以编程方式填充的表单字段?,javascript,jquery,Javascript,Jquery,如果这是我表格上的电子邮件输入字段: <input autofocus="" class="emailinput form-control" id="id_email" maxlength="254" name="email" required="" type="email"> 那就这样做吧 $('#id_email').val(
<input autofocus="" class="emailinput form-control" id="id_email"
maxlength="254" name="email" required="" type="email">
那就这样做吧
$('#id_email').val('" onMouseOver="alert(1);')
果然,文本“onMouseOver=”alert(1)代码>插入时未被检测到
我应该寻找什么事件来检测表单字段是否由于以编程方式插入而发生更改(例如通过Javascript/jQuery)
编辑
我的用例是什么?
我试图提供一个简单的防御跨站点脚本(反射)攻击的第一道防线,防止机器人程序/工具以编程方式将已知漏洞提交到表单中
机器人/工具将尝试在未被发现的情况下执行此操作。这就是为什么我想知道是否有一种方法可以检测一个字段是否因javascript而改变。据我所知,没有一种本机方法可以检测输入上的编程更改,事件必须从修改输入值的代码中手动发出
要以编程方式强制事件发射,请使用jQuery的trigger
函数,如中所示:
$('id_email').val('onMouseOver=“alert(1);');
$('id#u email')。触发器('input');
您可以触发任何事件并执行附加的处理程序
对于检测编程更改,您可以看到这样的答案:,尽管它有中断输入交互的副作用,我建议不要这样做,因为它修改了DOM元素
您可以采取的另一种方法是以检测更改的间隔“轮询”输入值,但这在性能方面给我增加了太多的负担
但是我不确定您的用例是什么。input
事件应该可以在每次直接输入更改时工作,但是运行jquery.val
更改不会触发input
更改事件
您可以使用.trigger('input')
在输入时手动触发值更改事件
$(“#id_email”)。关于('input',函数(e){
console.clear();
console.log('Email字段值已更改!-'+e.target.value);
})
$(“#id_email”).val('test@test.com)。触发器('输入')代码>
我想我可能已经找到了从中解析的解决方案。它似乎阻止我用Javascript/jQuery($('id_email').val('onMouseOver=“alert(1);'))
填充表单字段
不过,我不知道这意味着什么
Object.defineProperty(document.querySelector("#id_email"), "value", {
set: function (text) {
return this.defaultValue = "";
}
});
或者完全删除返回
?您需要手动触发事件。它应该会自动检测。@anandshukla但jquery值更改不会触发输入事件。您需要触发事件以捕获值。是的,但问题仅限于此。它应该自动检测。我们不知道它是如何变化的,它应该会自动检测。@anandshukla我明白你的意思,我已经详细阐述了我的答案。谢谢你的回答。我用我的用例编辑了我的问题。当我在我的问题中执行$('#id_email').val(''onMouseOver=“alert(1);'))
时,我在模拟恶意用户可能会做什么来测试已知漏洞并提交表单。恶意参与者不会尝试触发输入事件,因为他们希望避免被检测到。您检查了吗?@Swati我遇到了这个关于无法观察值属性的更改的问题(如果我说得对的话)。我用我的用例更新了我的问题。谢谢你的想法。我的用例是检测使用Javascript/jQuery的机器人,甚至是真正的用户,并手动或自动将数据输入表单,然后提交它们以查找漏洞。在这两种情况下,攻击者都不会手动触发事件,因为他们希望不被发现。我想知道如何检测这一点。
Object.defineProperty(document.querySelector("#id_email"), "value", {
set: function (text) {
return this.defaultValue = "";
}
});