【问题标题】:Contact Form input filtering联系表格输入过滤
【发布时间】:2012-10-22 00:34:08
【问题描述】:

通过我的联系表检查,我发现了跨站点脚本漏洞,但没有足够的知识来解决这个问题。

受影响的参数:name 使用的向量:">alert(document.cookie) 找到模式:\">alert(document.cookie) 完整攻击:/http://#################/contact.php [name=\">alert(document.cookie) &email= &message=]

受影响的参数:email 使用的向量:">alert(document.cookie) 找到模式:\">alert(document.cookie) 完成攻击:/http://##################/contact.php [name= &email=\">alert(document.cookie) &message=]

受影响的参数:message 使用的向量:">alert(document.cookie) 找到模式:\">alert(document.cookie) 完整攻击:/http://#################/contact.php [name= &email= &message=\">alert(document.cookie)]

我当前的表单代码如下所示

<?php 
if (isset($_POST['submit'])) { 
    $error = ""; 

    if (!empty($_POST['name'])) { 
        $name = $_POST['name']; 
        if (!preg_match('/^[a-zA-Z0-9]+$/i', $name)){  
            $error .= "The name you entered is not valid. <br/>"; 
        } 
    } else { 
        $error .= "You didn't type in your name. <br />"; 
    } 

    if (!empty($_POST['email'])) { 
        $email = $_POST['email']; 
        if (!preg_match("/^[_a-z0-9]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/i", $email)){  
            $error .= "The e-mail address you entered is not valid. <br/>"; 
        } 
    } else { 
        $error .= "You didn't type in an e-mail address. <br />"; 
    } 

    if (!empty($_POST['messagesubject'])) { 
        $messagesubject = $_POST['messagesubject']; 
    } else { 
        $error .= "You didn't type in a subject. <br />"; 
    } 

    if (!empty($_POST['message'])) { 
        $message = $_POST['message']; 
    } else { 
        $error .= "You didn't type in a message. <br />"; 
    } 

    if(($_POST['code']) == $_SESSION['code']) {  
        $code = $_POST['code']; 
    } else {  
        $error .= "The captcha code you entered does not match. Please try again. <br />";     
    } 

    if (empty($error)) { 
        $from = 'From: ' . $name . ' <' . $email . '>'; 
        $to = "aaron@fosternetwork.co.uk"; 
        $subject = strip_tags("CWS - Contact Us - \n" . $messagesubject); 
        $content = strip_tags("Name: " . $name . "\nSubject: " . $messagesubject . "\nMessage: \n" . $message); 
        $success = "<h2>Thank you! <span>Your message has been sent!</span></h2>"; 
        mail($to,$subject,$content,$from); 
        $emailSent = true; 
    } 
} 
?> 

表格

<form action="contact.php" method="post"> 

    <label>Name:</label> 
    <input type="text" name="name" value="<?php if ($_POST['name']) { echo $_POST['name']; } ?>" /> 

    <label>Email:</label> 
    <input type="text" name="email" value="<?php if ($_POST['email']) { echo $_POST['email']; } ?>" /> 

    <label>Subject:</label> 
    <input type="text" name="messagesubject" value="<?php if ($_POST['messagesubject']) { echo $_POST['messagesubject']; } ?>" /> 

    <label>Message:</label><br /> 
    <textarea name="message" rows="20" cols="20"><?php if ($_POST['message']) { echo $_POST['message']; } ?></textarea> 

    <label>Please input the following code: <img src="captcha.php"></label> 
    <input type="text" name="code"> <br />  

    <button type="submit" class="colorButton" name="submit" value="Send message">Send Message</button> 

</form>

非常感谢任何帮助。

【问题讨论】:

    标签: php forms xss contact


    【解决方案1】:

    您的 HTML 生成存在缺陷:

     value="<?php if ($_POST['name']) { echo $_POST['name']; } ?>"
    

    您应该始终转义您的输出变量,即:

     value="<?php if ($_POST['name']) { echo htmlspecialchars($_POST['name']); } ?>"
    

    另请参阅:htmlspecialchars()htmlentities()

    【讨论】:

    • 感谢您的提示。立即做出改变。
    【解决方案2】:

    永远不要相信用户输入,有些人可能会插入可能会损害您的系统或类似的东西的 javascript 代码,这就是为什么您容易受到跨站点脚本的攻击,清理使用此功能发布的输入:

    function xss_protect($data, $strip_tags = false, $allowed_tags = "\"\'") { 
    if($strip_tags) {
        $data = strip_tags($data, $allowed_tags . "<b>");
    }
    
    if(stripos($data, "script") !== false) { 
        $result = str_replace("script","scr<b></b>ipt", htmlentities($data, ENT_QUOTES,"UTF-8")); 
    } else { 
        $result = htmlentities($data, ENT_QUOTES, "UTF-8"); 
    } 
    
    return $result;
    }
    

    要使用该功能,例如使用:

    $code = xss_protect($_POST['code']); 
    

    【讨论】:

    • 您为什么觉得需要以特殊方式处理脚本?
    【解决方案3】:

    您应该使用一些良好的编程习惯,例如:

    初始化你的变量,这样,你总是有一些东西要打印,调试你会得到很多简单但令人讨厌的错误

    $name = false;
    $email = false;
    $message = false;
    $messagesubject = false;
    

    如果您正在获取新值,请修改您的数据,例如从 $_POST 您的情况。如果您这样做,如果特定字段没有数据,您的脚本可以避免一些工作,而且您可以更轻松地控制脚本流程和数据验证。

    if ( isset( $_POST['name'] ) !== false ) {
        // validate the content
        $name = process_you_choose_to_clean( $_POST['name'] );
    }
    if ( isset( $_POST['email'] ) !== false ) {
        // validate the content
        $name = process_you_choose_to_clean( $_POST['email'] );
    }
    if ( isset( $_POST['message'] ) !== false ) {
        // validate the content
        $name = process_you_choose_to_clean( $_POST['message'] );
    }
    if ( isset( $_POST['messagesubject'] ) !== false ) {
        // validate the content
        $name = process_you_choose_to_clean( $_POST['messagesubject'] );
    }
    

    尽量避免在你的 html 部分中出现混乱的代码,如果你处理好我之前提到的事情,这样的事情就可以完美地工作

    <input type="text" name="name" value="<?php { echo( $name ); } ?>" />
    

    关于消毒,请考虑提到的选项,并使用 PHP 的 filter_var 选项

    【讨论】:

    • 感谢您现在已修改,非常感谢您的帮助。
    猜你喜欢
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 2020-06-04
    • 2018-04-11
    • 2016-08-22
    • 1970-01-01
    • 2017-04-12
    相关资源
    最近更新 更多