我正在通过Flask框架构建Web应用程序,并尝试使用html表单来检索最终存储在mysqldb数据库中的用户数据。
我最初使用"%"将我的python变量传递给sql命令。而不是","像这样:
cursor.execute('INSERT INTO %s (column1,column2,column3,column4,column5) VALUES ("%s","%s","%s","%s","%s")' % (value1,value2,value3,value4,value5,value6)
这种方法运行得很完美,但后来我在调试我的应用程序时意识到这非常容易受到sql注入的影响,我需要使用","代替。所以我把代码更改为:
cursor.execute("INSERT INTO %s (column1,column2,column3,column4,column5) VALUES (%s,%s,%s,%s,%s)", (value1,value2,value3,value4,value5,value6)
根据我在这里阅读的所有内容,google,youtube等等,这对于我的问题已经解决了所有方法,我确信这是一个新的方法,但是新的出现sql语法问题,无论我尝试做什么,我似乎都无法修复。
我的html表单,这与以下内容相关:
<form method="post" enctype="multipart/form-data">
<ul>
<li><input type="text" name="title" placeholder="Title" required></li>
<li><input type="text" name="location" placeholder="Location" required></li>
<li><select name="activity" required>
<option value="Active">Active</option>
<option value="Food/Drink">Food/Drink</option>
<option value="Liesure">Liesure</option>
<option value="Night Life">Night Life</option>
<option value="Scenic">Scenic</option>
<option value="Other">Other</option>
</select></li>
<li><textarea id="post" name="content" placeholder="Write post here..." required></textarea></li>
<li><input type="file" name="image" accept="image/*"></li>
我在我的python代码中使用 request.form [&#34; html_name&#34;] 将用户输入分配给除图像之外的所有用户输入的变量一,我使用 request.files [&#39; image&#39;] 代替。我实际上并没有将图像插入到数据库中,只是将图像存储到的路径,以防有... ...
在完成所有这些之后,我尝试输入&#34; test&#34;标题,&#34;匹兹堡&#34;对于位置,&#34;活跃&#34;对于活动,&#34;测试&#34;对于内容,对于默认为&#34; img /&#34;的图像没有任何内容。返回的错误如下:
"You have an error in your SQL syntax; check the manual that corresponds
to your MySQL server version for the right syntax to use near
''TheTableName' (title,location,activity,content,photo) VALUES
('test','Pittsburgh','A' at line 1")
正如您所看到的,内容和照片似乎完全被忽略,而且活动仅显示为&#34; A&#34;。请记住,当我使用&#34;%&#34;而不是&#34;,&#34;。我不确切地知道使用其中一个之间究竟有什么变化,但显然它现在导致它无法正常工作。我想知道它是否与整个表单中html输入类型不同的事实有关,但这可能只是巧合。我不确定。非常感谢所有帮助,谢谢。
答案 0 :(得分:0)
我弄明白了这个问题。使用&#34;,&#34;时,不能在sql语句中为表名传递参数。句法。因此,我必须在任何有表名的地方拆分语句,并将表名变量硬编码到语句中,如下所示:
cursor.execute('INSERT INTO '+theTableName+' (column1,column2,column3,column4,column5) VALUES (%s,%s,%s,%s,%s)', (value1,value2,value3,value4,value5))
为了保护sql注入攻击的安全,现在需要保护表名的用户输入......但这是另一个故事,超出了这个问题的范围。