允许用户在防止SQL注入的同时执行mySQL选择语句

时间:2013-11-13 14:42:10

标签: php mysql sql sql-injection

我打算制作HTML表单。表单将在数据库中显示当前表,如下所示

Toy  | Color
Ball |  Red
Bat  |  Yellow
Glove|  Brown

在表单的最后,它应该说“进行查询以获取所有玩具及其各自的颜色”。因此,将允许用户键入选择查询。请注意,问题可能会有所不同,因此不存在用户始终必须使用的一致查询。实质上,他们必须编写整个查询。我想知道我应该怎么做以防止SQL注入。

2 个答案:

答案 0 :(得分:2)

正如我在评论中所说,你不能在现场环境中安全地做到这一点。

...然而

如果这是出于教育目的,我建议你在学生系统(XAMPP或类似系统)上创建一个本地环境,让他们修改你为他们预制的脚本。

答案 1 :(得分:2)

您可以设置MySQL用户的权限,以确保只允许他们运行SELECT语句,并且只能对单个数据库运行。这将使学生能够以最大的灵活性进行实验,而不会受到过度限制性过滤策略的阻碍。

如果您在异常处理程序中使用PDO运行它,您应该能够捕获任何格式错误的查询,无论是否有意。如果用户尝试运行的语句不是SELECT,则会导致PDO异常,也可以正常捕获和处理。

评论者提出了一个关于用户运行要求淹没主机的高要求查询的好处。为了缓解这种情况,您可以尝试查找设置最长查询时间的MySQL配置设置。我无法找到可以执行此操作的MySQL设置,但PostgreSQL提供了statement_timeout

如果无法做到这一点,请考虑在AJAX操作中运行查询,其中PHP的最长执行时间限制为几秒钟。您可以考虑在SQLite中执行此操作,以避免使用共享数据库服务器资源 - 因为在SQLite的情况下, 没有数据库服务器。

另一个想法:我相信SQLFiddle工具使用的策略是在事务中包装潜在风险的查询,获取结果然后在最后回滚。这也许值得考虑,尽管设置权限本身就足够了。