我正在编写一些 PHP,它采用一些路径到不同的内容目录,并在以后使用这些路径来包含页面的各个部分。我试图确保路径与它们看起来的一样,并且它们都没有违 react 用程序的规则。哪些是,
PRIVATEDIR(相对于 DOCUMENT_ROOT 定义)必须在 DOCUMENT_ROOT 之上。CONTENTDIR(相对于 PRIVATEDIR 定义)必须位于 PRIVATEDIR 下方并且不得返回到 DOCUMENT_ROOT .*DIRS(相对于 CONTENTDIR 定义)必须位于 CONTENTDIR 下方我在单例 Controller 类中设置一些默认值,然后用户将他们想要覆盖的路径数组传递给此类构造函数。然后我想对他们进行健全性检查以确保他们遵守上述规则。这是我开始着手处理的方式......
编辑: 请注意我在下面的代码中使用了 error_reporting,然后不要自己动手!我误解了该命令的工作原理。如果您想知道为什么,请参阅评论中 stealthyninja 和 Col. Shrapnel 的评论(感谢他们向我指出这一点)。
private $opts = array( // defaults
'PRIVATEDIR' => '..', // relative to document root
'CONTENTDIR' => 'content', // relative to private dir
...
...
);
private function __construct($options) { //$options is the user defined options
error_reporting(0);
if(is_array($options)) {
$this->opts = array_merge($this->opts, $options);
}
if($this->opts['STATUS']==='debug') {
error_reporting(E_ALL | E_NOTICE | E_STRICT);
}
$this->opts['PUBLICDIR'] = realpath($_SERVER['DOCUMENT_ROOT'])
.DIRECTORY_SEPARATOR;
$this->opts['PRIVATEDIR'] = realpath($this->opts['PUBLICDIR']
.$this->opts['PRIVATEDIR'])
.DIRECTORY_SEPARATOR;
$this->opts['CONTENTDIR'] = realpath($this->opts['PRIVATEDIR']
.$this->opts['CONTENTDIR'])
.DIRECTORY_SEPARATOR;
$this->opts['CACHEDIR'] = realpath($this->opts['CONTENTDIR']
.$this->opts['CACHEDIR'])
.DIRECTORY_SEPARATOR;
$this->opts['ERRORDIR'] = realpath($this->opts['CONTENTDIR']
.$this->opts['ERRORDIR'])
.DIRECTORY_SEPARATOR;
$this->opts['TEMPLATEDIR' = realpath($this->opts['CONTENTDIR']
.$this->opts['TEMPLATEDIR'])
.DIRECTORY_SEPARATOR;
...
...
...
// then here I have to check that PRIVATEDIR is above PUBLICDIR
// and that all the rest remain within private dir and don't drop
// down into (or below) PUBLICDIR again. And die with an error if
// they don't conform.
}
事情是这似乎有很多工作要做,特别是因为它必须运行,每次访问页面时,在我可以做任何其他事情之前(例如检查我正在服务的页面的缓存版本),当路径本质上是静态的。
我的一部分认为站点的维护者(目前是我)应该知道他们提供的路径,并且应该检查自己是否符合规则。但是(我认为)我更明智的一面是说,不,我应该同样负责检查路径是否符合要求,因为事故确实会发生(尤其是随着网站的发展/变化/获得新的维护者......)和如果可以在安全关键环境中捕获它们,就没有理由不捕获它们。
所以,我几乎决定要检查这些路径,问题是我的方法有多好?这感觉像是一个次优的解决方案。你会如何改进它或者你会建议什么替代方案?有没有办法解决每次加载页面时都必须这样做的问题,并以某种方式在配置更改时才这样做? (那将是理想的,但我不认为微不足道)。
谢谢。
最佳答案
如何使用 strpos 查找子字符串?这不是最优雅的解决方案,但如果您只想为已经在网站上拥有大量权力的人提供一些基本保护。以下是我的做法:
// PRIVATEDIR already includes PUBLICDIR at this point
if(strpos($this->opts['PRIVATEDIR'],$this->opts['PUBLICDIR']) !== 0) {
die('ERROR: '.$this->opts['PRIVATEDIR'].' must be located in .'$this->opts['PUBLICDIR']);
}
注意三元组不等于,它确保 PUBLICDIR 出现在 PRIVATEDIR 字符串的位置 0 而不是简单地找不到或在字符串中的其他位置。此外,您还应该检查它们是否相同 (PUBLICDIR != PRIVATEDIR),因为您可以将其设置为“./test/../”,这将使您返回到“.”。
关于php - 在 PHP 中保护路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4522701/
我有一个带有利润字段的用户模型。利润字段是DECIMAL(11,0)类型。我在表单上有一个屏蔽输入,允许用户输入1,000美元之类的内容。我想格式化该值并从中删除除数字以外的所有内容,这样我将保存1000。这是我到目前为止所拥有的:classUser但它一直在数据库中保存0。看起来它在我的格式化函数之前将其转换为十进制。 最佳答案 试试这个:defprofit=(new_profit)self[:profit]=new_profit.gsub(/[^0-9]/,'')end 关于ruby
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它
您好,我在Rails2应用程序中集成了ZohoSheet,我可以从本地打开新的ZohoSheet,但是当我在zoho编辑器中单击保存时,它会将文件发送到我的服务器,这是我的生产日志ProcessingZohoController#indexto#(for*.*.*.*at2015-10-0811:24:08)[POST]Parameters:{"controller"=>"zoho","filename"=>#,"content"=>#,"eventsource"=>#,"format"=>#,"id"=>#,"action"=>"index"}ActionController::In
对Rails来说有点新,但有点新。其中一个模型在has_many/belongs_to关联中依赖于另一个模型。基本上,在我的应用程序上创建“帖子”时,用户还可以附加“图片”。理想情况下,这是两个独立的模型。当用户选择一张照片时,一些JavaScript将其上传到Cloudinary,返回的数据(ID、宽度、高度等)被JSON字符串化并设置在隐藏字段上。#TheHTML=f.hidden_field:images,:multiple=>true,:class=>"image-data"#Setourimagedataonthehiddenfieldtobeparsedbytheserve
我正在使用railswithdevise进行注册。我还添加了一个邀请码,所以不是每个人都可以注册。邀请码通过“/users/sign_up?invite_code=wajdpapojapsd”之类的查询字符串传输,并使用“f.hidden_field:invite_code,:value=>params[”添加到注册表单的隐藏字段中:invite_code]".这很好用。唯一的问题是,如果注册没有得到验证和拒绝,设计重定向到“/users”并丢失带有invite_code的查询字符串。由于电子邮件在尝试失败后保留在注册表单中,我相信这也适用于邀请代码。作为最坏情况的解决方案,在注册
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我使用PHP的时间太长了,对它感到厌倦了。我也想学习一门新语言。我一直在使用Ruby并且喜欢它。我必须在Rails和Sinatra之间做出选择,那么您会推荐哪一个?Sinatra真的不能用来构建复杂的应用程序,它只能用于简单的应用程序吗?
标题,我认为是self声明。我是一名java开发人员,想确保我的数组只包含整数值。我知道ruby中的一切都是对象。我发现遍历数组并检查每个元素很不方便。在ruby中有什么捷径吗? 最佳答案 使用Enumerable#all?用一个block。整数是类Integer的实例在ruby中。[1,2,3].all?{|i|i.is_a?(Integer)}#=>true[1,2,3,'4'].all?{|i|i.is_a?(Integer)}#=>false 关于ruby-我可以检查一个
我很确定Ruby有这些(等同于__call、__get和__set),否则find_by将如何在Rails中工作?也许有人可以举一个简单的例子来说明如何定义与find_by相同的方法?谢谢 最佳答案 简而言之你可以映射__调用带有参数的method_missing调用__设置为方法名称以'='结尾的method_missing调用__获取不带任何参数的method_missing调用__调用PHPclassMethodTest{publicfunction__call($name,$arguments){echo"Callingob
Lisp是否适合Web编程/应用程序(交互式),就像ruby和php一样?需要考虑的事情是:易于使用可部署性难度(尤其是对于编程初学者而言)(编辑)在阅读PaulGraham'sessay之后,我特别提到了CommonLisp.将是我的第一门编程语言。在这方面。这样做合适吗?我听说Clojure的宏功能不如CommonLisp的强大,这就是我尝试学习Clojure的原因。它教授编程并且非常强大。 最佳答案 Lisp是一个语系,而不是单一的语言。为了稍微回答您的问题,是的,存在用于各种Lisp方言的Web框架,例如用于Common
项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于微信校园跑腿小程序系统,前台用户使用小程序发布跑腿任何和接跑腿任务,后台管理使用基于PHP+MySql的B/S架构;通过后台管理跑腿的用户、查看跑腿信息和对应订单。意义:手机网络时代,大学生通过手机网购日常用品、外卖外卖、代取快递等已不再是稀奇的事情。此外,不少高校还流行着校园有偿工作,校园跑腿就成了大学生创业服务项目。 因为你在校园里,所以不会有进入的限制。并不是所有的外卖平台都可以随意进入校园,比如小黄和小蓝的双打外卖平台。许多大学禁止送餐进入学校,更不用说送餐进入宿舍了。这一措施使得校园服务市场的竞争相对不