如何避免“超出 GET/POST 参数数量”错误?

Posted

技术标签:

【中文标题】如何避免“超出 GET/POST 参数数量”错误?【英文标题】:How to avoid "The number of GET/POST parameters exceeded" error? 【发布时间】:2017-11-28 10:41:58 【问题描述】:

我在我的 Django 网站上创建了一个自定义管理页面,其中只允许管理员并且能够更改对象及其属性。 对象的数量很多(确切地说是 9220 个),并且在管理页面上,输入字段的数量与该模型中的对象数量相同。

这是代码:

<form action="% url 'Home:AdminPrices' %" id="mainForm" method="post">
% csrf_token %
% for item in prices %
    <ul class="row" style="width: 100%;padding: 0;background-color: white;height: 100px;display: flex;justify-content: left;white-space: nowrap;margin-bottom: 0;margin-top: 0;">
        <div style="width: 33.333333333333336%;background-color: white;display:  block;color: black;font-size: 0.8em;white-space: nowrap;text-align: center;font-family: 'Lato';padding-top: 25px;"> item.hashname </div>
        <div style="width: 33.333333333333336%;background-color: white;display:  block;color: black;font-size: 1.2em;text-align: center;font-family: 'Lato';padding-top: 25px;"> item.sug </div>
        <div style="width: 33.333333333333336%;background-color: white;display:  block;color: black;font-size: 1.2em;text-align: center;font-family: 'Lato';"><input type="number" value=" item.actual " name="prices_ item.actual " style="width: 100%;height: 100%;padding-bottom: 25px;background-color: white;border: 0;color: black;font-size: 1.2em;text-align: center;font-family: 'Lato';"></input></div>
    </ul>
% endfor %
    <input type="submit" id="mainSubmit" style="display: none;" name="submitPrices"></input>
</form>
<div onclick="document.getElementById('mainForm').submit();" style="background-color: black;border-radius: 5px;position: fixed;display: block;height: 50px;width: 200px;bottom: 0;left:0;right:0;margin: 0 auto;color: white;font-size: 1.5em;text-align: center;padding-top: 12.5px;cursor: pointer;">Submit</div>

一旦按下提交按钮,网站崩溃并提示此错误:

2017-06-25 10:05:53,158:超过 GET/POST 参数的数量 设置.DATA_UPLOAD_MAX_NUMBER_FIELDS。 2017-06-25 10:05:53,860:错误 运行 WSGI 应用程序 2017-06-25 10:05:53,934: TooManyFieldsSent: 超过 GET/POST 参数的数量 设置.DATA_UPLOAD_MAX_NUMBER_FIELDS。 2017-06-25 10:05:53,934: 文件 “/home/MTonskins/Tonskins/Selement/senv/local/lib/python2.7/site-packages/django/core/handlers/wsgi.py”, 第 170 行,在 call 2017-06-25 10:05:53,935 中:响应 = self.get_response(request) 2017-06-25 10:05:53,935: 2017-06-25 10:05:53,935:文件 “/home/MTonskins/Tonskins/Selement/senv/local/lib/python2.7/site-packages/django/core/handlers/base.py”, 第 124 行,在 get_response 2017-06-25 10:05:53,935 中:响应 = self._middleware_chain(request) 2017-06-25 10:05:53,936: 2017-06-25 10:05:53,936:文件 “/home/MTonskins/Tonskins/Selement/senv/local/lib/python2.7/site-packages/django/core/handlers/exception.py”, 第 41 行,内部 2017-06-25 10:05:53,936:响应 = response_for_exception(request, exc) 2017-06-25 10:05:53,936: 2017-06-25 10:05:53,936: 文件 “/home/MTonskins/Tonskins/Selement/senv/local/lib/python2.7/site-packages/django/core/handlers/exception.py”, 第 76 行,在 response_for_exception 2017-06-25 10:05:53,937: response = debug.technical_500_response(request, *sys.exc_info(), status_code=400) 2017-06-25 10:05:53,937: 2017-06-25 10:05:53,937: 文件 "/home/MTonskins/Tonskins/Selement/senv/local/lib/python2.7/site-packages/django/views/debug.py", 第 84 行,在 Technical_500_response 2017-06-25 10:05:53,937: html = 记者.get_traceback_html() 2017-06-25 10:05:53,937: 2017-06-25 10:05:53,937:文件 "/home/MTonskins/Tonskins/Selement/senv/local/lib/python2.7/site-packages/django/views/debug.py", 第 316 行,在 get_traceback_html 2017-06-25 10:05:53,938: c = 上下文(self.get_traceback_data(),use_l10n=False)2017-06-25 10:05:53,938: 2017-06-25 10:05:53,938: 文件 "/home/MTonskins/Tonskins/Selement/senv/local/lib/python2.7/site-packages/django/views/debug.py", 第 293 行,在 get_traceback_data 2017-06-25 10:05:53,938: 'filtered_POST': self.filter.get_post_parameters(self.request), 2017-06-25 10:05:53,938: 2017-06-25 10:05:53,938: 文件 "/home/MTonskins/Tonskins/Selement/senv/local/lib/python2.7/site-packages/django/views/debug.py", 第 167 行,在 get_post_parameters 2017-06-25 10:05:53,938 中:返回 request.POST 2017-06-25 10:05:53,938: 2017-06-25 10:05:53,939: 文件 “/home/MTonskins/Tonskins/Selement/senv/local/lib/python2.7/site-packages/django/core/handlers/wsgi.py”, 第 128 行,在 _get_post 2017-06-25 10:05:53,939: self._load_post_and_files() 2017-06-25 10:05:53,939: 2017-06-25 10:05:53,939:文件 "/home/MTonskins/Tonskins/Selement/senv/local/lib/python2.7/site-packages/django/http/request.py", 第 311 行,在 _load_post_and_files 2017-06-25 10:05:53,939: self._post, self._files = QueryDict(self.body, encoding=self._encoding), MultiValueDict() 2017-06-25 10:05:53,939: 2017-06-25 10:05:53,940:文件 "/home/MTonskins/Tonskins/Selement/senv/local/lib/python2.7/site-packages/django/http/request.py", 第 397 行,在 init 2017-06-25 10:05:53,940 中:对于键,值 limited_pa​​rse_qsl(query_string,**parse_qsl_kwargs):2017-06-25 10:05:53,940: 2017-06-25 10:05:53,940: 文件 "/home/MTonskins/Tonskins/Selement/senv/local/lib/python2.7/site-packages/django/utils/http.py", 第 350 行,在 limited_pa​​rse_qsl 2017-06-25 10:05:53,940 中:' 超过 GET/POST 参数的数量

我不太确定如何避免它,我可以更改设置并专门为此视图设置不同的限制吗?或者我可以将所有这些字段作为一个列表提交吗?如果没有,那有什么解决办法?我可以为某个视图指定DATA_UPLOAD_MAX_NUMBER_FIELDS 设置吗?提前致谢。

【问题讨论】:

有多少商品的价格??你也可以发布完整的回溯吗? @FazilZaid 模型价格中正好有 9220 个对象。我将立即使用完整的回溯更新答案。 @FazilZaid 更新了代码,我知道DATA_UPLOAD_MAX_NUMBER_FIELDS 选项可能会解决问题,但我可以只指定特定视图的选项吗? 【参考方案1】:

在 settings.py 中只增加 "DATA_UPLOAD_MAX_NUMBER_FIELDS" 值或禁用对该值的检查,默认值为 1000:

例如

# to increase value
DATA_UPLOAD_MAX_NUMBER_FIELDS = 102400

# to disabled check 
DATA_UPLOAD_MAX_NUMBER_FIELDS = None

查看以下网址上的 Django 文档: https://docs.djangoproject.com/en/3.2/ref/settings/#data-upload-max-number-fields

我希望这会有所帮助。

【讨论】:

【参考方案2】:

Django 的文档指出,不应在设置以外的任何地方更改设置:

https://docs.djangoproject.com/en/1.11/topics/settings/#altering-settings-at-runtime

正如您提到的,解决方案是在设置中增加DATA_UPLOAD_MAX_NUMBER_FIELDS 的大小。祝你好运!

【讨论】:

您好,感谢您的回答。还有一个问题,当攻击者发送大量 POST/GET 请求时,这不会增加服务器过载的风险吗?因为我网站的大部分视图都接受 POST 请求,而且具体来说,这个视图只能由管理员访问。 可能,但还有其他级别的保护,例如 CSRF。我不会像它们的内容那样担心单个字段的数量!

以上是关于如何避免“超出 GET/POST 参数数量”错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何避免 bash 脚本上的 sed 错误?

如何更改代码以避免运行时错误(AddressSanitizer)?

如何避免嵌套事务不支持错误?

在 JavaScript [重复] 中引用未定义变量时如何避免错误

如何避免从 ExpressJS 抛出 400 错误

如何解决vue中避免冗余导航到当前位置错误?