【问题标题】:validate user input by typecasting通过类型转换验证用户输入
【发布时间】:2013-04-02 11:01:20
【问题描述】:
当我在网站导航上工作时,应该在网站本身上显示 GET 参数,我不知道如何验证用户输入。
“正常”的方法是使用类似 htmlspecialchars() 的方式转换输入,以避免 XSS 攻击。我决定不转换输入,而是将其类型转换为 int。
代码如下所示:
$siteinfo['current_site'] = (int) $_GET['p'];
(当然这是可能的,因为预期的输入是整数)
您对此有何看法?安全吗?你觉得有什么缺点吗?
【问题讨论】:
标签:
php
security
validation
casting
web
【解决方案2】:
是的,这是安全的,假设您认为任何整数都是“安全的”。
但是请注意,攻击者仍然可以尝试向您提供零或负值,或非常大的值,例如 999999999 或(如果您使用 64 位 PHP)甚至 9999999999999999999。如果您的代码尝试例如,运行具有那么多迭代的循环,分配具有那么多元素的数组,甚至创建那么多数据库记录,它可以作为对您的站点执行拒绝服务攻击的简单方法。
因此,为了真正安全,您不仅应该将输入强制转换为整数,还应该验证生成的数值对于您使用它的目的是否合理。
【解决方案3】:
嗯,我认为这很好,但我也会把它删掉:
// imagine you need up to four chars
$_GET['var'] = substr($_GET['var'], 0, 4);
如果是文本,那我也可以这样:
// sample of bad guys
$bad = array('<','>');
$_GET['var'] = str_replace($bad, '', $_GET['var']);
【解决方案4】:
@Mahdi:这两个建议似乎都不太合适。
第一个建议将输入视为字符串 - 您使用对字符串进行操作的函数。从某种角度来看,这一切都很好($_GET 仅包含字符串),但从您期望输入为某种形式(整数)的角度来看,这并不好。
第二个建议也是这样做的(被视为字符串),但进一步使用黑名单而不是白名单。黑名单的缺点是您忘记某些情况的风险很高。如果您完全采用这种方法,您可以以正则表达式检查的形式创建一个白名单。
类型转换意味着输入的原始形式不正确,或者可能不正确。它也可能会自动尝试修复输入。最好明确检查输入。
user1909426 的建议似乎是迄今为止最好的,同时也考虑了 Ilmari Karonen 的笔记。