$ _GET请求的安全性

时间:2011-11-27 14:20:09

标签: php get

使用类似http://www.site.com/user/1的网址结构,是否存在安全隐患?

例如此处http://stackoverflow.com/users/edit/1

这不是安全漏洞。我怎么能避免这个?

7 个答案:

答案 0 :(得分:1)

这取决于。您应该拒绝不需要访问该页面的人员访问权。

答案 1 :(得分:1)

如果您不检查目标页面的编辑权限(或任何操作),则只会带来安全风险。例如,在您的示例网址中,只允许用户ID 1(或者某些网站范围的管理员)编辑该页面。其他人将被重定向,或以其他方式被拒绝访问。

有些人认为增量整数ID是一个轻微的安全风险,因为它们很容易被猜到并在循环中编写脚本来探测攻击者可以采取未经授权的行动的页面。但是,使用递增整数id的做法非常普遍,并且还取决于对每个页面加载的正确访问检查。

最后,也许最重要的是,在处理该URL的脚本中,您需要做的第一件事就是将数字ID验证为数字并识别有效资源。

答案 2 :(得分:1)

请解释为什么您认为这是安全漏洞。

如果您的意思是用户只需更改号码即可访问其他用户的编辑页面,是的,他们可以。这也可以通过POST完成,可以手动更改正文(例如,通过创建发布到您页面的本地html文件,或通过使用浏览器插件更改正文)。

但是,您应该对每个页面使用检查,以查看当前登录的用户是否有权执行在该页面上执行的操作。

可以简单地通过以下方式完成:

$userIdToEdit = $_GET['ID'];

if ($userIdToEdit != $_SESSION['loggedOnUserId'])
{
    redirect("/NotAllowed"); // Deny access to the page
}

// if we end up here, the user may perform this action, like store POSTed data in db

但是,虽然您拥有所需的所有灵活性,但您可能会在整个页面中重复检查。解决这个问题的方法是使用RBAC,它会变成这样:

checkRole(EditOwnProfile); // only logged on users may do this, redirects to /NotAllowed if necessary

// and check for another role 
$userIdToEdit = $_GET['ID'];
if ($userIdToEdit != $_SESSION['loggedOnUserId'])
{
    checkRole(EditOtherProfile); // admins may do this for example
}

答案 3 :(得分:0)

只要您的脚本是安全的,使用htaccess重写规则不会导致安全问题。你基本上需要使用会话来跟踪谁被允许访问该页面,并且使用好的代码你应该没问题。并且user.php?id=1/user/1都是相同的,它们需要相同数量的安全性

答案 4 :(得分:0)

通常,了解资源的URI不是安全问题。

如果HTTP请求可能导致在没有进行身份验证/授权步骤的情况下编辑数据,则会导致安全问题。

提供一个表单,邀请用户在没有这样的步骤的情况下编辑数据,然后仅在提交表单后应用安全检查才会导致可用性差。

您提供的特定示例可能属于较差的可用性类别。我不会尝试提交编辑请求以查看它是否属于安全问题类别,但我认为它不会(考虑到SO已存在多久以及它有多受欢迎)。

答案 5 :(得分:0)

如果您正确检查用户权限,则编辑操作http://stackoverflow.com/users/edit/1不会带来安全风险。

另一方面,像http://stackoverflow.com/users/delete/1 这样的网址是一种安全风险,因为攻击者可能会欺骗授权用户打开此网址,这会导致用户删除id 1.这可以通过使用像bit.ly这样的URL-Shortening-Service来实现。

您可以通过将$ _POST用于删除操作以及向请求添加令牌以验证请求来源来避免这种情况。

答案 6 :(得分:0)

您必须注意HTTP协议本身的工作方式(潜在攻击者的可能性如何)。 简而言之 - 如果您决定将该网址更改为/change-user之类的内容并在post params中隐藏id等参数,则攻击者的选项没有区别。

您需要保护该HTTP请求的身份验证(可能是通过标准登录创建的会话,您有更多选择如何执行此操作)。