【问题标题】:sql-injection urls, is length of a parameter a security issue?sql-injection url,参数的长度是安全问题吗?
【发布时间】:2011-09-23 19:55:47
【问题描述】:

我收到了很多涉及 sql 注入尝试的点击,这些尝试涉及越来越长的参数。我将 php 中的参数限制为将它们转换为正整数或零,但我不确定是否存在某种涉及非常长的参数的技巧会导致我出现问题(缓冲区溢出问题?)。

我知道 php 中的 suhosin 补丁对过长的参数进行了某种修补,尽管我目前还没有。我应该怎么做才能保护自己免受此类情况的侵害(从我的日志中)?

ProductId=47&ItemId=-1025+UNION+SELECT+0x6d6567613164756d706572,0x6d6567613264756d706572,0x6d6567613364756d706572,0x6d6567613464756d706572,0x6d6567613564756d706572,0x6d6567613664756d706572,0x6d6567613764756d706572,0x6d6567613864756d706572,0x6d6567613964756d706572,0x6d65676131064756d706572,0x6d65676131164756d706572,0x6d65676131264756d706572,0x6d65676131364756d706572,0x6d65676131464756d706572,0x6d65676131564756d706572,0x6d65676131664756d706572,0x6d65676131764756d706572,0x6d65676131864756d706572,0x6d65676131964756d706572,0x6d65676132064756d706572,0x6d65676132164756--

【问题讨论】:

  • 我能想到的唯一问题是一个真正疯狂的大字段值导致您的查询超过 DB 协议的最大数据包大小。 MySQL 不能跨多个数据包拆分查询。
  • 您希望结果是什么,有点像拒绝服务的结果,它会减慢系统速度?我计划添加 suhosin 补丁,但我必须弄清楚它会产生的所有次要效果。
  • 我猜是语法错误,因为中间数据会被截断,有点像INSERT INTO table (....) VAL[chop]
  • 您可能想在 google 上搜索类似 0x6d6567613164756d706572 的字符串或等效的字符串转换 mega1dumper。希望您不会在搜索结果中找到自己的网站。

标签: php sql-injection parameter-passing


【解决方案1】:

您可以使用intval() 来验证用户输入。如果解析失败,它将以整数或 0 的形式返回输入。在您的示例中就是后者。

$filteredItemId = intval($_GET['itemId']);

if($filteredItemId <= 0) { /* invalid id given */ } else { /* do stuff */ }

【讨论】:

  • 是的,目前我也使用:// Return a casting with a result of a positive int, or else zero. function positive_int($num){ return ((int)$num == $num &amp;&amp; (int)$num &gt; 0? (int)$num : 0); } 来防止负整数。
【解决方案2】:

使用准备好的语句。参数在发送到数据库之前被转义,不会造成任何损害。

更新

同样的机制也可以应用于其他用户提供的内容。 使用htmlspecialchars() 转义所有数据,您从用户那里获得。这对 XSS 攻击也应该是安全的(在大多数情况下)

【讨论】:

  • 不错,但它们不能保护您免受 XSS 攻击。
  • 对@henchman,但这不是问题;)还是我错过了文本中的某些内容?
  • 我应该怎么做才能保护自己免受这种情况(从我的日志中)?我在这个问题中没有看到对某些攻击类型的限制......
  • @henchman:你是对的,所以我稍微扩展了我的答案
  • 但是根据定义,准备好的语句不会改变长度(或者它会稍微长一些)。因此,如果存在长度过长的安全问题,这将无法解决。
【解决方案3】:

请务必检查所有输入参数。也是为了长度。如果您不信任它,请阻止整个 IP。我今天有 100 多次这样的攻击,但由于一张带有“坏话”的大桌子,我幸免于难。如果字符串包含任何坏词->阻止整个IP。

【讨论】:

  • “坏话”是什么意思?要么您正确处理 SQL 注入并完全阻止它们,要么您的代码已损坏。
猜你喜欢
  • 2011-11-25
  • 2022-12-08
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多