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