- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个动态 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;
如果你请求的是字符串,那就更复杂了。您应该考虑您请求的字符串类型,并相应地对其进行过滤。例如:
$filtered = preg_replace('/[^0- 9A-Fa-f]/', '', $input);
$string = filter_var($input, FILTER_SANITIZE_FULL_SPECIAL_CHARS, FILTER_FLAG_STRIP_LOW);
。这个也删除了所有控制字符。除此之外:
FILTER_SANITIZE_FULL_SPECIAL_CHARS
也会在 filter_var
上执行此操作。如果不这样做,您将面临 XSS(跨站点脚本)攻击的风险。$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/
我正在生成代码,其中我恰好将 n 个单词从一个内存位置复制到另一个非重叠内存位置。 n 是静态已知的。 目前,我发出大量加载指令,然后是大量存储指令,但我怀疑从 n 的某个值开始,调用 memcpy会
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
用例如下: 我有一张 map ,其中将插入一些键/值。 该程序将查询该 map ,但是在第一个查询之后,我可以保证该 map 将完全不会被修改。 因为查询的结果完全是输入的函数,所以在查询方法上放置属
Helo 伙计们,我尝试使用 Refs 并在他的内部提供 this.setState 但它给出: Maximum update depth exceeded. This can happen when
在检查事件时,使用带有 switch 或 if 的代码块是很常见的事情。如果变得简单,它可以是干净的代码,但似乎仍然有比需要更多的行,并且可以使用 lambda 进行简化。 用 if 阻止: if(a
Amazon 最近宣布在其 RDS 产品线中支持 Oracle: http://aws.amazon.com/rds/oracle/ 我想知道是否有人使用过它,或者是否有令人信服的理由将我的数据从 M
我是一名优秀的程序员,十分优秀!