Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP表单不仅仅从移动设备发送信息_Php_Forms_Mobile - Fatal编程技术网

PHP表单不仅仅从移动设备发送信息

PHP表单不仅仅从移动设备发送信息,php,forms,mobile,Php,Forms,Mobile,(请参阅下面的更新) 我有一个非常简单的PHP联系人表单,它在每个浏览器上都非常有效。提交时,流程将通过formaction.php,您将在下面看到它,然后验证验证码,发送信息并重定向到所选页面 我的问题是,我上周意识到,在iPhone 4S、5S和三星SIII上测试的移动设备上使用该表单时,不会发送任何信息 乍一看,我删除了$recipient变量,这是我对formaction.php所做的最后一次更新,并意识到问题并不存在 由于我不熟悉PHP,我有一个想法,可能是某些移动设备无法识别head

请参阅下面的更新)

我有一个非常简单的PHP联系人表单,它在每个浏览器上都非常有效。提交时,流程将通过
formaction.php
,您将在下面看到它,然后验证验证码,发送信息并重定向到所选页面

我的问题是,我上周意识到,在iPhone 4S、5S和三星SIII上测试的移动设备上使用该表单时,不会发送任何信息

乍一看,我删除了
$recipient
变量,这是我对
formaction.php
所做的最后一次更新,并意识到问题并不存在

由于我不熟悉PHP,我有一个想法,可能是某些移动设备无法识别head变量,因此我删除了
$POST[blablabla]
,以编写一些核心信息。这是行不通的

我搜索了很多,以找出移动和网络发送过程之间的差异,但问题仍然存在

session_start();
if(isset($_POST["captcha"]) && 
   $_POST["captcha"]!="" && 
   $_SESSION["code"]==$_POST["captcha"])
{
    Header("Location: http://www.mysite.fake/thank" );

    $recipients = array('info' => 'info@mysite.fake', 
                        'ventes' => 'ventes@mysite.fake', 
                       'commandites' => 'commandites@mysite.fake'
                      );

    $to = $recipients[$_POST['sujet']];
    $head .= "From: ".$_POST['nom']." <".$_POST['courriel'].">\r\n";
    $head .= "X-Sender: <info@mysite.fake>\n";
    $head .= "X-Mailer: PHP\n";
    $head .= "Return-Path: <info@mysite.fake>\n";
    $head .= "Content-Type: text/plain; charset=utf-8\n";

    $sujet = "Subject | ".$_POST['nom']." contacted you for ".$_POST['sujet'].".";
    $informations = "
    Hi, you received a new demand. \r\n
    Name: ".$_POST['nom']." \r\n
    Mail: ".$_POST['courriel']." \r\n
    Subject: ".$_POST['sujet']."\r\n
    Message: ".$_POST['texte']." \r\n";

    mail($to, $sujet ,$informations, $head); 
} else {
    Header("Location: http://www.mysite.fake/error" );
}
Chrome桌面日志

184.xxx.xx.xx - - [10/Jan/2015:20:39:15 -0700] "POST /formaction.php HTTP/1.1" 302 430 "http://mysite.fake/contact" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36"
207.xx.xx.xxx - - [10/Jan/2015:20:28:29 -0700] "POST /formaction.php HTTP/1.1" 302 482 "http://mysite.fake/contact" "Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B440 Safari/600.1.4"
Safari移动日志

184.xxx.xx.xx - - [10/Jan/2015:20:39:15 -0700] "POST /formaction.php HTTP/1.1" 302 430 "http://mysite.fake/contact" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36"
207.xx.xx.xxx - - [10/Jan/2015:20:28:29 -0700] "POST /formaction.php HTTP/1.1" 302 482 "http://mysite.fake/contact" "Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B440 Safari/600.1.4"
请求日志,通过*Charles Proxy验证

这是请求

POST /formaction.php HTTP/1.1
Host: mysite.fake
Content-Length: 141
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,image/webp
Content-Type: application/x-www-form-urlencoded
Origin: http://mysite.fake
Referer: http://mysite.fake/contact
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) CriOS/39.0.2171.50 Mobile/12B440 Safari/600.1.4
Accept-Encoding: gzip, deflate
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: __utma=113777771.1205974649.1111957503.1428078344.1426693544.35; __utmz=113777771.1111957503.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmc=113777771; PHPSESSID=brmpaudvr2rxxxxxxxxna0000; __utmb=113777771.3.10.1421093598
这是服务器响应

HTTP/1.1 302 Moved Temporarily
Date: Mon, 12 Jan 2015 20:34:40 GMT
Server: Apache
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Location: http://mysite.fake/formthank
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 20
Content-Type: text/html

在对代码进行故障排除后,我意识到,
$head
行实际上是问题所在

特别是这个

$head = "From: ".$_POST['nom']." <".$_POST['courriel'].">\n";
好了,问题解决了,又出了一个问题。在
From:
中包含变量非常酷,因为它可以将回复固定到用户身上


如果有人知道为什么
$head
中的
$\u POST
没有被移动设备吸收,或者我如何更好地实现它们,我很乐意知道更多关于发生了什么的信息

您的问题实际上是由巧合造成的,与您提交表单的设备无关。问题在于,您的代码正在将发件人地址设置为用户在表单中提交的任何电子邮件,而您的邮件服务器会拒绝该设置,因为发件人地址显然与脚本用于登录SMTP服务器的凭据不匹配

使用服务器将接受的发件人地址,如
contactform@yourdomain
,并将
回复
标题设置为客户的电子邮件,这样您仍然可以保留欺骗发件人地址的所有优点(我假设这是为了能够通过单击邮件客户端中的“回复”直接回复客户),同时让服务器满意,因为您没有欺骗任何内容。以下是一个示例:

$mail->From = "contactform@yourdomain"; // no sender spoofing so server is happy
$mail->addReplyTo("customer's email", "customer's name"); // reply button works
此外,您当前的代码存在一些问题,没有数据验证(我可以提交空值,您的脚本仍将尝试发送邮件),没有错误检查(即使在尝试发送邮件之前,您也会立即将用户重定向到成功页面)和邮件头插入(攻击者可以使用您的服务器向任何地址发送垃圾邮件)

首先,我建议您使用而不是
mail()
,它更易于使用,您不必手动构建标题字符串,而且可以防止电子邮件注入

这是我提出的一个基本脚本,它肯定不是我写过的最漂亮的代码,但它在值验证方面做得足够好,如果出现问题,它将抛出有意义的错误:

session_start();

// iterate over all expected values and exit if any are missing or empty
foreach (["captcha", "sujet", "nom", "courriel", "texte"] as $value) {
    if (!isset($_POST[$value]) || empty($_POST[$value])) {
        die("Missing or empty value ".$value);
    }
}

// recipient array, used both for validation and mail sending
$recipients = ["info" => "info@...", "ventes" => "ventes@...", "commandites" => "..."];

// exit if the recipient's identified isn't valid
if (!in_array($_POST["sujet"], array_keys($recipients))) {
    die("Incorrect recipient");
}

// exit if the sender's email address isn't valid
if (!filter_var($_POST["courriel"], FILTER_VALIDATE_EMAIL)) {
    die("Incorrect sender email");
}

// check if the captcha's code was set previously
if (!isset($_SESSION["code"])) {
    // if not, ask the user to go back and see the captcha
    die("Missing code, go back and request the captcha image again");
} elseif ($_SESSION["code"] != $_POST["captcha"]) {
    // otherwise, check if the captcha is correct and exit if not
    die("Incorrect captcha, please try again");
}

// new mailer object
$mail = new PHPMailer;

// configure your SMTP server's details
$mail->isSMTP();
$mail->Host = "smtp.example.com";
$mail->Port = 25; // 587 for tls (STARTTLS), 465 for ssl

// if your server requires auth
$mail->SMTPAuth = true;
$mail->Username = "user@example.com";
$mail->Password = "secret";
$mail->SMTPSecure = "tls";

// here we make the actual email
$mail->From = "contactform@yourdomain";
$mail->FromName = $_POST["nom"];
$mail->addAddress($recipients[$_POST["sujet"]]);
$mail->addReplyTo($_POST["courriel"], $_POST["nom"]);
$mail->Subject = $_POST["sujet"];
$mail->Body = $_POST["texte"];

if ($mail->send()) {
    echo "Success !";
} else {
    echo "Something went wrong";
    echo "Error details :".$mail->ErrorInfo;
    // in production, hide the error details to not reveal potentially sensitive info
}

$\u POST
的内容先放在桌面上,然后放在手机上,看看是否有什么不同。这种情况是只发生在手机网络上,还是也发生在Wi-Fi上?如果是前者,那是因为手机ISP经常将每个人都放在透明的HTTP代理之后,它可能会干扰请求,导致请求失败。谢谢你你的帮助@Daniel。彼此的内容看起来都一样。但是你带来了一些有趣的东西。我第一次尝试在3G网络上使用,我成功了一次,超过5次(第一次)为了正确发送信息,进行了不同的测试。我在5次尝试之间的日志中没有发现任何奇怪的地方。我使用桌面与移动设备上的
$\u POST
的Apache日志进行了更新。我看到
HTTP/1.1“302 430
,430在手机上改为482。经过几次搜索后,我没有发现任何归因于430和482的错误代码。302是重定向(对吗?lol)我无法找到任何结论,但请检查
标题(“位置:http://www.mysite.fake/thank" );
实际上一直在执行。请尝试将标题放在代码之后以发送电子邮件。谢谢@ChaimChaikin。我今天早上尝试过,但遗憾的是没有工作。标题重定向可以在之后运行脚本,除非退出;只要它位于
if
中。请注意,您的代码仍然容易受到电子邮件标题I的攻击连接,并且数据没有验证。哇,非常感谢您花时间这么做,我一定会马上检查!我的表单上有一个验证过程,在contact.php文件上。每个值都是必需的,
onSubmit
,经过我写下的
ValidateForm
JS代码,效果非常好。但是你的看起来很干净,非常有效和安全。无限感谢,我会用结果更新你!我的编辑器返回第4行(foreach)和第11行($recipients)有语法错误。首先看,我不知道是哪个,但imma看一看并让你保持更新!@G.EGCB从不依赖客户端进行验证;恶意攻击者会轻易绕过它。@G.EGCB奇怪的是,在PHP 5.6.4上似乎没有任何语法错误,它成功地解析了它。啊,这很有意义,我的主机是5.4。我在最后一个小时读了几篇文章,然后我会继续努力。我会将你的答案标记为已解决,因为我相信这会很好地满足我的需要。如果我想知道你答案的一部分,我会回复。无论如何,英菲特谢谢安德烈!