-1

我在 php 中编写了一个小电子邮件脚本,供 flash 使用。为了使它更安全,我添加了一个 preg_match 检查来比较引用者和一个 preg_match 以防止标头注入。

对于推荐人检查,我正在对 $url 变量进行检查。并且仅当它以引荐来源网址开头时才应为真。因此,例如http://spambot.com/index.php?http://www.mysite.nl是不允许的,但“ http://www.mysite.nl ”是。这样做是正确的格式吗?

//check start with string
if (preg_match("/^".$url."/",$result); 

让我有点困惑,因为我想对照变量 $url 而不是字符串“$url”检查 $result。

对于标头注入保护:这个 preg_match 行应该这样做吗?

//prevent header injection
if (preg_match( "/[\r\n]/", $_POST["sFrom"] ) || preg_match( "/[\r\n]/", $$_POST["sEmail"] ) ) 

以下是完整的电子邮件脚本以供进一步参考:

?php

//referrer: 
$url = http://www.mysite.nl

//check referrer
$result = stripos($url, $_SERVER['HTTP_REFERER']);

//check start with string
if (preg_match("/^".$url."/",$result); 
{

//prevent header injection
if (preg_match( "/[\r\n]/", $_POST["sFrom"] ) || preg_match( "/[\r\n]/", $$_POST["sEmail"] ) ) 
        {

if ($result === false)
{
die("error"); //bad referrer
}
else
{
//process the action

$sendTo = $_POST["sEmail"];
$subject = $_POST["sSubject"];

$headers = "From: " . $_POST["sFrom"] . "<noreply@mysite.nl>\r\n";
$headers .= "Reply-To: " . "<noreply@mysite.nl>\r\n";
$headers .= "Return-path: " . "<noreply@mysite.nl>";

$message = $_POST["sMessage"];

mail ($sendTo, $subject, $message, $headers);

}

}

}
?>
4

1 回答 1

0

在 Mamp 上对其进行了测试,使用 preg_match 查找以 $url 开头的字符串是正确的。在标头注入中使用 preg_match 需要一些修正。必须在两种情况下都使用 !pregmatch ,因为只有在 from 和 to 字段中没有任何换行符时脚本才应该继续。

于 2013-05-31T07:35:04.083 回答