mysqldb避免sql注入的正确语法是什么?

时间:2017-06-08 15:21:33

标签: html flask mysql-python

我正在通过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输入类型不同的事实有关,但这可能只是巧合。我不确定。非常感谢所有帮助,谢谢。

1 个答案:

答案 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注入攻击的安全,现在需要保护表名的用户输入......但这是另一个故事,超出了这个问题的范围。