【问题标题】:What is proper syntax for mysqldb to avoid sql-injection?mysqldb避免sql注入的正确语法是什么?
【发布时间】:2017-11-10 09:43:41
【问题描述】:

我正在通过 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["html_name"] 将用户输入分配给所有用户输入的变量,除了图像之一,我使用 request.files['image'] 代替。不过,我实际上并没有将图像插入数据库,只是将存储图像的路径插入到数据库中,以防万一……

说完这一切之后,我尝试输入“test”作为标题,“Pittsburgh”作为位置,“Active”作为活动,“test”作为内容,默认为“图像/”。返回的错误如下:

    "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")

如您所见,内容和照片似乎完全被忽略了,活动仅显示为“A”。请记住,当我使用“%”而不是“,”时,这一切都很好。我不知道使用其中一种之间到底有什么变化,但显然这是因为现在它不起作用了。我想知道这是否与整个表单中的 html 输入类型不同这一事实有关,但这可能只是巧合。我不知道。非常感谢所有帮助,谢谢。

【问题讨论】:

    标签: html flask mysql-python


    【解决方案1】:

    我发现了问题所在。使用“,”语法时,不能为sql语句中的表名传递参数。因此,我必须在任何有表名的地方分解语句,并将表名变量硬编码到语句中,如下所示:

        cursor.execute('INSERT INTO '+theTableName+' (column1,column2,column3,column4,column5) VALUES (%s,%s,%s,%s,%s)', (value1,value2,value3,value4,value5))
    

    为了免受 sql 注入攻击,现在有必要保护表名的用户输入...但这是另一个故事,超出了本问题的范围。

    【讨论】:

      猜你喜欢
      • 2014-12-15
      • 2020-05-05
      • 2018-11-14
      • 1970-01-01
      • 2015-06-22
      • 2017-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多