如何清理和验证联系表单以便在屏幕上打印并通过电子邮件发送

时间:2012-05-23 20:22:27

标签: php html forms security validation

我想知道这些预防措施是否足够。

我的index.php

中有一个这样的html表单
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
    <select name="Alimento">
        <option value="someValue">An option</option>
    </select>
    Nombre*:<?php echo $error['name'];?><br /><input type="text" name="fname" value="<?php echo $name; ?>"/><br />
    Mail*:<?php echo $error['mail'];?><br /><input type="text" name="mail" value="<?php echo $mail; ?>"/><br />
    <input id="botonComprar" type="image" src="img/comprar.png" name="submit" width="126" height="42">
</form>

现在我在文件的顶部:

if($_SERVER['REQUEST_METHOD'] == "POST") {
    $alimento = filter_input(INPUT_POST, 'Alimento', FILTER_SANITIZE_SPECIAL_CHARS);
    $name = filter_input(INPUT_POST, 'fname', FILTER_SANITIZE_SPECIAL_CHARS);
    $mail    = filter_input(INPUT_POST, 'mail', FILTER_VALIDATE_EMAIL);

    if($name == '') {
        $error['name'] = '<span class="errorMsg"> Ingrese su nombre</span>';

    }
    if($mail == '') {
        $error['mail'] = '<span class="errorMsg"> Ingrese su mail</span>';
    }
    if($phone == '') {
        $error['phone'] = '<span class="errorMsg"> Ingrese su tel&eacute;fono</span>';
    }
...

我后来做了:

if(empty($error)){
    mail($mail, $subject, $alimento, $headers);
}

这当然是简化的,但它显示了它的要点。

所以我的问题是:

  • 我的代码中是否有任何我忽略的漏洞?
  • 变量是否安全回应,如表格中的值?
    • 我做了以上操作以避免填写输入丢失,这种方法是否正确?
  • 电子邮件是否经过适当验证?有没有办法可以利用邮件功能?
  • 我是否应该htmlspecialchars使用$alimento$name
    • 有没有理由使用其他电子邮件验证技术?

1 个答案:

答案 0 :(得分:0)

  

我的代码中有没有忽略任何重大漏洞?

这里有很多XSS漏洞。值得注意的是,<form action="<?php echo $_SERVER['PHP_SELF'];?>"是一种反射型XSS攻击媒介(可能与社会工程结合使用)。

此外,在mail($mail, $subject, $alimento, $headers);中,如果根据用户输入提供了$headers,您可能会发现自己容易受到remote code execution的攻击。<​​/ p>

  

我应该为htmlspecialchars$alimento使用$name吗?

是的,在输出而不是输入上使用ENT_QUOTES | ENT_HTML5而不是默认值。