通过类型转换验证用户输入

时间:2013-04-02 11:01:21

标签: php security validation casting web

当我在网站导航上工作时,应该在网站上显示GET参数,我知道如何验证用户输入。

“正常”方式是使用htmlspecialchars()转换输入以避免XSS攻击。我决定不转换输入,而是将其转换为int。

代码看起来像这样:

$siteinfo['current_site'] = (int) $_GET['p'];

(当然这是可能的,因为预期的输入是一个整数)

您如何看待这个?安全吗?您认为有什么不利之处吗?

4 个答案:

答案 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的笔记。