当我在网站导航上工作时,应该在网站本身上显示一个 GET 参数,我不知道如何才能验证用户输入。
“正常”的方法是使用 htmlspecialchars() 之类的东西转换输入,以避免 XSS 攻击。我决定不转换输入,而是将其类型转换为 int。
代码看起来像这样:
$siteinfo['current_site'] = (int) $_GET['p'];
(当然这只是可能的,因为预期的输入是一个整数)
你怎么看待这件事?安全吗?你认为有什么缺点吗?
当我在网站导航上工作时,应该在网站本身上显示一个 GET 参数,我不知道如何才能验证用户输入。
“正常”的方法是使用 htmlspecialchars() 之类的东西转换输入,以避免 XSS 攻击。我决定不转换输入,而是将其类型转换为 int。
代码看起来像这样:
$siteinfo['current_site'] = (int) $_GET['p'];
(当然这只是可能的,因为预期的输入是一个整数)
你怎么看待这件事?安全吗?你认为有什么缺点吗?
这可能是验证 int 最安全的方法:
$siteinfo['current_site'] = filter_input(INPUT_GET, 'p', FILTER_VALIDATE_INT);
在这里阅读更多:http: //php.net/manual/en/function.filter-input.php
好吧,我认为这很好,但我也会将其切断:
// 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']);
是的,这是安全的,假设您认为任何整数“安全”。
但是请注意,攻击者仍然可以尝试向您提供零值或负值,或非常大的值,例如 999999999 或(如果您使用 64 位 PHP)甚至 9999999999999999999。如果您的代码尝试,说,运行具有那么多迭代的循环,分配具有那么多元素的数组,甚至创建那么多数据库记录,它可以作为对您的站点执行拒绝服务攻击的简单方法。
因此,为了真正安全,您不仅应该将输入强制转换为整数,还应该验证结果数值对于您使用它的目的是否合理。
@Mahdi:这两个建议似乎都不太合适。第一个建议将输入视为字符串 - 您使用对字符串进行操作的函数。从某种角度来看,这一切都很好($_GET 仅包含字符串),但从您期望输入为某种形式(整数)的角度来看,这一切都很好。
第二个建议也这样做(视为字符串),但此外使用blacklist而不是whitelist。黑名单的缺点是您忘记某些情况的风险很高。如果您完全采用这种方法,您可以以正则表达式检查的形式创建一个白名单。
类型转换意味着输入的原始形式是或可能是不正确的。它也可能会自动尝试修复输入。最好明确检查输入。
user1909426 的建议似乎是迄今为止最好的,同时也考虑了 Ilmari Karonen 的笔记。