有人可以将来自不同主机的表单数据发送到我的 PHP 脚本,该脚本将获取的数据插入 MySQL 吗?如果是这样,我们如何保护它?

Posted

技术标签:

【中文标题】有人可以将来自不同主机的表单数据发送到我的 PHP 脚本,该脚本将获取的数据插入 MySQL 吗?如果是这样,我们如何保护它?【英文标题】:Can someone send form data from different host to my PHP script which inserts fetched data into MySQL? If so, how can we secure it? 【发布时间】:2019-11-07 09:11:42 【问题描述】:

我想知道是否有人可以创建一个自动化脚本来将某种随机表单数据发送到我的 php 脚本,该脚本只是将接收到的表单数据插入 mysql 数据库?数据会被插入吗?我们如何保护它?

示例:我有一个 example.com/signup.php 脚本,它将收到的表单数据插入 MySQL 数据库。是否有人可以将表单数据从不同的主机发送到 example.com/signup.php 脚本,例如 localhost 或 domain-name.com?

例如,有人可以创建某种类似下面的代码,并继续在http://www.domain-name.com/signup.php 上插入数据,而不是在http://www.example.com/signup.php 上插入数据,提交时插入的数据会被插入数据库吗?

<form action="http://www.example.com/signup.php">
    <input type="text" name="username" placeholder="Username">
    <input type="password" name="password" placeholder="Password">
    <button type="submit" name="signup-btn">Signup!</button>
</form>

所以如果有机器人这样做,这样数据库就可以满了......

【问题讨论】:

你应该阅读Cross-Site Request Forgery (CSRF)。这将解释它是如何完成的(基本上只是直接发布到您的/signup.php-script)。然后,当你通读它时,搜索一些可以帮助你的库。如果您搜索它们,就会有很多。 Only accept AJAX $_GET or $_POST requests from specific page的可能重复 您好,如果我还有其他问题,我会告诉您。谢谢大家! 可以使用csrf-token解决。基础是:第一次加载带有表单的页面时,会生成一个随机令牌,并将其放入会话中。然后在表单中,将该标记添加到隐藏输入中。提交表单后,您检查您获得的令牌是否与会话中的令牌匹配。如果不是,则呼叫不是来自您的站点。如前所述,有许多非常好的库使这很容易实现。转到 packagist.org 并搜索“csrf”并做出选择。 在安全性方面,通常最好(并且推荐)使用久经考验的库,而不是推出自己的解决方案。即使是理论上“简单”的解决方案也很难获得 100% 正确(在谈论安全性时您想要这样做), 【参考方案1】:

我是***的新手,我对***编辑器不太熟悉

您可以在表单中设置特定的令牌

首先在表单页面顶部设置一个令牌会话

<?php
  session_start();
  $token = rand();
  $_SESSION['token'] = $token;
?>

<html>
  <body>
    <form action="http://www.example.com/signup.php">
     <input type="hidden" name="token" value="<?php echo $_SESSION['token'] ?>">
        <input type="text" name="username" placeholder="Username">
        <input type="password" name="password" placeholder="Password">
        <button type="submit" name="signup-btn">Signup!</button>
    </form>
  </body>
</html>

注册.php

  <?php
session_start();
      if(isset($_POST['token']) && $_POST['token'] == $_SESSION['token'])
      
        //piece of codes to insert into database
        
        
else
 echo "<script>window.location = 'example.com'</script>";

      ?>

【讨论】:

以上是关于有人可以将来自不同主机的表单数据发送到我的 PHP 脚本,该脚本将获取的数据插入 MySQL 吗?如果是这样,我们如何保护它?的主要内容,如果未能解决你的问题,请参考以下文章

我想将图像 URL 作为 json 数据上传到我的 Angular 表单并将其发送到服务器。图片 URL 来自服务器响应

为啥我的 php 没有将我的联系表单输入发送到我的电子邮件?

处理安全问题的基本php表单

PHP 电子邮件不会发送到我的电子邮件

如果我需要从gmail回复到我的php网站该怎么办?

如何将 ByteArray(来自 Flash)和一些表单数据发送到 php?