SQL 使用引數化查詢如何防止SQL隱碼攻擊|極客教程
(4 封私信 / 80 條訊息) 為什麼引數化SQL查詢可以防止SQL隱碼攻擊? - 知乎
關鍵字:引數化查詢
程式碼片段
def execute(self, query, vars=None): # real signature unknown; restored from __doc__ """ execute(query, vars=None) -- Execute query with bound vars. """ pass # 1 select_sql = f"select * from tb_admin where role = '{role_id}';" cursor.execute(select_sql) # 2 select_sql = f"select * from tb_admin where role = %s;" cursor.execute(select_sql, (role_id, ))
程式碼1 存在sql注入風險
程式碼2 不存在風險
===========
分析(根據上述文章連結做的小結,會有資訊丟失,僅供參考):
輸入引數 1' or '1'='1
程式碼2使用了引數化查詢,會預編譯,把輸入引數包裹成一個字串;程式碼1不會
用sql解釋
程式碼1:select * from tb_admin where role = '1' or '1'='1'; 所以會有風險
程式碼2:select * from tb_admin where role = "1' or '1'='1'';