我的网站有页眉,页脚和主要内容.如果用户未登录,则可以显示登录表单而不是实际内容.
在该登录表单上,我$_SERVER['REQUEST_URI']
在会话变量中写入$_SESSION['redirect']
.
我的登录表单posthandler将登录用户,将成功登录此链接后发送给用户 header('location: http://myserver.com'.$_SESSION['redirect']);
所以,如果我去myserver.com/somesite.php?somevar=10
,它会显示正确的网站,如果你已经登录,否则会显示登录表单,但是在浏览器地址栏中的URL仍然说myserver.com/somesite.php?somevar=10
那你输入您的凭据,你会被重定向到myserver.com/somesite.php?somevar=10
,这将然后 - 因为你现在已经登录 - 完全显示.
我不使用REQUEST_URI
表单操作的值或链接href.
此外,任何$_GET
我用我首先检查它们是否匹配正则表达式的变量(通常是变量将是一个sha1
字符串或数字和字母而已,没有任何特殊字符的,否则随机生成的字符串),我总是使用准备好的语句,如果得到的变量用于db查询.
我的问题是,是否有任何安全问题?有任何方法可以利用它,在网址中输入恶意内容,然后将其发送给其他用户,例如......?我是否应该在某个过程中以某种方式逃避某些事情?
关键规则是您始终检查输入/输出并查看您可以控制和不能控制的内容(以及用户可以控制的内容)。在此基础上,您应用安全/卫生措施。
如果我正确理解您的场景,您将显示该页面,除非用户未登录。在这种情况下,您将显示一个登录框,成功登录后,您将用户发送回他尝试使用(存储$_SERVER['request_uri']
的在会话中)。
所以用户显然可以控制这个变量,他可以浏览到你的带有一些尴尬字符的页面。因此你需要对其进行消毒。正如 @Wayne 在评论中提到的,例如,用户可以遍历您的目录树。
因此,就像您的$_GET
变量一样,您也需要对其进行清理$_SERVER['request_uri']
。有很多方法可以做到这一点。最安全的方法可以说是在使用或类似的方法request_uri
进行清理后检查是否是现有页面。html_entities()
请注意,特殊的目录遍历方法(例如../
、//
和 )./
可能会忽略传统的清理方法(例如前面提到的)html_entities()
从字面上回答: 我应该在这个过程中以某种方式逃避某些事情吗? - 是的,一切,在每个过程的开始。
------ 编辑 @ 12-12-2013 -----
(评论的答案太长,所以我将在这里解释用户如何可能使用目录遍历,包括潜在的危险情况)
来自 PHP 手册:
$_SERVER['REQUEST_URI']: The URI which was given in order to access this page;
for instance, '/index.html'.
Run Code Online (Sandbox Code Playgroud)
因此,假设我想要访问yourdomain.com/posts/post.php?../../../ssh
您的 Web 应用程序,它会注意到我尚未登录,存储post.php?../../../ssh
在会话中并处理登录,然后将我发送回 URL。由于这个../../../ssh
原因,我不会被发送到 post.php,而是发送到服务器上ssh
位于 webroot 下方的名为的目录。为了您的方便,您已将 SSH 密钥存储在那里。这看起来很安全,因为它不在 Webroot 之外,任何 Web 用户都不能访问它。然而,我可以,因为我巧妙地添加了你的网址。
虽然这有点牵强,但正确配置的 http 服务器、chroot 环境等将防止这种情况发生,此示例确实向您表明,如果允许添加这些字符,它们可能会使用户访问他们不应该访问的位置。
根据您的实现,盲目添加$_SERVER['request_uri']
也可能意味着不需要的内容被添加到会话中,如果您将该会话存储在数据库中,它也会被添加到数据库中。我不太了解 PHP 的安全程度,但我可以想象这允许突破会话变量并可能将内容注入到数据库中。
尽管并非一切皆有可能,并且该示例也可能并非真正可能,但最好防止这种行为,而且也不难。
-- 经过思考:也许这些header('location'...
东西不安全,但是这个:这个 PHP 重定向不安全吗?表明它不是真的。然而,就像那边的评论者所说:打字并不难urlencode()
归档时间: |
|
查看次数: |
5529 次 |
最近记录: |