电子邮件表单在发送之前是否需要进行清理?

时间:2012-03-22 15:23:14

标签: security email

我有一个客户端不断收到来自godaddy的“websiteprotection.com”的报告,说明网站是如何不安全的。

  

您的网站包含未正确清理的网页   访问者提供的输入,以确保它不包含恶意内容   或脚本。跨站点脚本漏洞让恶意用户   在另一个访问者的浏览器中执行任意HTML或脚本代码。

     

输出:

     

用于检测此漏洞的请求字符串是:   / cross_site_scripting.snasl.asp输出结果为:   HTTP / 1.1 404未找到\ r \ n日期:星期三,21三月2012 08:12:02 GMT \ r服务器:   Apache \ r X-Pingback:http:// CLIENTSWEBSITE.com/ xmlrpc.php \ r \ n Expires:   Wed,11 Jan 1984 05:00:00 GMT \ r \ nCache-Control:no-cache,   must-revalidate,max-age = 0 \ r \ nPragma:no-cache \ r \ nCable-Cookie:   PHPSESSID = 1jsnhuflvd59nb4trtquston50; path = / \ r r Last-Modified:Wed,21   2012年3月08:12:02 GMT \ r-Keep-Alive:超时= 15,最大= 100 \ r \ n连接:   Keep-Alive \ r \ nTransfer-Encoding:chunked \ r \ nIntent-Type:text / html;   charset = UTF-8 \ r \ n

<div id="contact-form" class="widget"><form action="http://​CLIENTSWEBSITE.c
     om/<script>cross_site_​scripting.nasl</script>.asp" id="contactForm"
     meth od="post">

看起来联系表单存在问题。所有联系表单都是将ajax请求发布到同一页面,而不是PHP脚本邮寄数据(没有数据库的东西)。

这里有安全问题吗?关于如何满足安全扫描器的任何想法?

以下是表单和脚本:

<form action="<?php echo $this->getCurrentUrl(); ?>" id="contactForm" method="post">
    <input type="text" name="Name" id="Name" value="" class="txt requiredField name" />
    //Some more text inputs

    <input type="hidden" name="sendadd" id="sendadd" value="<?php echo $emailadd ; ?>" />
    <input type="hidden" name="submitted" id="submitted" value="true" /><input class="submit" type="submit" value="Send" />
    </form>
    // Some initial JS validation, if that passes an ajax post is made to the script below

    //If the form is submitted
    if(isset($_POST['submitted'])) {

    //Check captcha 
if (isset($_POST["captchaPrefix"])) {

$capt = new ReallySimpleCaptcha();
$correct = $capt->check( $_POST["captchaPrefix"], $_POST["Captcha"] );
if( ! $correct ) { echo false; die(); } else {
$capt->remove( $_POST["captchaPrefix"] );
}

}


$dateon = $_POST["dateon"]; 
$ToEmail = $_POST["sendadd"]; 
$EmailSubject = 'Contact Form Submission from ' . get_bloginfo('title'); 
$mailheader = "From: ".$_POST["Email"]."\r\n"; 
$mailheader .= "Reply-To: ".$_POST["Email"]."\r\n"; 
$mailheader .= "Content-type: text/html; charset=iso-8859-1\r\n"; 

$MESSAGE_BODY = "Name: ".$_POST["Name"]."<br>"; 

$MESSAGE_BODY .= "Email Address: ".$_POST["Email"]."<br>"; 

$MESSAGE_BODY .= "Phone: ".$_POST["Phone"]."<br>"; 

if ($dateon == "on") {$MESSAGE_BODY .= "Date: ".$_POST["Date"]."<br>";}

$MESSAGE_BODY .= "Message: ".$_POST["Comments"]."<br>"; 

mail($ToEmail, $EmailSubject, $MESSAGE_BODY, $mailheader) or die ("Failure"); 

echo true; die(); 


} 

3 个答案:

答案 0 :(得分:1)

我不确定我是否理解这里发生了什么,但他们是否抱怨从表单到“http://website/script.asp”的数据没有被检查?

因为,如果是这样,那就太荒谬了,因为即使你选择做一些JavaScript /其他客户端检查,也不应该依赖它。所有的卫生处理应该在服务器端完成,我认为它是什么?

为了清楚起见,您可以发布原始脚本吗?

答案 1 :(得分:0)

这是一种安全风险,因为可以将<script>cross_site_​scripting.nasl</script>。asp键入表单(或隐藏元素),并将其显示在您的页面上。这可以让其他网站将仲裁代码注入您的网站。如果您只是使用联系表单并且没有用户登录或cookie,那么这只是垃圾邮件风险。

(发布生成表单的HTML / PHP,这可能会变得更加清晰)

答案 2 :(得分:0)

您的脚本会立即面临风险,因为您盲目地将$ _POST用于电子邮件标头。这可能允许某人操纵电子邮件的标题以发送到通配符电子邮件地址,或者只是使用您服务器上的表单向其他人发送垃圾邮件。

对于HTML的内容类型,您应该在用户输入上运行htmlentities()(假设您真的不希望他们在电子邮件查看器中启动HTML,如上所述)。

此外,请查看filter_input()以确保他们输入的电子邮件地址有效而不是标头注入。

http://us2.php.net/manual/en/function.filter-input.php