【问题标题】:Php Insert Data To MySql From Web Form SecurelyPHP 从 Web 表单安全地将数据插入到 MySql
【发布时间】:2017-12-09 19:42:14
【问题描述】:

我正在学习 php,并且一直在关注 phpbridge.org 的 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>

第 2 步 PHP 文件

<?php
 require 'TopicData.php';

if (isset($_POST) && sizeof($_POST) > 0) {
    $data = new TopicData();
    $data->add($_POST);
}
?>

第 3 步

TopicData.php中包含的函数

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);
}

我的问题是关于安全性的。在将此数据插入数据库之前,通过 filter_input() 函数运行表单的每个字段不是最佳做法吗?这些也应该通过 filter_var() 运行吗?

如果有必要,过滤器代码到底是什么样的?

谢谢!

【问题讨论】:

  • 您过滤的唯一原因是您是否对任何特定领域的内容有限制。您对标题或描述可以包含的内容有任何限制吗?
  • @tadman - 我对标题或描述没有限制。但是,我的印象是永远不要直接访问 $_Post 以确保安全始终使用 filter_input() 函数。这里描述:。 phparch.com/2010/07/never-use-_get-again
  • 那篇文章可能来自石器时代,但也不全是错误的。问题是你需要限制一个类型,比如整数、浮点数或电子邮件,但对于普通的旧字符串,它更复杂。什么是“有效”?您通常需要在代码中更具体地定义它。
  • 如果您关心验证并有一个标准化的方法来做这件事,大多数development frameworks 都有一个或多个系统来做这件事。例如,Laravel 有一个相当全面的data validation system,它不仅可以过滤,还可以验证最小和最大长度等内容。
  • @tadman 谢谢你的回复很有帮助。我希望我能找到一个使用 php 构建一个简单的 Web 应用程序的教程,该教程提供

标签: php mysql security


【解决方案1】:

TopicData.php 文件正在使用准备好的 SQL 查询。使用准备好的查询的好处是它消除了 SQL 注入的可能性,前提是 SQL 查询不基于外部输入。使用准备好的查询时,查询的模板与数据分开发送。这有很多好处,这里描述:https://www.w3schools.com/php/php_mysql_prepared_statements.asp

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

【讨论】:

  • @Nadir_Latif,您说“只要 SQL 查询不基于外部输入。”。你是什​​么意思?另外,如果我使用带有属性 attr_emulate_prepares 的 PDO,提交给 MySQL 的所有表单数据为 false,那是否是防止 sql 注入的最佳方法?
  • 如果 SQL 查询包含变量。例如:"INSERT INTO $table_name ($field_name1, $field_name2) VALUES ($title_value, $description)",则增加了 SQL 注入的可能性。如果查询中使用的变量之一,例如 $table_name 或 $title_value 是由用户提交的,那么他可以将恶意代码注入 SQL 查询。使用准备好的查询时,查询不应包含变量。相反,它应该使用占位符,例如 :title 或 ?就像你做的那样。
  • 那么属性 attr_emulate_prepares 决定了数据库驱动程序是否应该总是使用模拟的预处理语句。一些数据库驱动程序不支持准备好的语句。在这种情况下,PDO 模拟准备好的查询,因此有一个用于访问数据库驱动程序的一致接口。您不必更改 attr_emulate_prepares 的默认值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-13
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 2023-03-16
  • 1970-01-01
相关资源
最近更新 更多