gpt4 book ai didi

php - 在查询数据库或数据库处理之前检查输入的长度(太大)是否值得?

转载 作者:搜寻专家 更新时间:2023-10-30 23:47:39 24 4
gpt4 key购买 nike

我有一个动态 PHP 网络应用程序,它在 url 中获取输入参数(这并不奇怪)。但是,bingbot 有时会从站点请求非常长的 URL。例如。 > 10000 个字符长的网址。其中一个输入是一个 UTF 名称,bingbot 以某种方式提交了粗略的输入名称,数千个字符,如下所示:\xc2\x83\xc3\x86...(持续数千个字符)。

显然,它得到一个 404,因为数据库中没有这样的名称(因此没有这样的页面),但我想到在查询数据库之前检查输入长度是否值得(例如,一个名称不能超过 100 个字符),如果太长则立即返回 404。这是标准做法吗?或者它不值得麻烦,因为数据库会处理它?<​​/p>

我正在考虑不要给数据库增加不必要的负载。这个长输入是由 db 客户端接口(interface)按原样提交的(两次调用:首先是准备清理输入,然后是实际查询)还是 php db 客户端知道列大小并在将其发送到线路之前截断输入字符串?

最佳答案

不仅您要求的不仅仅是合法的,而且我认为这是您应该作为输入过滤/验证的一部分做的事情。如果您希望您的输入始终少于 100 个字符,则应该过滤掉所有更长的字符。
此外,您似乎正在获得 UTF-8 字符串:如果您不期望它们,您可以简单地过滤掉所有不属于标准 ASCII 集的字符(甚至减少,过滤掉所有控制字符。例如$string = filter_var($input, FILTER_SANITIZE_FULL_SPECIAL_CHARS, FILTER_FLAG_STRIP_LOW)

这不仅仅是数据库性能的问题,也是安全问题!

PS:我几乎不怀疑 bot 实际上是 Bing。看起来像是一个试图破解您网站的机器人。

附录:关于输入验证的一些建议

正如我在上面的一些评论中所写(以及其他人所写),您应该始终验证每个输入。无论它是什么或来自哪里:如果它来自外部,就必须对其进行验证。

总体思路是根据您的预期验证您的输入。使用 $input 任何输入变量(任何来自 $_GET$_POST$_COOKIE、来自外部 API 和来自许多 $_SERVER 变量 - 加上用户可以更改的任何其他内容,请根据您的判断并谨慎行事)。

如果您请求整数或 float ,那么很简单:只需将输入转换为 (int) 或 (float)

$filtered = (int)$input;
$filtered = (float)$input;

如果你请求的是字符串,那就更复杂了。您应该考虑您请求的字符串类型,并相应地对其进行过滤。例如:

  • 如果您需要一个类似于十六进制 ID 的字符串(就像某些数据库使用的那样),则过滤 0-9A-Fa-f 范围之外的所有字符:$filtered = preg_replace('/[^0- 9A-Fa-f]/', '', $input);
  • 如果您需要字母数字 ID,请对其进行过滤,删除所有不属于该 ASCII 范围的字符。您可以使用上面发布的代码:$string = filter_var($input, FILTER_SANITIZE_FULL_SPECIAL_CHARS, FILTER_FLAG_STRIP_LOW);。这个也删除了所有控制字符。
  • 如果您希望输入的是 Unicode UTF-8,请验证它。例如,查看此函数:https://stackoverflow.com/a/1523574/192024

除此之外:

  • 始终对 HTML 标记进行编码。 FILTER_SANITIZE_FULL_SPECIAL_CHARS 也会在 filter_var 上执行此操作。如果不这样做,您将面临 XSS(跨站点脚本)攻击的风险。
  • 如果您想删除控制字符并对 HTML 实体进行编码但不删除换行符(\n 和\r),那么您可以使用:$filtered = preg_replace('/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F]/u', '', htmlspecialchars($input, ENT_COMPAT, 'UTF-8'));

还有更多。始终运用您的判断力。

PS:我的输入过滤方法是更喜欢清理。也就是说,删除所有“危险”的内容并接受经过净化的输入,就好像那是用户写的一样。相反,其他人会争辩说输入应该只被接受或拒绝。
就个人而言,我更喜欢 Web 应用程序的“清理和使用”方法,因为您的用户可能仍然希望看到的不仅仅是错误网页;在桌面/移动应用程序上,我改为使用“接受或拒绝”方法。
然而,这只是个人喜好问题,只有我的直觉告诉我关于用户体验的支持。您可以自由选择自己喜欢的方法。

关于php - 在查询数据库或数据库处理之前检查输入的长度(太大)是否值得?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26286817/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com