【问题标题】:Form Validation PHP / Avoiding injections表单验证 PHP / 避免注入
【发布时间】:2011-08-28 10:44:13
【问题描述】:

我在 HTML 中创建了一个表单(查询表单),该表单发布到以下代码:

<?php           
if(isset($_POST['submit']))

{
$name = mysql_real_escape_string((string)$_POST['name']);
$surname = mysql_real_escape_string((string)$_POST['surname']);
$email = mysql_real_escape_string((string)$_POST['email']);
$phone = mysql_real_escape_string((string)$_POST['phone']);
$country = mysql_real_escape_string((string)$_POST['country']);
$message = mysql_real_escape_string((string)$_POST['message']);

$sql = "INSERT INTO contact
       (name, surname, email, phone, country, message)
       VALUES('$name', '$surname', '$email', '$phone', '$country', '$message')";

mysql_select_db($db);
$retval = mysql_query( $sql, $conn )or die(mysql_error());

echo 'Thank you '.$name.' '.$surname.'. Your enquiry has been forwarded to our team. <br><br>Please check you email inbox for further information.<br><br>Return to homepage:<br><br><button class="search" onclick="/">Return to homepage</button>';

mysql_close($conn);
}

?>

我想知道,当输入无效或零数据时,如何显示错误并停止表单发布?

在学习如何在 Web 上创建表单的同时,我还听说过 SQL 注入。我受到保护了吗?

非常感谢您的帮助。

【问题讨论】:

    标签: php mysql forms validation


    【解决方案1】:

    我想知道如何在输入无效或零数据时显示错误并停止表单发布。

    您必须在if(isset($_POST['submit'])) 之后进行验证。例如,您可以检查名称是否为非空:

    if (empty($_POST['name'])) {
        $errors[] = 'name must not be empty';
    }
    

    对于更复杂的验证,例如验证电子邮件是否有效,您应该查看 filter extension

    $email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
    if (!$email) // invalid email
    

    在你所有的验证之后:

    if (!count($errors)) {
        // do the insert here
    }
    

    您可以在检测到错误后立即使用 while 块来中断:

    while (isset($_POST['submit'])) {
    
        if (empty($_POST['name'])) {
            $errors = 'name must not be empty';
            break;
        }
    
        // do the insert here
    
        break;
    }
    

    在学习如何在网络上创建表单的同时,我还听说了 sql 注入,我受到保护了吗?

    是的,只要您对嵌入 SQL 查询的任何内容进行转义(就像您正在做的那样),您就会受到保护。

    您应该尝试使用prepared statements,这样更安全、更易于使用。

    【讨论】:

    • ...只要您转义所有嵌入在 SQL 查询中的 字符串值,而不是变量。
    • @Col。弹片基本上所有提交的值都是字符串。数值 ("123") 和整数 (123) 之间存在差异。因此,除了转义字符串输入之外,我发现将 int 列的值转换为整数是一种很好的做法。
    • 我的意思是对于 SQL,唯一的字符串值是用引号括起来的值
    【解决方案2】:
    <?php           
    if(isset($_POST['submit']))
    {
    $errors = array();
    $name = !empty($_POST['name']) ? mysql_real_escape_string((string)$_POST['name']) : $errors[] = 'Name must not be empty';
    $surname = !empty($_POST['name']) ? mysql_real_escape_string((string)$_POST['name']) : $errors[] = 'User Name must not be empty';
    $email = !empty($_POST['email']) ? mysql_real_escape_string((string)$_POST['email']) : $errors[] = 'Email must not be empty';
    $phone = !empty($_POST['phone']) ? mysql_real_escape_string((string)$_POST['phone']) : $errors[] = 'Phone must not be empty';
    $country = !empty($_POST['country']) ? mysql_real_escape_string((string)$_POST['country']) : $errors[] = 'Country must not be empty';
    $message = !empty($_POST['message']) ? mysql_real_escape_string((string)$_POST['message'])  : $errors[] = 'Message must not be empty';
    
    if (empty($errors))
    {   
    if (preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email))
    {
        $sql = "INSERT INTO contact
       (name, surname, email, phone, country, message)
       VALUES('$name', '$surname', '$email', '$phone', '$country', '$message')";
    
        mysql_select_db($db);
        $retval = mysql_query( $sql, $conn )or die(mysql_error());
    
        echo 'Thank you '.$name.' '.$surname.'. Your enquiry has been forwarded to our team. <br><br>Please check you email inbox for further information.<br><br>Return to homepage:<br><br><button class="search" onclick="/">Return to homepage</button>';
    
        mysql_close($conn);
    }
    else {
        echo 'Invalid Email';   
    }
    }
    else
    {
    foreach ($errors AS $error) 
    {
        echo "$error<br />";    
    }
    }
    }
    

    ?>

    【讨论】:

    • 过早地对变量进行 sql-escape 是一种不好的做法。您甚至不应该为它们分配转义值(理想情况下,您应该使用准备好的语句)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多