我有一个表单,我在其中发布 MySQL 查询。使用 PHP 进一步处理。我的问题是,如果用户键入“DROP DATABASE mydb”,这将是一个大问题。所以,我想知道是否有一种方法可以在发布查询之前进行验证,以便用户不会损害任何其他数据库。我们可以肯定地使用正则表达式。但是还有其他更好的方法吗?
谢谢
我有一个表单,我在其中发布 MySQL 查询。使用 PHP 进一步处理。我的问题是,如果用户键入“DROP DATABASE mydb”,这将是一个大问题。所以,我想知道是否有一种方法可以在发布查询之前进行验证,以便用户不会损害任何其他数据库。我们可以肯定地使用正则表达式。但是还有其他更好的方法吗?
谢谢
不要使用 php(或正则表达式......或数据库本身以外的任何其他内容)解析查询以查看它是否会做有害的事情,因为这可能会变得非常复杂(你不能只过滤掉“坏词” ²)。
最好为那些用户生成的查询创建一个数据库用户,并且只授予用户应该能够做的事情的权限(可能只有SELECT
s、没有UPDATE
s、DELETE
s 或表结构更改)。
²例如:SELECT 'DROP DATABASE is a bad thing' FROM mytable;
绝对没问题,不会伤害任何东西。如果您只是在查询中查找“DROP DATABASE”,那么在这种情况下您只会惹恼用户......
您允许用户直接输入原始查询来执行。因此,这不属于 SQL 注入。
这里需要考虑的是mysql用户权限。对于特定的数据库用户(为此创建一个单独的用户),不要授予他删除、删除等权限。只授予您愿意允许的权限。
http://dev.mysql.com/doc/refman/5.1/en/adding-users.html
https://kb.mediatemple.net/questions/788/HOWTO%3A+GRANT+privileges+in+MySQL#dv