Javascript 在启用WAF的Amazon ALB中承载的webapp上阻止AJAX Post请求-以防表单数据包含空格字符
我的应用程序托管在ALB中,并且启用了waf,在所有ajax请求中得到403,该请求有“anything space on*”一词。例如,如果我有一个输入为“testone”的textfield,当相同的数据传递到ajax数据时,就会出现403错误。当我使用stringify相同的数据时,错误不会出现Javascript 在启用WAF的Amazon ALB中承载的webapp上阻止AJAX Post请求-以防表单数据包含空格字符,javascript,jquery,ajax,amazon-waf,amazon-alb,Javascript,Jquery,Ajax,Amazon Waf,Amazon Alb,我的应用程序托管在ALB中,并且启用了waf,在所有ajax请求中得到403,该请求有“anything space on*”一词。例如,如果我有一个输入为“testone”的textfield,当相同的数据传递到ajax数据时,就会出现403错误。当我使用stringify相同的数据时,错误不会出现 var value = "test one"; //inputFieldText $ajax({"url":"url",data:val
var value = "test one"; //inputFieldText
$ajax({"url":"url",data:value}) // data from input field, if having space on* failed.
$ajax({"url":"url",data:JSON.stringify(value)}) // if same data is stringified then working fine.
如果stringify是唯一的方法,那么我的应用程序中有1000个ajax请求,有什么解决方法或建议吗?请注意。您只需覆盖jQuery$ajax并应用
JSON.stringify()
即可:
const originalAjax = $.ajax;
$.ajax = (...args) => {
// play with data before calling ajax
return originalAjax(...args);
};
或者,您可以扩展$ajax函数,并在扩展版本中应用您自己的逻辑:
(function(root, factory) {
if (typeof define == 'function' && define.amd) {
define(['jquery'], function(jQuery) {
factory(jQuery);
});
} else {
factory(root.jQuery);
}
})(this, function(jQuery) {
var ajax = jQuery.ajax,
function extendedAjax(options) {
var promise = $.Deferred();
var success = options.success;
var error = options.error;
var complete = options.complete;
var params, that = this;
params = {
complete: function(xhr, status) {
if (complete) complete.apply(that, arguments);
},
success: function() {
if (success) success.apply(that, arguments);
promise.resolveWith(this, arguments);
},
error: function() {
if (error) error.apply(this, arguments);
promise.rejectWith(this, arguments);
}
};
ajax(jQuery.extend({}, options, params));
return promise;
};
jQuery.ajax = function(options) {
return extendedAjax(options);
};
});
这将有助于一劳永逸地实现任何自定义逻辑。您只需覆盖jQuery$ajax并在那里应用
JSON.stringify()
:
const originalAjax = $.ajax;
$.ajax = (...args) => {
// play with data before calling ajax
return originalAjax(...args);
};
或者,您可以扩展$ajax函数,并在扩展版本中应用您自己的逻辑:
(function(root, factory) {
if (typeof define == 'function' && define.amd) {
define(['jquery'], function(jQuery) {
factory(jQuery);
});
} else {
factory(root.jQuery);
}
})(this, function(jQuery) {
var ajax = jQuery.ajax,
function extendedAjax(options) {
var promise = $.Deferred();
var success = options.success;
var error = options.error;
var complete = options.complete;
var params, that = this;
params = {
complete: function(xhr, status) {
if (complete) complete.apply(that, arguments);
},
success: function() {
if (success) success.apply(that, arguments);
promise.resolveWith(this, arguments);
},
error: function() {
if (error) error.apply(this, arguments);
promise.rejectWith(this, arguments);
}
};
ajax(jQuery.extend({}, options, params));
return promise;
};
jQuery.ajax = function(options) {
return extendedAjax(options);
};
});
这将有助于一劳永逸地实现任何自定义逻辑。您可以查看ALB WAF中是否有一些日志或诊断,以了解触发此操作的原因?403响应意味着您无法访问所请求的资源。通常这意味着您需要向发送的请求中添加身份验证头,以验证您是谁,并且您有权获得响应。检查文档中您正在使用的端点calling@RoryMcCrossan,我正在使用会话授权用户,我无法在每次请求中添加用户名和密码。你能告诉我,在授权标题中我可以用什么来代替用户名和密码吗,因为这完全取决于系统的设置方式。当然,您可以查看ALB WAF中的一些日志或诊断,看看是什么触发了这种情况?403响应意味着您无法访问所请求的资源。通常这意味着您需要向发送的请求中添加身份验证头,以验证您是谁,并且您有权获得响应。检查文档中您正在使用的端点calling@RoryMcCrossan,我正在使用会话授权用户,我无法在每次请求中添加用户名和密码。你能告诉我,我可以在授权标题中使用什么来代替用户名和密码吗?不完全是这样,因为这完全取决于你的系统是如何设置的。