首页 > 解决方案 > 保护动态 where 子句 (PDO)

问题描述

在我的表单中,我有一个选择和一个输入,如下所示:

<div class="row">
  <div class="col-md-4">
    <select id="select-column" name="column" class="form-control">
      <option value="bin_id">Bin ID</option>
      <option value="table_col_one">Column One</option>
      <option value="table_col_two">Column Two</option>
      <option value="table_col_three">Column Three</option>
    </select>
  </div>

  <div class="col-md-8">
    <div>
      <input id="search" name="term" type="text" class="form-control">
    </div>
  </div>
</div>

用户选择要搜索的列,这是我的 SQL 查询:

$term = $_POST['term'];
$column = $_POST['column'];

$sql = "SELECT $column FROM packing_master WHERE $column LIKE :term AND invoice != '' group by $column LIMIT 35";
$stmt = $bdd->prepare($sql);
$stmt->bindParam(':term', $term);
$stmt->execute();

但是如何保证请求的安全?因为它容易受到sql注入?

标签: phpmysqlpdo

解决方案


white list允许的列名称一起使用:

$term = $_POST['term'];
$column = $_POST['column'];

$allowed_columns = ['col1', 'col2', 'col3']; 
// or query a database to get columns in the table you're operating on

if (!in_array($column, $allowed_columns)) {
    // throw exception or do anything else that prevents further query execution
}

推荐阅读