【问题标题】:Trying to protect my SQL queries from injection attack and not having any luck试图保护我的 SQL 查询免受注入攻击并且没有任何运气
【发布时间】:2019-03-11 19:07:39
【问题描述】:

我在这里阅读了几篇文章,并逐字逐句地按照查询进行操作(减去我的变量名),但我无法让我的代码在我正在处理的网站上运行而不会出现错误。我所拥有的只是一个用户可以上传图片的表单。

我的原始代码易受攻击但有效:

<?php
  $uploadDir = 'images/';


  if(isset($_POST['upload']))
  {
    $fileName = $_FILES['userfile']['name'];
    $tmpName = $_FILES['userfile']['tmp_name'];
    $fileSize = $_FILES['userfile']['size'];
    $fileType = $_FILES['userfile']['type'];
    $memberID = $_POST['member-id'];
    $imgTitle = $_POST['img-title'];
    $catID = $_POST['catID'];

    $filePath = $uploadDir . $fileName;

    $result = move_uploaded_file($tmpName, $filePath);

    if (!$result) {
      echo "Error uploading file";
      exit;
     }

    echo "<br>Files uploaded<br>";

    if(mysqli_connect_errno())
     {
       printf("Connect failed: %s\n", mysqli_connect_error());
       exit();
     }

     if(!get_magic_quotes_gpc())
        {
         $fileName = addslashes($fileName);
         $filePath = addslashes($filePath);
        } 


       $query = "INSERT INTO `tblImage` (`fldImageID`, `fldMemberID`, `fldCatID`, `fldFilePath`, `fldName`) VALUES (NULL, '$memberID', '$catID', '$filePath', '$imgTitle')";

        $query = "SELECT `fldImageID` FROM `tblImage` ORDER BY `fldImageID` DESC LIMIT 1";


        $result = $conn->query($query) or die ("error");

 }

?>

然后下面是我尝试执行准备好的语句但没有运气的地方,请有人指出我的错误是我只粘贴了下面的代码,它覆盖了上面 $query 开始的代码......

    $stmt = $conn->prepare = ("INSERT INTO tblImage (fldImageID, fldMemberID, fldCatID, fldFilePath, fldName) VALUES (NULL, ?, ?, ?, ?)");

    $stmt->bind_param($stmt, "ssss", $memberID, $catID, $filePath, $imgTitle); 
    mysqli_stmt_execute($stmt);
    $stmt->execute();
    $result = mysqli_stmt_get_result($stmt) or die ("error");

网页上的错误信息:

【问题讨论】:

  • 你执行了两次。删除mysqli_stmt_execute($stmt);
  • 如果您坚持使用 Proceedural 或 OO 调用范式,那就容易多了。如果你混合,你最终会感到困惑
  • 另外$stmt = $conn-&gt;prepare = 应该是$stmt = $conn-&gt;prepare("....") 那里不需要=
  • 嗨@RiggsFolly 啊,我没有意识到我在混合它们,我在这里看到了一个非常高投票的答案,并试图遵循该声明。即使删除了执行重复,似乎也不喜欢它不能通过引用传递参数2
  • 见评论 3。或@LajosArpad 回答

标签: php sql phpmyadmin


【解决方案1】:

你有一个额外的价值分配:

$stmt = $conn->prepare = ("INSERT INTO tblImage (fldImageID, fldMemberID, fldCatID, fldFilePath, fldName) VALUES (NULL, ?, ?, ?, ?)");

只需删除该运算符:

$stmt = $conn->prepare("INSERT INTO tblImage (fldImageID, fldMemberID, fldCatID, fldFilePath, fldName) VALUES (NULL, ?, ?, ?, ?)");

【讨论】:

  • 谢谢@LajosArpad 我完全错过了第二个作业!虽然看起来还是不太喜欢.."Cannot pass parameter 2 by reference"
  • 是在同一行吗?
  • @K.Haydock 我认为你不应该传递 $stmt,因为这是对象级调用,不需要它。你应该有类似的东西: $stmt->bind_param("ssss", $memberID, $catID, $filePath, $imgTitle);
  • 就是这样!!顺便说一句,你们都是天才!感谢您的所有时间:-)
  • 最后一件事,一旦文件成功上传,页面的其余部分将不再出现,你知道我是否需要在某个地方重定向标题? :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 2020-05-12
相关资源
最近更新 更多