避免在PDO中使用SQL注入并使用like子句

时间:2013-07-15 19:06:58

标签: sql pdo

我正在使用预准备语句来使用PDO进行搜索功能,我正在使用like子句。 Mysql是5.5.32

function dblink(){
    # hidden #
    $conn = new PDO("mysql:host=localhost;dbname=$database", 
     $username, $password,  array(
     PDO::ATTR_PERSISTENT => true, 
     PDO::ATTR_EMULATE_PREPARES => false, 
     PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
     PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ
    ));
    return $conn;
}

$conn    = dblink();
$query   = "select * from tablename where attrib like ? ;";
$stmt    = $conn->prepare($query);

$stmt->execute(array($_POST['field']."%"));

$results = $stmt->fetchAll(PDO::FETCH_OBJ);

当用户在html表单中输入%for field时,这会转储所有表格内容。我认为预处理语句会处理它并且执行中有%,以便它匹配输入的子字符串。

如何仅将POST字段用作普通文本,以免造成此类问题?

1 个答案:

答案 0 :(得分:1)

  

当用户在html表单中输入%for field时,这会转储所有表格内容。

是。这就是LIKE运营商的确切目的 不,它与准备好的陈述无关。后者用于格式化数据,而不是干扰查询逻辑。

如果您不喜欢代码的工作方式 - 请更改它。但目前它的工作方式与您编码的方式完全一致,没有任何缺陷。