Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php安全地将数据从Web表单插入MySql_Php_Mysql_Security - Fatal编程技术网

Php安全地将数据从Web表单插入MySql

Php安全地将数据从Web表单插入MySql,php,mysql,security,Php,Mysql,Security,我正在学习php,并一直在学习OOP创建数据类教程 在本教程中,他们从帖子中获取表单数据并将其插入数据库 代码如下: 步骤1:表格 <h2>New Topic</h2> <form action="add.php" method="POST"> <label> Title: <input type="text" name="title"> </label> <br>

我正在学习php,并一直在学习OOP创建数据类教程

在本教程中,他们从帖子中获取表单数据并将其插入数据库

代码如下:

步骤1:表格

<h2>New Topic</h2>
<form action="add.php" method="POST">
    <label>
        Title: <input type="text" name="title">
    </label>
    <br>
    <label>
        Description:
        <br>
        <textarea name="description" cols="50" rows="20"></textarea>
    </label>
    <br>
    <input type="submit" value="Add Topic">
</form>
我的问题是关于安全的。在将此数据插入数据库之前,通过filter_input()函数运行表单的每个字段不是最佳做法吗?这些也应该通过filter_var()运行吗

如果这是必要的,那么过滤代码会是什么样子


谢谢

TopicData.php文件正在使用准备好的SQL查询。使用准备好的查询的好处是,如果SQL查询不基于外部输入,那么它就消除了SQL注入的可能性。使用准备好的查询时,查询模板与数据分开发送。这有许多好处,如下所述:


它消除了对表单数据进行清理的需要。但是,如果需要验证,例如最大字符串长度、最大值和最小值等,则可能仍需要使用filter_var函数对表单数据进行过滤。

过滤的唯一原因是您对任何特定字段中的内容都有限制。你对标题或描述的内容有什么限制吗?@tadman-我对标题或描述没有限制。然而,我的印象是,为了安全起见,我从不直接访问$\u Post始终使用filter\u input()函数。此处描述:。那篇文章可能是石器时代的,但也不全是错的。问题是您需要约束到一个类型,比如整数、浮点或电子邮件,但是对于普通的旧字符串,它更复杂。什么是“有效”?您通常需要在代码中更具体地定义它。如果您关心验证,并且有一个标准化的方法来进行验证,那么大多数都有一个或多个系统来进行验证,举个例子,它有一个非常全面的方法,不仅是过滤,而且还验证最小长度和最大长度。@tadman谢谢你,你的回答非常有用。我希望我能找到一个用php构建简单web应用程序的教程provides@Nadir_Latif,您声明“只要SQL查询不基于外部输入”。你这是什么意思?另外,如果我对提交给MySQL的所有表单数据使用属性attr_emulate_prepares为false的PDO,这是防止sql注入的最佳方法吗?如果sql查询包含变量。例如:
“将$table\u name($field\u name1,$field\u name2)值($title\u value,$description)插入到$table\u name中”
,这样就增加了SQL注入的可能性。如果用户提交了查询中使用的其中一个变量,例如$table\u name或$title\u value,则用户可以向SQL查询中注入恶意代码。使用准备好的查询时,查询不应包含变量。相反,它应该使用占位符,例如:title或?正如您所做的。属性attr\u emulate\u prepares确定数据库驱动程序是否应始终使用模拟的准备语句。某些数据库驱动程序不支持准备好的语句。在这种情况下,PDO模拟准备好的查询,因此有一个用于访问数据库驱动程序的一致接口。您不必更改attr\u emulate\u的默认值
<?php
 require 'TopicData.php';

if (isset($_POST) && sizeof($_POST) > 0) {
    $data = new TopicData();
    $data->add($_POST);
}
?>
public function add($data)
{
    $query = $this->connection->prepare(
        "INSERT INTO topics (
            title,
            description
        ) VALUES (
            :title,
            :description
        )"
    );

    $data = [
        ':title' => $data['title'],
        ':description' => $data['description']
    ];

    $query->execute($data);
}