我打算制作HTML表单。表单将在数据库中显示当前表,如下所示
Toy | Color
Ball | Red
Bat | Yellow
Glove| Brown
在表单的最后,它应该说“进行查询以获取所有玩具及其各自的颜色”。因此,将允许用户键入选择查询。请注意,问题可能会有所不同,因此不存在用户始终必须使用的一致查询。实质上,他们必须编写整个查询。我想知道我应该怎么做以防止SQL注入。
答案 0 :(得分:2)
正如我在评论中所说,你不能在现场环境中安全地做到这一点。
...然而
如果这是出于教育目的,我建议你在学生系统(XAMPP或类似系统)上创建一个本地环境,让他们修改你为他们预制的脚本。
答案 1 :(得分:2)
您可以设置MySQL用户的权限,以确保只允许他们运行SELECT
语句,并且只能对单个数据库运行。这将使学生能够以最大的灵活性进行实验,而不会受到过度限制性过滤策略的阻碍。
如果您在异常处理程序中使用PDO运行它,您应该能够捕获任何格式错误的查询,无论是否有意。如果用户尝试运行的语句不是SELECT
,则会导致PDO异常,也可以正常捕获和处理。
评论者提出了一个关于用户运行要求淹没主机的高要求查询的好处。为了缓解这种情况,您可以尝试查找设置最长查询时间的MySQL配置设置。我无法找到可以执行此操作的MySQL设置,但PostgreSQL提供了statement_timeout
。
如果无法做到这一点,请考虑在AJAX操作中运行查询,其中PHP的最长执行时间限制为几秒钟。您可以考虑在SQLite中执行此操作,以避免使用共享数据库服务器资源 - 因为在SQLite的情况下, 没有数据库服务器。
另一个想法:我相信SQLFiddle工具使用的策略是在事务中包装潜在风险的查询,获取结果然后在最后回滚。这也许值得考虑,尽管设置权限本身就足够了。