<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>潘锦的空间 &#187; exec</title>
	<atom:link href="https://www.phppan.com/tag/exec/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.phppan.com</link>
	<description>SaaS SaaS架构 团队管理 技术管理 技术架构 PHP 内核 扩展 项目管理</description>
	<lastBuildDate>Sun, 12 Apr 2026 03:47:23 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.9.40</generator>
	<item>
		<title>PHP安全模式下的exec执行问题</title>
		<link>https://www.phppan.com/2011/02/php-safe-mode-exec/</link>
		<comments>https://www.phppan.com/2011/02/php-safe-mode-exec/#comments</comments>
		<pubDate>Tue, 15 Feb 2011 08:53:52 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[exec]]></category>
		<category><![CDATA[安全模式]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=1279</guid>
		<description><![CDATA[PHP安全模式下的exec执行问题 今天同事遇到一个问题，在执行某个程序的时，将执行的命令写错了，发现程序依然 [&#8230;]]]></description>
				<content:encoded><![CDATA[<h1 style="font-weight: normal; font-family: 'Microsoft YaHei', Helvetica, Arial, sans-serif; font-size: 1.4em; color: #006ea3; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-bottom: 10px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #aaaaaa;">PHP安全模式下的exec执行问题</h1>
<p style="text-indent: 2em;">今天同事遇到一个问题，在执行某个程序的时，将执行的命令写错了，发现程序依然可以执行，可是当把程序在终端运行时又显示此文件不存在。 于是最近一直沉迷于源码的我追踪了整个执行过程，得到如下答案。</p>
<p style="text-indent: 2em;">以上的问题出现在安全模式开启的情况下。</p>
<p style="text-indent: 2em;">按照PHP的源码结构，exec函数的实现应该在<strong>/ext/standard</strong>目录下，在此目录找到exec.c文件，exec函数的实现就在这里。如果不熟悉源码结构，可以考虑使用editplus全局搜索<strong>PHP_FUNCTION(exec)</strong>，当然，你也可以使用其它的工具。这只是一个查找的方式。重点是接下来我们要看的代码。</p>
<p style="text-indent: 2em;">整个调用顺序如下：</p>
<p style="text-indent: 2em;">[PHP_FUNCTION(exec) -&gt; php_exec_ex -&gt; php_exec]</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;"><span style="color: #bd48b3; font-style: italic;">/* {{{ php_exec
 * If type==0, only last line of output is returned (exec)
 * If type==1, all lines will be printed and last lined returned (system)
 * If type==2, all lines will be saved to given array (exec with &amp;$array)
 * If type==3, output will be printed binary, no lines will be saved or returned (passthru)
 *
 */</span>
PHPAPI <span style="color: #1299da;">int</span> php_exec<span style="color: #ffffff;">(</span><span style="color: #1299da;">int</span> type<span style="color: #e0882f;">,</span> <span style="color: #1299da;">char</span> <span style="color: #e0882f;">*</span>cmd<span style="color: #e0882f;">,</span> zval <span style="color: #e0882f;">*</span>array<span style="color: #e0882f;">,</span> zval <span style="color: #e0882f;">*</span>return_value TSRMLS_DC<span style="color: #ffffff;">)</span>
<span style="color: #ffffff;">{</span>
    ... <span style="color: #bc9458; font-style: italic;">//  省略</span>
    <span style="color: #ff8400;">if</span> <span style="color: #ffffff;">(</span>PG<span style="color: #ffffff;">(</span>safe_mode<span style="color: #ffffff;">)</span><span style="color: #ffffff;">)</span> <span style="color: #ffffff;">{</span>    <span style="color: #bc9458; font-style: italic;">//  安全模式</span>
        <span style="color: #ff8400;">if</span> <span style="color: #ffffff;">(</span><span style="color: #ffffff;">(</span>c <span style="color: #e0882f;">=</span> strchr<span style="color: #ffffff;">(</span>cmd<span style="color: #e0882f;">,</span> <span style="color: #99ff00;">' '</span><span style="color: #ffffff;">)</span><span style="color: #ffffff;">)</span><span style="color: #ffffff;">)</span> <span style="color: #ffffff;">{</span>
            <span style="color: #e0882f;">*</span>c <span style="color: #e0882f;">=</span> <span style="color: #99ff00;">'<span>\0</span>'</span><span style="color: #e0882f;">;</span>
            c<span style="color: #e0882f;">++;</span>
        <span style="color: #ffffff;">}</span>
        <span style="color: #ff8400;">if</span> <span style="color: #ffffff;">(</span>strstr<span style="color: #ffffff;">(</span>cmd<span style="color: #e0882f;">,</span> <span style="color: #99ff00;">".."</span><span style="color: #ffffff;">)</span><span style="color: #ffffff;">)</span> <span style="color: #ffffff;">{</span>    <span style="color: #bc9458; font-style: italic;">//  不能在指向程序的路径中包含 .. 成分</span>
            php_error_docref<span style="color: #ffffff;">(</span><span style="color: #cc7833;">NULL</span> TSRMLS_CC<span style="color: #e0882f;">,</span> E_WARNING<span style="color: #e0882f;">,</span> <span style="color: #99ff00;">"No '..' components allowed in path"</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span>
            <span style="color: #ff8400;">goto</span> err<span style="color: #e0882f;">;</span>
        <span style="color: #ffffff;">}</span>

        b <span style="color: #e0882f;">=</span> strrchr<span style="color: #ffffff;">(</span>cmd<span style="color: #e0882f;">,</span> PHP_DIR_SEPARATOR<span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span>    <span style="color: #bc9458; font-style: italic;">//  #define PHP_DIR_SEPARATOR '/'</span>

         ... <span style="color: #bc9458; font-style: italic;">//  省略</span>

        spprintf<span style="color: #ffffff;">(</span><span style="color: #e0882f;">&amp;</span>d<span style="color: #e0882f;">,</span> <span style="color: #1299da;">0</span><span style="color: #e0882f;">,</span> <span style="color: #99ff00;">"%s%s%s%s%s"</span><span style="color: #e0882f;">,</span> PG<span style="color: #ffffff;">(</span>safe_mode_exec_dir<span style="color: #ffffff;">)</span><span style="color: #e0882f;">,</span> <span style="color: #ffffff;">(</span>b <span style="color: #e0882f;">?</span> <span style="color: #99ff00;">""</span> <span style="color: #e0882f;">:</span> <span style="color: #99ff00;">"/"</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">,</span> <span style="color: #ffffff;">(</span>b <span style="color: #e0882f;">?</span> b <span style="color: #e0882f;">:</span> cmd<span style="color: #ffffff;">)</span><span style="color: #e0882f;">,</span> <span style="color: #ffffff;">(</span>c <span style="color: #e0882f;">?</span> <span style="color: #99ff00;">" "</span> <span style="color: #e0882f;">:</span> <span style="color: #99ff00;">""</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">,</span> <span style="color: #ffffff;">(</span>c <span style="color: #e0882f;">?</span> c <span style="color: #e0882f;">:</span> <span style="color: #99ff00;">""</span><span style="color: #ffffff;">)</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span>
        <span style="color: #ff8400;">if</span> <span style="color: #ffffff;">(</span>c<span style="color: #ffffff;">)</span> <span style="color: #ffffff;">{</span>
            <span style="color: #e0882f;">*</span><span style="color: #ffffff;">(</span>c <span style="color: #e0882f;">-</span> <span style="color: #1299da;">1</span><span style="color: #ffffff;">)</span> <span style="color: #e0882f;">=</span> <span style="color: #99ff00;">' '</span><span style="color: #e0882f;">;</span>
        <span style="color: #ffffff;">}</span>
        cmd_p <span style="color: #e0882f;">=</span> php_escape_shell_cmd<span style="color: #ffffff;">(</span>d<span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span>
        efree<span style="color: #ffffff;">(</span>d<span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span>
        d <span style="color: #e0882f;">=</span> cmd_p<span style="color: #e0882f;">;</span>
    <span style="color: #ffffff;">}</span> <span style="color: #ff8400;">else</span> <span style="color: #ffffff;">{</span>
        cmd_p <span style="color: #e0882f;">=</span> cmd<span style="color: #e0882f;">;</span>
    <span style="color: #ffffff;">}</span>
    ...<span style="color: #bc9458; font-style: italic;">//省略</span>
<span style="color: #ffffff;">}</span>
<span style="color: #bd48b3; font-style: italic;">/* }}} */</span></pre>
<p style="text-indent: 2em;">从上面的代码可以看出，PHP在实现exec函数时，安全模式下，会去掉命令中包含的所有路径，只留下需要执行的命令及其参数。 最后将这个命令与PG(safe_mode_exec_dir)连接起来作为需要执行的命令返回 。这也就是我们在安全模式下，对于需要执行的命令，即使路径是错的也可以正常执行的原因。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2011/02/php-safe-mode-exec/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
