【问题标题】:Safely dynamically change SQL statement安全地动态更改 SQL 语句
【发布时间】:2017-08-23 04:03:25
【问题描述】:

我的课堂上有以下方法。我的目标基本上是找到数据库中的所有管理器,但可以选择限制 sql 语句。例如" AND U.username='jake56'" AND A.firstName='Jake'。我想知道添加限制是否安全,因为它容易受到 SQL 注入的影响。

/**
  * Returns an array of manager Users
  * @param string (optional) $limits - limit the query EX: 'AND U.userId > 7'
  * @return an array of managers with associative arrays
  */
  public function find_all_managers($limits = '') {
    $sql = "SELECT U.*, A.* 
     FROM Users U 
    JOIN Address A 
    ON U.addressId=A.addressId 
    WHERE U.role='manager' " . $limits;
    // run the query 
    $result = $this->query($query);
    $managers = mysqli_fetch_all($result, MYSQLI_ASSOC);
    return $managers;
  }

使用该参数是否安全?有人告诉我这种方法容易受到 SQL 注入的影响,但如果我愿意,我看不到另一种限制查询的方法。 例如我可能想$db->find_all_managers(' WHERE A.lastName='smith')

【问题讨论】:

  • 你应该使用参数化查询,任何可以手动输入到查询中的东西都有可能利用它。那么问题来了,如果你输入了一个无效的条件呢?我宁愿根据输入动态构建查询,而不是将输入作为查询的直接部分。

标签: php mysql oop mysqli


【解决方案1】:

这样做

public function find_all_managers($limitA = 0,$limitB = 0) {
     //now create the limit part here, if real numbers given
     //if(is_numeric($limitA) and $limitA > 0)  
}

所以知道你创建了限制,没有其他东西可以注入。

【讨论】:

  • 你误解了这个问题。尽管“限制”这个词具有误导性,但这个例子是相当确定的。把问题读到最后一行总是值得的
  • @Your Common Sense 2 wheres 在一个 SQL 中永远不会起作用,请不要怪我。我已经回答了大约 90% 的问题。再次阅读最后一行后,我的问题可以关闭,广泛,不清楚。并且可以删除我的答案的人:-)我将来会花更多时间,并会等到问题正确设置。实例失败可能发生
猜你喜欢
  • 2010-09-13
  • 1970-01-01
  • 2014-09-08
  • 2018-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
相关资源
最近更新 更多