簡體   English   中英

在PHP中的Mysqli查詢中指定ID

[英]Specifying ID in Mysqli query in php

我正在CMS網站上工作,我將博客文章存儲在數據庫中。 我可以創建,編輯和刪除它們。 但是,當我要編輯它們時出現問題。 我無法在更新查詢中指定WHERE子句以匹配我要編輯的博客文章的ID!

假設我有一個ID為'5'的博客文章。 如果我為此編寫代碼,則它的工作方式與應有的方式完全相同。

 $sqledit = "UPDATE paginas SET message='$_POST[message]' WHERE id= $_POST[id]";

但是我不想只編輯博客文章5,我想編輯我要更新的博客文章。 在我看來這應該可行,

WHERE id= $_POST[id]";

...但事實並非如此。

這只是拋出一個未定義的id錯誤。 但這不應該,因為我可以使用以下特定代碼以完全相同的方式刪除博客文章:

$sqldel = "DELETE FROM `paginas` WHERE id= $_POST[id]"; 

這確實允許我這樣做。

下面的代碼在博客頁面上,edit查詢位於其自己的edit.php頁面中

        if (isset($_POST['edit'])) // if pressed, execute

        {  
        echo

        '<br><br>  <div class="blogscript">
         <form action="edit.php" method="post">Edit your stuff<br>          
        <input type="text" placeholder='. $pagetitle . ' ><br><br>          
        <textarea id="message2" name="message">&lt;p&gt;' . $message . '&lt;/p&gt;</textarea><br>           
        <input type="submit" name="editsubmit" value="Confirm" />
        <input type="hidden" name="id" value="' . $id . '">.            </form></div>';
        }           

我期待任何嘗試的技巧。

編輯:

這是我的edit.php頁面

<?php
  $DB_host = "localhost";
  $DB_user = "root";
  $DB_pass = "";
  $DB_name = "cmsbase";

  $MySQLi_CON = new MySQLi($DB_host,$DB_user,$DB_pass,$DB_name);

     if($MySQLi_CON->connect_errno)
     {
         die("ERROR : -> ".$MySQLi_CON->connect_error);
     }


     $sql = "UPDATE paginas SET message='$_POST[message]' WHERE id= $_POST[id]";

    if ($MySQLi_CON->query($sql) === TRUE) {
    echo "";
    } else {
    echo "Error: " . $sql . "<br>" . $MySQLi_CON->error;
    }
    $MySQLi_CON->close(); //close connection


    echo "<script>alert('Edited');location.href='index.php';</script>";

?>

編輯:這就是var_dump包含的內容 這就是var_dump所說的

為了使值出現在$_POST ,您需要在表單中包含一些元素(例如<input><select><textarea> ),並且將name屬性設置為所需的$_POST鍵。

您可以在表單中為ID添加隱藏的輸入。

<input type='hidden' name='id' value='" . $id . "'>

假設您通過從數據庫中進行選擇來獲取該表單代碼中顯示的$message變量,那么您也應該能夠從中獲取ID,或者如果可能的話,也可以從$_GET獲取ID,如果這是您確定顯示哪個帖子的方式。

(雖然這實際上不是答案,但我想說的內容不適合評論)

你的線

 $sql = "UPDATE paginas SET message='$_POST[message]' WHERE id= $_POST[id]"; 

太恐怖了。 這就是噩夢。 可以說,表單中的POST數據是從某個地方的某個機器人的腳本中發布的,因為我敢肯定您不會在代碼中阻止XSRF

如果該腳本選擇發布該怎么辦:

$_POST ==> array => message = "mwahahaha";
                 => id      = "1; DROP TABLE paginas;"

您可能會想:“他們怎么知道我的表名?” ,但是很容易從其他惡意ID插入或其他輸入點上的其他hack中找到,這些輸入會產生SELECT結果,並且許多表具有通用名稱,例如“ users ” /“ orders ” /“ baskets ” /“ touch-me ”等。(好的,也許不是我,但您明白了。)

可以使用Mysqli_real_escape_string()但這僅可轉義引號和特殊字符,但不會減輕SQL注入和損害。

那你該怎么辦?

在這種情況下,我想提請您注意PHP類型的雜耍 與許多其他語言不同,PHP隱含了數據類型,而不是特定的數據類型,因此, "1.06"數據類型也可以是string 並且也可以使其成為float

在MySQL中,您的id參數很可能是數字整數值,那么如何確定$_POST['id']值也是整數而不是SQL指令

$id = (int)$_POST['id'];

這會強制將值設為整數,因此

$id = (int)"1; DROP TABLE paginas;";

實際上作為$id = 1 因此,可以在您的網站,數據庫和聲譽中為您節省許多受損的表,垃圾郵件行和其他有害的垃圾。

請采納以下概念:

永遠不要相信任何用戶提交的代碼。

永遠

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM