Php安全地将数据从Web表单插入MySql
我正在学习php,并一直在学习OOP创建数据类教程 在本教程中,他们从帖子中获取表单数据并将其插入数据库 代码如下: 步骤1:表格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>
<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);
}