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