所以我正在研究的项目是关于文件上传的死亡偏执.
在这个问题的范围内,我没有在有效载荷方面使用该术语; 我说的是保密.
程序总是会崩溃,并使临时文件在文件系统中闲逛.这很正常.在稍保密偏执可以写命中临时文件夹每隔几分钟,并删除任何东西比之前的cronjob呼叫(而不是几秒钟旧的一个cronjob 一切,仅仅是因为否则可能赶上一个文件被上传过程).
......不幸的是,我们让这个偏执狂更进了一步:
理想情况下,我们希望永远不会在文件上传中看到临时文件,而是在与进程相关的RAM中.
有没有办法教PHP在内存中而不是在文件系统中查找临时文件作为blob?我们使用PHP-FPM作为CGI处理程序,使用Apache作为我们的Web服务器,以防万一.(另请注意:'Filesystem'是这里的关键字,而不是'disc',因为当然有方法将文件系统映射到RAM,但这并不能解决可访问性和自动崩溃后清理问题. )
或者,这些临时文件是否可以在写入光盘时立即加密,以便它们在没有加密的情况下永远不会保存在文件系统中?
遗憾的是,我只能接受一个答案 - 但是对于读这篇文章的人来说,整个帖子非常有价值,并且包含了许多人的集体见解.根据您希望实现的目标,接受的答案可能对您不感兴趣.如果您通过搜索引擎来到这里,请花点时间阅读整个帖子.
以下是我看到的用例的汇编,以供快速参考:
RAM而不是光盘(例如由于I/O问题)→ RAMdisk /可比较(质量87,Joe Hopfgartner)
安全文件权限→ 限制性本机Linux权限(可选择每个vhost)(Gilles)或SELinux(请参阅各种注释)
进程附加内存而不是文件系统(因此进程崩溃会删除文件)(最初由问题决定)
不要让文件数据直接到达PHP→ 反向代理(Cal)
禁用PHP写入文件系统→ 请参阅此答案中的PHP错误链接(Stephan B)或在CGI模式下运行PHP(Phil Lello)
文件→只写/dev/null …
这里有一点非正统的问题:
我目前正试图用一些自定义模块打破Apache.
产生测试的是Apache在内部将其认为太大的请求(例如1 MB垃圾)转发给适当连接的模块,迫使他们处理垃圾数据 - 并且自定义模块中缺乏处理导致Apache完整火上浇油 哦,哎哟,哎哟.
幸运的是,这个特定的问题已得到解决,但问题是否可能存在其他类似的漏洞.
现在我有一个工具供我使用,它允许我向服务器发送原始HTTP请求(或者更确切地说,原始数据通过已建立的TCP连接,如果它遵循一个形式,可以解释为HTTP请求,例如"GET" ......")我想要提出其他想法.(像Slowloris和Nkiller2这样的TCP级攻击目前不是我的重点.)
有没有人有一些好主意如何将服务器的自定义模块混淆到服务器自焚的程度?
我不认为自己是一个非常好的测试人员(我这样做是因为必要和缺乏人力;我很遗憾甚至没有基本的掌握Apache内部能够帮助我),这就是为什么我'希望有一个有见地的回应或两三个.也许你们有些人为自己的项目做过类似的测试?
(如果stackoverflow不是这个问题的正确位置,我道歉.不知道还能把它放在哪里.)
是否可以make在执行第一个目标之前创建临时目录?也许使用一些黑客,一些额外的目标等?
Makefile中的所有命令都可以引用自动创建的目录$TMPDIR,并在make命令结束时自动删除目录.
有没有办法让PHP 忽略类的重新声明,而不是barf up a FATAL ERROR?或者至少抛出异常?(我可以很容易地抓住它然后继续(以及尝试自动加载的日志).)
我猜不是,致命的错误是一个致命的错误 - 毕竟,在百分之九十九的案例中,这是一个相当明智的行为 - 我可能只需要修复它在一个案件上被触发的实例 - 以个案为基础.但也许比我聪明的人有这个想法.
如果你问自己" 为什么你想要这样做? ",请继续阅读.
我正在开发一个使用Reflection来聚合有关已使用函数和类的特定信息的工具.脚本的一个参数是一个可选的引导程序文件,通过自动加载使反射更可靠(减少ReflectionExceptions最终捕获并触发回退启发式,因为类在特定文件中是未知的).
现在,bootstrapping正好加载了自动加载器,脚本按预期运行,在没有任何投诉的情况下移动了几百个文件,直到我遇到障碍:
PHP致命错误:无法在第62行的/usr/share/php/PHPUnit/Framework/Constraint.php中重新声明类PHPUnit_Framework_Constraint
我有两个问题:
一,我不知道是什么触发了这一点.我已经调整了所使用的引导程序,但只是在"无法重新声明"和"无法打开文件"之间交替,具体取决于所使用的包含路径.没有中间立场,即没有发生错误的点.不过,我还在调查.(但这个问题不是问题所在.)
第二,更重要的是,并且导致了这个问题的主题,我需要一种方法来捕捉它.我已经尝试编写自定义错误处理程序,但它似乎不想为Fatal errors 工作(有点明智,有人可能会争辩).
我打算在某个时候将这个工具发布到开源世界,这让我感到非常不可接受.对于不存在的类,我有一个后备启发式 - 我宁愿它们过于频繁地被宣布过一次,但是没有过度使用启发式,也就是说,我确实想要提供使用引导程序的能力.不破坏脚本.永远.即使它是自动加载器历史上最差的自动加载器.
(要强调:我不想帮助我的自动加载器.这不是这个问题的内容.)
我们在项目中使用PHPUnit并使用a phpunit.xml确保backupGlobals关闭的东西.
为了进一步确保包含路径已设置并且自动加载处于活动状态,我们还会对测试引导进行级联.也就是说,每个测试和alltests-suite都有一个require_once(__DIR__ . '/../bootstrap.php');顶部,一直到基本文件夹级别,它显然读取require_once(__DIR__ . '/bootstrap.php');,并且实际的引导文件驻留.
基本上,我们的测试是自主的.您可以AllTests.php在任何文件夹中随意调用任何文件夹*Test.php,它们将以正确的配置运行.
除了没有." 等一下."
只有当我们强制我们的开发人员使用phpunit --configuration=path/to/phpunit.xml或者他们在文件夹中phpunit.xml时才会这样(因此PHPUnit在执行时将其从当前工作目录中拉出来).
有时,这使得很难确定为什么一台开发人员的计算机上的测试正在破坏,以及为什么他们在另一台计算机上运行.它只是忘记了引导程序不是我们需要拥有相同测试环境的唯一东西.请记住,因为如果你尝试过,你不能忘记引导程序,因为它在测试中本身,忘记了其他设置,特别是通常是可选的那些(如果你在文件夹中phpunit.xml,它会被自动拉出),简单.
事实上 - 它发生了几次.
有没有一种方法可以提供phpunit.xml在运行的测试文件中使用的方法,例如在我们方便的无处不在的引导文件中,而不是事先将它提供给PHPUnit,是通过命令行开关还是在其目录中?
粗略地看一下代码表明答案是否定的 - 配置良好且真正似乎在测试文件被拉出之前加载:
[PHPUnit/TextUI/Command.php]
...
if (isset($this->arguments['configuration'])) {
$configuration = PHPUnit_Util_Configuration::getInstance(
$this->arguments['configuration']
);
$phpunit = $configuration->getPHPUnitConfiguration();
...
Run Code Online (Sandbox Code Playgroud)
考虑到配置可以包含测试白名单或黑名单,这确实有一定意义.
实际上,在测试引导程序本身中加载测试过滤器是没有意义的,因此这是窗口中可能配置的一半,但PHPUnit的实际行为标志...
[sample of part of our phpunit.xml]
<phpunit
backupGlobals="false"
backupStaticAttributes="false"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
syntaxCheck="false"
processIsolation="false" …Run Code Online (Sandbox Code Playgroud) 当用户上传文件时,随机将其替换为另一个用户的上传,我最终将问题追溯到PHP并重新使用tmp文件名.有没有办法来解决这个问题?有没有办法制作更好的随机名称?它随着时间的推移似乎会降级,因为随机文件名种子变得越来越弱?这是在PHP 5.2.8和FreeBSD 7.0上
这是一个日志,显示了如何使用相同的tmp文件名并被另一个上传覆盖:http://pastebin.com/m65790440
任何帮助是极大的赞赏.我一直试图解决这个问题超过4个月,并且随着时间的推移变得更糟.谢谢.
编辑:请记住,这不是PHP代码问题,这是在它到达任何PHP代码之前发生的,通过$ _FILES ['name'] ['tmp_name']收到的文件在收到并且被跟踪时是不正确的在它到达上传处理脚本之前,它被其他人的上传覆盖了
我是一名Web开发人员,专注于服务器端编程.我用JavaScript修改了一点点,我已经完成了外部引用的文件或事件处理程序,以及<script>标记之间最小的初始化函数调用.
因此,大约一周前,我很惊讶<script>标签之间的数据通常不会被转义.事实上......它不可能.如果我知道的话,逃离它将会在JavaScript解析器的工作中投入大量的lolwut-ohnoez -wrench,即地球上的每个浏览器.
这导致我们(IMO)clusterfuck 必须使用CDATA来处理带有HTML内部块的文档以通过验证(在XHTML中),这仍然会]]>因为任何原因而在您的代码中出现故障.
作为一个编码/逃避纯粹主义者的东西,我看到了这个抽搐.有几天我现在问自己:
为什么?
谁的想法是将<script>(以及,例如,非常明显不是 JS事件处理程序onclick)从" HTML标签之间的非HTML内容应该被HTML转义 " 这一其他神圣规则中排除,为什么?是不是"这种情况在历史上一直在增长,它现在变得拙劣,处理它",还是有人坐下来思考一些我没有看到的东西?
CSS和<style>标签也是如此(尽管不那么明显).
我们甚至知道是什么促成了这个 - 或者是知识丢失的情况?关于这个话题,我的google-fu一直非常弱,我没有发现任何东西,但由于这实际上是以可怜的OCD方式困扰我,所以我很乐意听到解释,如果有人有.
我正在运行一个使用Atomikos的J2SE应用程序,它将许多日志文件转储到当前目录.我想将这些文件的位置移动到"/ tmp",但我无法找到我可以在Spring XML配置文件中设置的配置属性.
Atomikos文档引用了一个属性:
com.atomikos.icatch.output_dir
Run Code Online (Sandbox Code Playgroud)
这似乎正是我需要的,但如何从没有jta.properties文件的Spring设置?这是我的事务管理器配置:
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager" ref="atomikosTransactionManager" />
<property name="userTransaction" ref="atomikosUserTransaction" />
</bean>
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init" destroy-method="close">
<!-- When close is called, should we force transactions to terminate? -->
<property name="forceShutdown" value="false" />
</bean>
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
<!-- Number of seconds before transaction timesout. -->
<property name="transactionTimeout" value="30" />
</bean>
Run Code Online (Sandbox Code Playgroud) HTML 电子邮件是一个复杂的野兽。决定发送什么(作为发件人)和显示什么(作为收件人)是很棘手的,而且有潜在的危险。
在收件人方面,我们有网络邮件和常规电子邮件客户端。出于我的目的,我认为“网络邮件”是任何将 HTML 电子邮件显示为本身是 HTML 的一部分的任何内容,而常规电子邮件客户端则是任何在不同上下文中显示 HTML 电子邮件的内容(例如操作系统和特定于程序的 GUI)。
webmail 应该如何处理电子邮件中的 HTML 标头(<head>、<title>、<meta>、 ...)?
某处是否有规范,是作为实际标准还是事实上的标准?
我提出这个问题的动机是我们使用HTML Purifier来清理我们的 HTML,如果它的Core.CollectErrors功能报告发生了变化,他们就会被报告。这种“报告”既必要……又令人沮丧。我们删除了一些报告的错误,认为对我们的目的来说无关紧要,但 HTML 标头标志着一个巨大的障碍:
有人可能会<link>在他们的电子邮件中使用,我们将删除。(HTML Purifier 适用于 HTML片段,而非完整文档)
使用<link>HTML 电子邮件之类的东西的愿望似乎确实存在,并且有很多电子邮件客户端<meta>在 HTML 标题(例如 Outlook)中发送-tags,但是如何处理这些事情?悄悄地剥离它们是否安全(就我们而言,这表示“非破坏性更改”)并在发送方确实破坏时将其归咎于众所周知的责任?这合理吗?有没有人以一种或其他方式决定过这一点?我的 google-fu 很弱。:(
php ×4
apache ×2
file-upload ×2
security ×2
atomikos ×1
autoload ×1
css ×1
distribution ×1
escaping ×1
fatal-error ×1
hash ×1
html ×1
html-email ×1
htmlpurifier ×1
http-request ×1
javascript ×1
logging ×1
makefile ×1
md5 ×1
phpunit ×1
spring ×1
webmail ×1