[英]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"><p>' . $message . '</p></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>";
?>
為了使值出現在$_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.