将 Json 文件加载到 Table 时出现不一致的结果

Having Inconsistent Results When Loading Json File to a Table

我很难理解为什么我在尝试将 JSON 文件数据插入新 table 时得到的结果。问题是一个 JSON 文件可以正常工作并填充 table 而另一个 JSON 文件则不能。我正在使用 Xampp phpadmin,但我不知道为什么我的问题仍然存在。 table 的创建适用于任何 JSON 文件,但数据的插入是主要问题。

php 文件:

include("dbCon.php");

$fname=$_POST['fname'];

if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}
  $sql = "CREATE TABLE `".$fname."`(
  id bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  title VARCHAR(255) NOT NULL,
  imgurl VARCHAR(255) NOT NULL,
  content VARCHAR(20000) NOT NULL
  )";

  if ($conn->query($sql) === TRUE) {
     echo "Table ".$fname." created successfully";
  } else {
     echo "Error creating table: " . $conn->error;
  }

  $json = file_get_contents('../jsonFIle/'.$fname.'.json');
  $array = json_decode($json, true);

  echo var_dump($fname);
  foreach($array as $row) {
   $sql = "INSERT INTO `".$fname."`(title, imgurl, content) VALUES('".$row["title"]."', '".$row["imgurl"]."', '".$row["content"]."')";
   mysqli_query($conn, $sql);
 
  }
  echo var_dump($array);

    
$conn->close();

Json 文件: test.json

[
        {
            "title":"test1", 
            "imgurl":"test1",
            "content":"test1"
        },
        {
            "title":"test2", 
            "imgurl":"test2",
            "content":"test2"
        },
        {
            "title":"test3", 
            "imgurl":"test3",
            "content":"test3"
        }
]

Json 文件: newmainnews.json

[
        {
            "title":"NASA's record-breaking Lucy asteroid mission gearing up for October launch", 
            "imgurl":"record.jpg",
            "content":"Lucy is scheduled to launch atop a United Launch Alliance Atlas V rocket from Florida's Cape Canaveral Space Force Station on Oct."
        },
        {
            "title":"Mars on the cheap: Scientists working to revolutionize access to the Red Planet", 
            "imgurl":"mars.jpg",
            "content":"Spotting Jupiter is a breeze this week for the naked eye as it reaches its biggest and brightest moment in the night sky. Telescope-hunters will also get a treat looking for moons and atmospheric bands. The gas giant planet will be at opposition today (Aug. 19), meaning it is directly opposite the sun in Earth's sky. Jupiter also makes its closest approach of the year to Earth during opposition. The planet will appear at magnitude -2.9, well within naked-eye range and outshining any star in Earth's sky except, of course, for the sun."
        },
        {
            "title":"Jupiter's winds of change show increased storm speeds in Great Red Spot", 
            "imgurl":"jupiter.jpg",
            "content":"The long-running telescope has been studying the Great Red Spot — a major storm on Jupiter — that is shrinking for mysterious reasons. Alongside that, researchers just uncovered huge changes in wind speeds within the massive storm.Jupiter takes 12 Earth years to orbit the sun. During the Jovian year between 2009 and 2020."
        }
]

test.json的var_dump回显:

array(3) { [0]=> array(3) { ["title"]=> string(5) "test1" ["imgurl"]=> string(5) "test1" [" content"]=> string(5) "test1" } [1]=> array(3) { ["title"]=> string(5) "test2" ["imgurl"]=> string(5) "test2 " ["content"]=> string(5) "test2" } [2]=> array(3) { ["title"]=> string(5) "test3" ["imgurl"]=> string(5 ) "test3" ["content"]=> string(5) "test3" } }

newmainnews.json的var_dump回显:

array(3) { [0]=> array(3) { ["title"]=> string(74) "NASA 的 record-breaking 露西小行星任务准备在 10 月发射" ["imgurl "]=> string(10) "record.jpg" ["content"]=> string(130) "Lucy 计划从佛罗里达州卡纳维拉尔角搭乘联合发射联盟阿特拉斯 V 型火箭发射 Space Force十月站。” } [1]=> array(3) { ["title"]=> string(79) "便宜的火星:科学家们致力于彻底改变进入红色星球的途径" ["imgurl"]=> string(8) " mars.jpg" ["content"]=> string(539) "本周用肉眼观测木星是 breeze,因为它在夜空中达到最大最亮的时刻。Telescope-hunters 也将得到寻找卫星和大气带的待遇。这颗气态巨行星今天(8 月 19 日)将处于冲日状态,这意味着它在地球天空中正对着太阳。木星也是一年中最接近地球的地方在冲日期间。这颗行星的星等为 -2.9,正好在 naked-eye 范围内,比地球天空中的任何恒星都亮,当然,太阳除外。” } [2]=> array(3) { ["title"]=> string(71) "木星的变化之风显示大红斑的风暴速度增加" ["imgurl"]=> string(11) "jupiter.jpg" ["content"]=> string(327) "long-running telescope 一直在研究大红斑——木星上的一场大风暴——由于神秘的原因正在缩小。除此之外,研究人员刚刚发现巨大的 storm.Jupiter 绕太阳公转需要 12 个地球年。在 2009 年到 2020 年之间的木星年期间,风速发生了巨大变化。 } }

test.json 文件正确填充了 table,但 newmainnews.json 没有插入任何内容。

我怀疑 JSON 文件有问题。无论哪种方式,就像我之前所说的那样,我完全一无所知,我们将不胜感激任何澄清或帮助。

此代码非常容易受到 SQL injection 的攻击,我相信这实际上是导致您出现问题的原因。

您的示例文件包含将 single-quotes (') 用作撇号的字符串。因为您使用基本的字符串连接来构造 SQL 查询,所以您生成了无效的 SQL,因为那些 single-quotes 成为查询的一部分。

例如,我们以第一项为例,但为了便于阅读示例,我将缩短它:

{
    "title":"NASA's Lucy asteroid mission", 
    "imgurl":"record.jpg",
    "content":"Lucy is scheduled to launch."
}

然后您尝试使用以下代码创建 SQL 查询:

$sql = "INSERT INTO `".$fname."`(title, imgurl, content) VALUES('".$row["title"]."', '".$row["imgurl"]."', '".$row["content"]."')";

生成的查询将如下所示:

INSERT INTO `newmainnews`(title, imgurl, content) VALUES ('NASA's Lucy asteroid mission', 'record.jpg', 'Lucy is scheduled to launch.')

现在,查看 VALUES 部分中的第一项。 Whosebug 的语法突出显示实际上在这里有所帮助。由于 NASA's 中的单引号,您正在创建无效的 SQL 因为第一个值实质上变成了 string "NASA" 后跟 s Lucy asteroid mission', MySQL 将解释为无效 SQL 因为单引号关闭了标题字符串的开头 .

如果您不熟悉 SQL 注入,这是最简单的情况之一,有人可以注入包含引号的字符串来关闭输入字符串,然后他们可以注入任意恶意 SQL代码。例如,如果您的一篇文章标题更改为:

{
   "title":"NASA','',''); DROP TABLE `newmainnews`; --",
   "imgurl": "",
   "content": ""
}

我没有测试它,但这应该会导致您的 table 被删除。

解决这个问题的方法是让自己熟悉转义输入并确保 不要盲目地获取输入字符串并将它们直接放在 SQL 中。我强烈建议您尝试使用 PDO prepared statements. If you are stuck using mysqli, I think you can also use prepared statements with that,但我对此知之甚少。

自己做一些额外的研究,谷歌搜索“准备好的陈述”和“how to prevent SQL injection”等主题。

对于想知道如何避免404 Not Found提到的注射的任何人。

foreach($array as $row) {
   $stmt = $conn->prepare("INSERT INTO `".$fname."`(title, imgurl, content) VALUES (?,?,?)");
   $stmt->bind_param("sss", $title, $imgurl, $content);
   $title = $row["title"];
   $imgurl = $row["imgurl"];
   $content = $row["content"];
   $stmt->execute();