如何正确地从用户输入到HTML表单?

时间:2017-05-05 22:04:11

标签: php html mysql

我有一个托管在000webhost上的简单网站,它由index.html和register.php组成。我现在有一个功能注册系统,允许用户输入信息,并让数据库查询信息。

在000webhost上,在public_html中我有: php:register.php, .htaccess, 的index.html

index.html只包含一个链接到注册页面的按钮,register.php包含:

<?php

session_start();

if (isset($_POST['register_btn'])){
    if ($_POST['email1'] != $_POST['email2']){
        exit("Emails did not match.");
    }

    //connect to database
    $connect = mysqli_connect("localhost", "someUser", "somepassword", "somedb");
    if(mysqli_connect_error()){
        echo mysqli_connect_error();
        exit();
    }

    //write the paramaterized query
    $query = "INSERT INTO test_table(username, email) VALUES(?, ?)";

    //prepare the statement
    $stmt = mysqli_prepare($connect, $query);

    if ($stmt){
        //bind
        mysqli_stmt_bind_param($stmt, 'ss', $_POST['username'], $_POST['email']);

        //execute the query
        mysqli_stmt_execute($stmt);

    } else{
        echo "Error creating statement object";
    }

}

?>

<!DOCTYPE html>
<html>
<head>
    <title>Register</title>
</head>
<body>
    <div class="header">
        <h1>Register</h1>
    </div>

    <form method="post" action="register.php">
        <table>
            <tr>
                <td>Username:</td>
                <td><input type="text" name="username" class="textInput"></td>
            </tr>
            <tr>
                <td>Email:</td>
                <td><input type="text" name="email1" class="textInput"></td>
            </tr>
            <tr>
                <td>Re-enter Email:</td>
                <td><input type="text" name="email2" class="textInput"></td>
            </tr>
            <tr>
                <td></td>
                <td><input type="submit" name="register_btn" value="Register"></td>
            </tr>
        </table>
    </form>
</body>
</html>

修改 将问题的焦点从正确的密码注册更改为简单的数据输入。

1 个答案:

答案 0 :(得分:1)

这里出了很多问题,但我并不是故意要责备你。许多让PHP流行的东西,比如它对共享托管服务提供商的长期支持以及它如何易于上手和开展,也是一个巨大的责任:很多那里有危险的旧建议,很多教程都是由那些真不知道自己在做什么的人写的。这是一个导航的雷区,特别是如果你以前从未做过这样的事情。

为了支持所有这些,您可以使用development framework来展示现代PHP编码实践。其中最好的组织代码,以便在Web根目录中有非常少量的原始PHP代码,即公众可访问的文件。许多人只有一个存根,index.php,所有内容都通过。实质上,所有其他URL都是通过路由伪造的。没有文字文件来支持它们。这很好,因为它将URL与文件链接分离,而是将它们转换为抽象资源。

这就是他们如何设法防止应用程序代码泄露:公共Web根目录中的代码设计极其简单。如果您的服务器由于某种原因而最终配置错误并开始将.php文件作为原始源文件喷出而没有任何损害,他们得到的只是该类型的每个应用程序附带的样板index.php存根。没有凭据,没有数据库配置信息,没有。

Laravel是一个很好的学习示例,它甚至包含authentication system,因此无需编写自己的代码。在这种情况下,database config只是一个普通的PHP文件,但其他系统使用JSON,YAML或老式的INI文件。

这里最大的问题是使用字符串插值来编写查询。如果你犯了一个错误,忘记逃避某些事情,你将打开一个巨大的SQL注入漏洞。从那里可能有人可以将任意SQL代码注入您的站点,并且随之而来,抓住整个数据库或更糟糕的是,如果数据库在同一物理上运行,也可以下载应用程序的代码机。

至少使用像PDO这样的东西。更好的是,使用ORM将数据库操作封装在一个更容易使用的面向对象的包装器中。 DoctrinePropelEloquent都是这些的好例子。

最重要的一点是,如果您只使用核心PHP从头开始构建,那么在2017年建立一个安全的网站并不容易。需要考虑的事项很多:CSRF,XSS,SQL注入,密码哈希,电子邮件验证,密码猜测速率限制,缓存,数据库迁移以及许多其他内容。完全理解并实施这些可能数月的任何一个的连贯战略。它超出了单个开发人员的实际范围,但我鼓励你至少在学术层面理解它们,理论和每个理论的含义。

PHP很幸运,它有很多非常好的,支持良好的框架,有各种各样的形式。找一个你真正喜欢的,学习得很好,并将它用于你的项目。您将能够专注于编写使您的应用程序独一无二的代码,而不是浪费大量时间来严重重新实现轮子。