看板 Python 關於我們 聯絡資訊
code在這 https://tinyurl.com/y68npkms 肥宅大叔最近在自學搞一個留言板 雖然功能測試起來目前看起來好像似乎大概沒問題 不過terminal會出現"POST /msg HTTP/1.1" 302 google說重新導向時會吐這訊息 這會有什麼問題嗎? 另外請教一下,圖片和縮圖存成檔案比較好還是塞進資料庫? 我現在做的是上傳後全塞進sqlite的資料庫 另問... id=123, kind="test" sql = f"select {kind} from table where id = {id}" cur.execute(sql) data=cur.fetchone()[0] 這樣傳回的data是我想要的 可是 sql = "select ? from table where id = ?" cur.execute(sql,(kind,id)) data=cur.fetchone()[0] 為什麼這樣只傳回"test"? 目前用做半套的處理 sql = "select {} from table where id = ? ".format(kind) cur.execute(sql,(id,)) -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.234.23.210 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1610191787.A.F68.html
ddavid: sql的問題,是不是這樣代入變成SELECT "test" FROM ..., 01/10 05:23
ddavid: test是被用常數字串的方式帶入了,所以行為會是找到一行符 01/10 05:24
ddavid: 合條件的就傳回一行"test" 01/10 05:24
ddavid: 類似我們常會用到 SELECT 1 FROM ... 的這個技巧 01/10 05:25
可是用select 1 from table...只會吐回一堆1...
TakiDog: 你寫redirect不就302 01/10 05:37
TakiDog: 還是你想回應什麼? 01/10 05:39
manmay: 如果想要知道server為啥有這樣行為,可以先讀http protoco 01/10 08:29
manmay: l 01/10 08:29
manmay: 了解一下通訊流程 01/10 08:29
有看沒有懂...XD
mychiux413: 第二種select會保護sql injection攻擊,請Google,事 01/11 00:04
mychiux413: 實上任何execute都該養成好習慣用法2,即套件內建的p 01/11 00:04
mychiux413: laceholder去做請求,而不應該自己去把query組出來, 01/11 00:04
mychiux413: 舉例來說,法1裡,kind="*"的話,你所有欄位就全暴露 01/11 00:04
mychiux413: 了 01/11 00:04
reddit有人遇到類似的情況 https://tinyurl.com/yypl85pf 變成要寫比較多行重覆的code stackoverflow上找到的資料 https://tinyurl.com/y68p7l3u column和table不能用方法2的方式... 不過這樣會有sql injection的隱憂不是? 改用ORM會比較好嗎?
single4565: flask mega tutorial 有orm的教學,也能找到中文版的 01/11 14:18
single4565: 來看 01/11 14:18
manmay: 嗯你原始嗎碼連結掛了 01/11 14:36
manmay: 根據維基敘述 post是對伺服器 01/11 14:36
manmay: 提交表單或上傳檔案 01/11 14:36
※ 編輯: OrzOGC (61.221.45.183 臺灣), 01/11/2021 14:41:34
manmay: 用簡單的模型來說,你提交 01/11 14:41
manmay: 表單給伺服器上某一資源 01/11 14:41
manmay: 但伺服器認為那一個物件是位於 01/11 14:41
manmay: 伺服器上的別處,而不是你要求的地方 01/11 14:41
manmay: 那你原本程式為啥會這樣做, 01/11 14:42
manmay: 樓上有人提過了(前面只是大略 01/11 14:42
manmay: 解釋) 01/11 14:42
ddavid: select 1 from table... 吐回一堆1就是它精華的地方啊 01/12 11:24
ddavid: 自己Google一下就知道為什麼要用它了 01/12 11:25
ddavid: 然後你提到col跟table怕有sql injection的隱憂,但你要先 01/12 11:26
ddavid: 想清楚為什麼你的設計上會需要使用者直接輸入col或table 01/12 11:26
ddavid: 名稱?這安全性問題是發生在你的設計上。 01/12 11:27
ddavid: 舉例來說你有國文 英文 數學 物理四科目成績是四個欄位名 01/12 11:27
ddavid: ,你想要讓使用者查詢四種科目 01/12 11:28
ddavid: 但你設計上為什麼會讓使用者填入一個任意字串來決定要 01/12 11:28
ddavid: SELECT的col名稱?光想就知道問題很大了吧! 01/12 11:29
ddavid: 合理的做法應該是讓使用者用選擇的方式選1 2 3 4,然後程 01/12 11:30
ddavid: 式裡面將1 2 3 4轉為col真正名稱才拼貼進query指令,這樣 01/12 11:31
ddavid: 使用者就沒有機會用這介面對col名稱做注入攻擊 01/12 11:31