RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1218184
Accepted
Arcadiy
Arcadiy
Asked:2021-12-13 22:59:50 +0000 UTC2021-12-13 22:59:50 +0000 UTC 2021-12-13 22:59:50 +0000 UTC

如何避免查询中的错误和 sql 注入?

  • 772

以下是数据的处理方式

<?php
include_once 'db.php';

if (isset($_POST['add'])) {

// преобразуем специальные символы в текст

$name = htmlspecialchars($_POST['name']);
$text = htmlspecialchars($_POST['text']);
$message = htmlspecialchars($_POST['message']);
$rating = htmlspecialchars($_POST['rating']);

// заносим данные из формы в переменные и проверяем на ошибки

$name = strip_tags(trim($_POST['name']));
$text = strip_tags(trim($_POST['text']));
$message = strip_tags(trim($_POST['message']));
$rating = strip_tags(trim($_POST['rating']));
$date = $_POST['date'];

// заносим дату и время отзыва
$date = date('Y-m-d H:i');

// проверка введенных данных

if($name != '' AND $text != '' AND $message != '')

// отправка данных в бд

mysqli_query($link, " INSERT INTO Otzivy2 (name, text, message, date, rating) VALUES ('$name', '$text', '$message', '$date', '$rating')");
$to      = 'почта';
$subject = 'review';
$message = "Текст отзыва: " . $_POST['message'] . "\nОт: " . $_POST['text'] . " " . $_POST['email'] . "\nВремя: " . date("d.m.Y - H:i");
$headers = array(
    'From' => 'почта',
    'Reply-To' => 'почта',
    'X-Mailer' => 'PHP/' . phpversion()
);

mail($to, $subject, $message, $headers);
}




// закрываем сеанс


include_once 'clear.php';
include_once 'form.php';

?> 
php
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Ипатьев
    2021-12-13T23:17:48Z2021-12-13T23:17:48Z

    为了永久避免传递给请求的数据出现任何问题,无论是错误还是站点黑客攻击,任何数据都应始终与请求分开传输到数据库。这是使用准备好的,或者也称为参数化查询来完成的。

    在 mysqli 中,要执行参数化查询,需要执行 4 个步骤:

    • 用称为占位符或参数的特殊标记替换请求中的所有变量,但实际上 - 只是问号
    • 使用 prepare() 函数准备执行请求。此函数接受查询字符串并返回特殊类 mysqli_stmt 的实例,使用该实例执行所有进一步的操作
    • 使用 bind_param() 将变量绑定到请求。这是一个非常有趣的功能。它将所有应包含在请求中的变量作为参数,其顺序与请求中的占位符相同。但除此之外,所有变量的类型必须首先在此函数中指定为字符串,其中变量的类型由单个字母表示。也就是说,这一行中的字母应该与进一步的变量一样多。幸运的是,您不必太担心类型并为所有变量指定类型“s”。
    • 使用 execute() 执行查询。该函数不带参数执行

    用语言来说,这听起来很长,但在实践中,它并不是那么困难。但首先你需要正确编写数据库连接代码,这样俄罗斯字母就不会出现问题,并且数据库会报告所有错误:

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $db = new mysqli('127.0.0.1', '1', '1', 'vk2');
    $db->set_charset('utf8mb4');
    

    此代码应编写一次,最好在一个单独的文件中,然后将此文件包含在您需要使用数据库的其他脚本中。除了其他有用的东西,这段代码告诉 mysqli 在每次查询错误发生时生成一个 PHP 错误,以便可以跟踪和修复它。(注意:要查看错误本身,您需要相应地配置 PHP)

    之后,您可以继续实际执行请求。

    $sql = "INSERT INTO Otzivy2 (name, text, message, date, rating) VALUES (?,?,?,?,?)";
    $stmt = $link->prepare($sql);
    $stmt->bind_param("sssss", $name, $text, $message, $date, $rating);
    $stmt->execute();
    

    SELECT 查询也是如此。只是为了得到查询的结果,还需要执行一个命令——get_result()。

    例如

    $sql = "SELECT * FROM Otzivy2 LIMIT ?,?";
    $stmt = $db->prepare($sql);
    $stmt->bind_param("ss", $start, $num);
    $stmt->execute();
    $result = $stmt->get_result(); // получаем result
    

    然后像往常一样 fetch or while

    • 8

相关问题

  • mysqli 类的对象无法转换为字符串

  • 您的系统中缺少 ext-http *,您的系统中缺少 ext-mysql_xdevapi *

  • 如何从csv中删除bom?

  • 当我按下 Enter 键时,如何让 PhpStorm 的 Emmet 插件触发,就像 VS Code 一样?

  • 注释在 Symfony5 中不起作用

  • 搜索最近的地理位置点

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5