作者OrzOGC (洞八达人.拖哨天王)
看板Python
标题[问题] flask post 302 ?
时间Sat Jan 9 19:29:44 2021
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://webptt.com/cn.aspx?n=bbs/Python/M.1610191787.A.F68.html
1F:推 ddavid: sql的问题,是不是这样代入变成SELECT "test" FROM ..., 01/10 05:23
2F:→ ddavid: test是被用常数字串的方式带入了,所以行为会是找到一行符 01/10 05:24
3F:→ ddavid: 合条件的就传回一行"test" 01/10 05:24
4F:→ ddavid: 类似我们常会用到 SELECT 1 FROM ... 的这个技巧 01/10 05:25
可是用select 1 from table...只会吐回一堆1...
5F:→ TakiDog: 你写redirect不就302 01/10 05:37
6F:→ TakiDog: 还是你想回应什麽? 01/10 05:39
7F:推 manmay: 如果想要知道server为啥有这样行为,可以先读http protoco 01/10 08:29
8F:→ manmay: l 01/10 08:29
9F:→ manmay: 了解一下通讯流程 01/10 08:29
有看没有懂...XD
10F:推 mychiux413: 第二种select会保护sql injection攻击,请Google,事 01/11 00:04
11F:→ mychiux413: 实上任何execute都该养成好习惯用法2,即套件内建的p 01/11 00:04
12F:→ mychiux413: laceholder去做请求,而不应该自己去把query组出来, 01/11 00:04
13F:→ mychiux413: 举例来说,法1里,kind="*"的话,你所有栏位就全暴露 01/11 00:04
14F:→ mychiux413: 了 01/11 00:04
reddit有人遇到类似的情况
https://tinyurl.com/yypl85pf
变成要写比较多行重覆的code
stackoverflow上找到的资料
https://tinyurl.com/y68p7l3u
column和table不能用方法2的方式...
不过这样会有sql injection的隐忧不是?
改用ORM会比较好吗?
15F:推 single4565: flask mega tutorial 有orm的教学,也能找到中文版的 01/11 14:18
16F:→ single4565: 来看 01/11 14:18
17F:推 manmay: 嗯你原始吗码连结挂了 01/11 14:36
18F:→ manmay: 根据维基叙述 post是对伺服器 01/11 14:36
19F:→ manmay: 提交表单或上传档案 01/11 14:36
※ 编辑: OrzOGC (61.221.45.183 台湾), 01/11/2021 14:41:34
20F:→ manmay: 用简单的模型来说,你提交 01/11 14:41
21F:→ manmay: 表单给伺服器上某一资源 01/11 14:41
22F:→ manmay: 但伺服器认为那一个物件是位於 01/11 14:41
23F:→ manmay: 伺服器上的别处,而不是你要求的地方 01/11 14:41
24F:→ manmay: 那你原本程式为啥会这样做, 01/11 14:42
25F:→ manmay: 楼上有人提过了(前面只是大略 01/11 14:42
26F:→ manmay: 解释) 01/11 14:42
27F:推 ddavid: select 1 from table... 吐回一堆1就是它精华的地方啊 01/12 11:24
28F:→ ddavid: 自己Google一下就知道为什麽要用它了 01/12 11:25
29F:→ ddavid: 然後你提到col跟table怕有sql injection的隐忧,但你要先 01/12 11:26
30F:→ ddavid: 想清楚为什麽你的设计上会需要使用者直接输入col或table 01/12 11:26
31F:→ ddavid: 名称?这安全性问题是发生在你的设计上。 01/12 11:27
32F:→ ddavid: 举例来说你有国文 英文 数学 物理四科目成绩是四个栏位名 01/12 11:27
33F:→ ddavid: ,你想要让使用者查询四种科目 01/12 11:28
34F:→ ddavid: 但你设计上为什麽会让使用者填入一个任意字串来决定要 01/12 11:28
35F:→ ddavid: SELECT的col名称?光想就知道问题很大了吧! 01/12 11:29
36F:→ ddavid: 合理的做法应该是让使用者用选择的方式选1 2 3 4,然後程 01/12 11:30
37F:→ ddavid: 式里面将1 2 3 4转为col真正名称才拼贴进query指令,这样 01/12 11:31
38F:→ ddavid: 使用者就没有机会用这介面对col名称做注入攻击 01/12 11:31