【问题标题】:Checking Duplicate Row With Limited (no SELECT) Rights检查具有有限(无 SELECT)权限的重复行
【发布时间】: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


【解决方案1】:

您可以使用 INSERT IGNORE INTO 表

见http://bogdan.org.ua/2007/10/18/mysql-insert-if-not-exists-syntax.html

有一个问题跟你很像:How to 'insert if not exists' in MySQL?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 2020-11-05
    • 2015-04-22
    • 2012-07-07
    • 1970-01-01
    • 2016-04-23
    • 2010-12-08
    相关资源
    最近更新 更多