php邮件功能;这种使用方式安全吗?
Posted
技术标签:
【中文标题】php邮件功能;这种使用方式安全吗?【英文标题】:php Mail function; Is this way of using it safe? 【发布时间】:2011-03-01 20:15:53 【问题描述】:我有一个分类网站,每个分类里面都有一个小表格。
这个表格是为了让用户能够给他们的“朋友”打赏:
<form action="/bincgi/tip.php" method="post" name="tipForm" id="tipForm">
Tip: <input name="email2" id="email2" type="text" size="30 />
<input type="submit" value="Skicka Tips"/>
<input type="hidden" value="<?php echo $ad_id;?>" name="ad_id2" id="ad_id2" />
<input type="hidden" value="<?php echo $headline;?>" name="headline2" id="headline2" />
</form>
然后表单被提交到一个tip.php页面,这是我的Q,下面的代码安全吗,即它足够好还是我需要做一些卫生和更多的安全细节?
$to = filter_var($_POST['email2'], FILTER_SANITIZE_EMAIL);
$ad_id = $_POST['ad_id2'];
$headline = $_POST['headline2'];
$subject = 'You got a tip';
$message ='Hi. You got a tip: '.$headline.'.\n';
$headers = 'From: Tips@domain.com\r\n';
mail($to, $subject, $message, $headers);
我还没有测试上述内容。
【问题讨论】:
【参考方案1】:您将 $ad_id
和 $headline
传递给 html 只是为了让它直接返回,保持不变。由于 ad_id 和标题在表单中不可编辑,不要将它们放在表单上,将它们保留在服务器上。这是最安全的。
【讨论】:
【参考方案2】:无论您进行何种过滤,您都需要对这些电子邮件的发送进行速率限制。即使它们看起来来自您并且有一些特定于站点的文本,自动机器人也可能会向其中的数十万个垃圾邮件发送垃圾邮件并获得某种响应(并将您的电子邮件服务器列入黑名单)。只让他们每小时发送少量,您就不会切断合法流量。
【讨论】:
“让他们送来一把”你的意思是用户吧?我如何控制他们发送的数量?你的意思是像检查 ip 并允许每个 IP nr 的 x 数量的电子邮件?这对垃圾邮件机器人安全吗? 对于任何防守,总有进攻可以打破它,但你只需要成为一个困难的目标。拥有分布式僵尸网络的人无论如何都可以谋杀您的机器,但他们不太可能需要您的服务器来发送垃圾邮件。所以,是的,通过 IP 地址限制用户,您将成为次要目标。 请指出正确的方向,即如何限制每个用户发送的提示数?我应该将此记录保存在单独的文件中,还是您将如何做? 如果您将电子邮件记录在表格中(这不是一个坏主意),请将用户的 IP 地址和请求日期与其余信息一起存储,然后插入发送电子邮件之前的检查,检索用户在过去一小时/一天/等内发送电子邮件的次数。【参考方案3】:在使用之前清理输入是个好主意。检查以确保两个 post 变量的格式正确(例如,只有文本或数字(使用 Regex 或 is_numeric 等))
【讨论】:
【参考方案4】:您在 $ad_id = $_POST['ad_id2'];
和 $headline = $_POST['headline2'];
中似乎有 XSS。
mail()
存在安全问题。您必须小心 $headers 中的 CRLF 注入 \r\n
。在这种情况下 $headers 不受攻击者控制,因此您无需担心。另一点虽然称为 CRLF 注入,但也可以称为 LF 注入,因为您真正需要的只是一个新行,因为 SMTP 是一种宽容协议。
【讨论】:
【参考方案5】:如果$headline
来自您自己的数据库,我不会将文本放在隐藏字段中,而是将标题的id
放在并在发送邮件之前从数据库中检索实际文本。
这样你就可以 A. 简单地检查 id 是否真的是一个整数 B. 确定只发送有效的标题;现在有人可以发布您的表单,用他们想要的任何文字替换您的标题。
【讨论】:
以上是关于php邮件功能;这种使用方式安全吗?的主要内容,如果未能解决你的问题,请参考以下文章