我的网站有页眉、页脚和主要内容。如果用户未登录,对于主要内容,可能会显示登录表单而不是实际内容。
在该登录表单上,我在 session 变量 $_SESSION['redirect'] 中写入了 $_SERVER['REQUEST_URI']。
我的登录表单后处理程序将用户登录,成功登录后将通过 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 字符串或随机生成的字符串只有数字和字母,没有特殊字符),如果在数据库查询中使用 get 变量,我总是使用准备好的语句。
我的问题是是否存在任何安全问题?有什么方法可以利用这个,在 url 中输入一些恶意的东西,然后将它发送给另一个用户,例如......?我是否应该在此过程中以某种方式逃避某些事情?
最佳答案
关键规则是您始终检查您的输入/输出并查看您可以控制和不能控制的内容(以及用户可以控制的内容)。在此基础上,您应用安全/ sanitizer 措施。
如果我正确理解您的场景,您将显示该页面,除非用户未登录。在这种情况下,您将显示一个登录框,并在成功登录后将用户发送回他试图访问的页面$_SERVER['request_uri'](存储在 session 中)。
所以用户显然可以控制这个变量,他可以浏览到你的带有一些笨拙字符的页面。因此,您需要对其进行 sanitizer 。正如@Wayne 在评论中提到的,例如,用户可以遍历您的目录树。
因此,就像您的 $_GET 变量一样,您也需要清理 $_SERVER['request_uri']。
有很多方法可以做到这一点。最安全的方法可以说是在使用 html_entities() 或类似方法进行清理后检查 request_uri 是否为现有页面。请注意,特殊的目录遍历方法,例如 ../、// 和 ./ 可能会通过传统的清理方法,例如上述的 html_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 你的 webapp 会注意到我没有登录,将 post.php?../../../ssh 存储在 session 中并处理登录,之后它将我发送回 url。由于 ../../../ssh 部分,我不会被发送到 post.php,而是发送到您服务器上名为 ssh 的目录在您的网络根目录下。为了您的方便,您已将 SSH key 存储在那里。这看起来很安全,因为它在 webroot 之外,没有 webuser 应该能够访问它。
然而,我可以,因为我巧妙地添加了您的网址。
虽然这有点牵强,但正确配置的 http 服务器、chrooting 环境等可以防止这种情况发生,这个例子确实向您展示了如果您允许添加这些字符,它们可能会使用户访问他们所在的位置不应该。
根据您的实现,盲目添加 $_SERVER['request_uri'] 也可能意味着不需要的内容会添加到 session 中,如果您将该 session 存储在数据库中,它也会被添加到数据库。我并不是真正了解 PHP 的(不)安全的最新情况,但我可以想象这允许突破 session 变量并可能将内容注入(inject)您的数据库。
虽然并非一切皆有可能,并且该示例也可能不是真正可行的,但最好还是不难防止这种行为。
-- 事后细想:也许 header('location'... 的东西是不安全的,但是这个:Is this PHP redirect insecure? 表明它不是真的。然而,就像那边的评论者说的那样:输入 urlencode()
关于php - $_SERVER ['REQUEST_URI' ] 和 header ('location: ...' 的任何安全问题);,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15214713/
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳
我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request