Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 美元服务器[';请求URI';]和标头(';位置:…';)的任何安全问题;_Php_Security - Fatal编程技术网

Php 美元服务器[';请求URI';]和标头(';位置:…';)的任何安全问题;

Php 美元服务器[';请求URI';]和标头(';位置:…';)的任何安全问题;,php,security,Php,Security,我的网站有页眉、页脚和主要内容。如果用户未登录,则可能会显示主内容的登录表单,而不是实际内容 在该登录表单上,我将$\u服务器['REQUEST\u URI']写入会话变量$\u会话['redirect'] 我的登录表单posthandler将让用户登录,成功登录后将通过标题('位置:http://myserver.com“.$”会话[“重定向]) 因此,如果我转到myserver.com/somesite.php?somevar=10,如果您登录,它将显示正确的站点。否则它将显示登录表单,但是

我的网站有页眉、页脚和主要内容。如果用户未登录,则可能会显示主内容的登录表单,而不是实际内容

在该登录表单上,我将
$\u服务器['REQUEST\u URI']
写入会话变量
$\u会话['redirect']

我的登录表单posthandler将让用户登录,成功登录后将通过
标题('位置:http://myserver.com“.$”会话[“重定向])

因此,如果我转到
myserver.com/somesite.php?somevar=10
,如果您登录,它将显示正确的站点。否则它将显示登录表单,但是浏览器地址栏中的URL仍然显示
myserver.com/somesite.php?somevar=10
然后输入凭据,然后重定向到
myserver.com/somesite.php?somevar=10
,由于您现在已登录,因此将完全显示

我不将
REQUEST\u URI
值用于表单操作或链接href

此外,我使用的任何
$\u GET
变量首先检查它们是否与正则表达式匹配(通常该变量将是
sha1
字符串或仅随机生成的数字和字母字符串,没有特殊字符),如果在db查询中使用GET变量,我总是使用准备好的语句


我的问题是,是否有任何安全问题?要利用此漏洞,请在url中输入恶意内容,然后将其发送给其他用户,例如。。。?我是否应该在过程中的某个地方漏掉一些东西?

将任何东西放到网上都有很多安全问题。在post/get请求中具有可识别的模式是一个值得关注的问题,但这取决于很多因素,主要是。。。用户可以从您的网站中得到什么,您对网站用户的恶意意图负有多大责任

您应该在清理输入方面做一些研究,使用会话令牌将是您可以做的第一件事,以确保登录脚本的流量实际上是由站点上的用户生成的。这两种常见做法是防止sql注入和跨站点脚本攻击的第一步。 通过良好的数据库设计和代码设计,确保数据得到保护的适当步骤

我最喜欢的技术之一是将我的应用程序配置为使用自定义http头,以及任何从超级全局服务器接收数据的脚本都会进行检查,以确保自定义头作为我的安全组件正确提供。任何黑客都可以很容易地看到和嗅到这些头,但许多恶意攻击都是首先由脚本执行的,而且这只是又一个很容易部署的步骤,使您更难成为此类攻击的目标


这篇文章在谷歌上快速搜索了一个增强基于php的网站,其中有一些很好的提示:

关键的规则是,你总是检查你的输入/输出,看看你能控制什么和不能控制什么(因此,什么可以由用户控制)。在此基础上,采取安全/卫生措施

如果我正确理解了您的场景,您将显示该页面,除非用户未登录。在这种情况下,您将显示一个登录框,成功登录后,您将用户发送回他试图使用
$\u服务器['request\u uri']
(存储在会话中)访问的页面

所以用户显然可以控制这个变量,他可以用一些笨拙的字符浏览你的页面。因此,您需要对其进行消毒。正如@Wayne在评论中提到的,例如,用户可以遍历您的目录树

因此,与您的
$\u GET
变量一样,您也需要清理
$\u服务器['request\u uri']
。 有很多方法可以做到这一点。最安全的方法可以说是在使用
html\u entities()
或类似的方法清理后,检查
请求uri
是否是现有页面。请注意,特殊的目录遍历方法,如
。/
/
/
可能会通过传统的sanization方法,如前面提到的
html\u entities()

直截了当地回答:我是否应该在这个过程中的某个地方逃避某些东西? -是的,每件事,在每个过程的开始

----编辑@12-12-2013---

(对于注释来说,答案太长,因此我将在这里解释用户使用目录遍历的可能性,包括潜在的危险情况)

从PHP手册:

$_SERVER['REQUEST_URI']: The URI which was given in order to access this page;
                         for instance, '/index.html'.
因此,假设我想进入
yourdomain.com/posts/post.php?../../../ssh
您的Web应用程序将注意到我没有登录,在会话中存储
post.php?../../../ssh
,然后处理登录,然后将我发送回url。由于
。/../../ssh
部分的原因,我不会被发送到post.php,而是发送到您的webroot下面的服务器上名为
ssh
的目录。为了方便起见,您已将SSH密钥存储在那里。这看起来很安全,因为它不在webroot中,任何Web用户都不应该能够访问它。 然而,我可以,因为我的巧妙添加到您的网址

虽然这有点牵强,但正确配置的http服务器、chrooting环境等会阻止这种情况的发生,本例确实向您展示了,如果允许添加这些字符,用户可能会访问不应该访问的位置

根据您的实现,盲目添加
$\u SERVER['request\u uri']
也可能意味着将不需要的内容添加到会话中,如果您将该会话存储在数据库中,它也将添加到数据库中。我对PHP的安全性还不是很了解,但我可以想象,这允许打破会话变量并可能注入int
<html>
<?php
/* This will give an error. Note the output
 * above, which is before the header() call */
header('Location: http://www.example.com/');
exit;
?>