【发布时间】:2013-03-04 21:47:48
【问题描述】:
又快又脏:我想仅使用 INSERT 权限检查特定行是否已存在。
说明
出于安全目的,我已将我的数据库帐户限制为 INSERT 权限。我意识到在 mysqli_real_escape_string 之后还有其他步骤要采取,但作为 PHP 和 MySQL 的新手,我认为这是阻止注入的最佳方法。
提交后,表单会进行验证检查并尝试创建行,然后通过或捕获 1062 错误并指出用户名已存在。
我现在想使用同一个数据库帐户实现抢占式 AJAX 调用。我考虑过发布一个虚拟更新语句(不做任何更改)来检查重复项,但显然没有 SELECT 权限会失败。 SELECT right 是我试图避免的主要选择;这是幼稚的吗?解决这个问题的正确方法是什么?
【问题讨论】:
-
prevent SQL injection 的正确方法是使用占位符。这很简单,而且很有效。虽然限制访问是一个附加层,但只要正确使用基本的测试访问模式(即占位符),许多潜在问题就会得到缓解。现在,仍然必须正确使用数据(例如,对 JSON 或 HTML 输出进行编码),但这不是“SQL 注入”。
-
另外,我看不出提供 INSERT(没有 SELECT)如何防止 SQL 注入的一般情况,即使它可能能够防止某些直接查询能力.. 如果能够改变架构也没有锁定?
-
我的想法是,在注入的情况下,他们能做的最糟糕的事情就是创建新用户。澄清一下,DB 用户只有 INSERT 权限。
-
"Worst" .. 使用适当的占位符/绑定技术。出于其他原因限制访问是有效的,但不是为了“防止 SQL 注入”。访问 SQL 的代码要么使用占位符,要么做错了。没有回旋的余地。不要忘记转义输入。
标签: php mysqli uniqueidentifier