亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我可以在準備好的語句中參數化表名嗎?

我可以在準備好的語句中參數化表名嗎?

慕森王 2019-06-01 15:53:55
我可以在準備好的語句中參數化表名嗎?我多次使用mysqli_stmt_bind_param函數。但是,如果我將試圖防止SQL注入的變量分開,則會遇到錯誤。下面是一些代碼示例:function insertRow( $db, $mysqli, $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol ){     $statement = $mysqli->prepare("INSERT INTO " .$new_table . " VALUES (?,?,?,?,?,?,?);");     mysqli_stmt_bind_param( $statment, 'sssisss', $Partner, $Merchant, $ips, $score, $category, $overall, $protocol );     $statement->execute();}是否可以某種方式替換.$new_table.與另一個問號語句連接,創建另一個BIND參數語句,還是添加到現有語句中以防止SQL注入?像這樣或某種形式的:function insertRow( $db, $mysqli, $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol ){         $statement = $mysqli->prepare("INSERT INTO (?) VALUES (?,?,?,?,?,?,?);");     mysqli_stmt_bind_param( $statment, 'ssssisss', $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol );     $statement->execute();}
查看完整描述

2 回答

?
阿晨1998

TA貢獻2037條經驗 獲得超6個贊

對你問題的簡短回答是“不”。

在最嚴格的意義上,在數據庫級別上,準備語句只允許將參數綁定到SQL語句的“值”位。

其中一種思維方式是“在運行時執行語句時可以替換的東西,而不改變其含義”。表名不是這些運行時值之一,因為它決定SQL語句本身的有效性(即哪些列名是有效的),并且在執行時更改它可能會改變SQL語句是否有效。

在稍高的級別上,即使在模擬已準備好的語句參數替換而不是實際將準備好的語句發送到數據庫(例如PDO)的數據庫接口中,PDO允許您在任何地方使用占位符(因為占位符在發送到這些系統中的數據庫之前被替換),表占位符的值將是一個字符串,并將其封裝在發送到數據庫的SQL中,因此SELECT * FROM ?帶著mytable因為Param最終會發送SELECT * FROM 'mytable'到數據庫,這是無效的SQL。

你最好的選擇就是繼續

SELECT * FROM {$mytable}

但是你絕對一點兒沒錯應該有一個表的白名單,如果是這樣的話,應該首先對照這些表進行檢查。$mytable來自用戶輸入。


查看完整回答
反對 回復 2019-06-01
?
慕村9548890

TA貢獻1884條經驗 獲得超4個贊

當嘗試創建“數據庫”時,同樣的規則也適用。

不能使用準備好的語句綁定數據庫。

即:

CREATE DATABASE IF NOT EXISTS ?

不會起作用的。代之以安全員。

附帶說明:我添加了這個答案(作為一個社區wiki),因為它通常用來結束問題,一些人在試圖綁定一個數據庫而不是一張桌子和/或一列。


查看完整回答
反對 回復 2019-06-01
  • 2 回答
  • 0 關注
  • 820 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號