我有几个带有用户输入的自定义SQL查询,例如person搜索。我知道add斜杠()不可靠,但我不能使用mysqli_real_escape_string()或带有Propel的PDO语句,可以吗?
对等方法的示例:
$criteria = new Criteria();
$criteria->addAsColumn("lastnameRelevance", "CASE WHEN ".self::LAST_NAME." LIKE '".addslashes($query)."%' THEN 1 ELSE 0 END");
$criterion = $criteria->getNewCriterion(self::NAME_NORMALIZED, "%".$query."%", Criteria::LIKE);
$criteria->add($criterion);
$criteria->addDescendingOrderByColumn("lastnameRelevance");
$criteria->addAscendingOrderByColumn(self::NAME_NORMALIZED);
return self::doSelectJoinAll($criteria);
如果我不向$query添加addslashes(),那么很容易执行SQL注入。但是对于mysqli_real_escape_string(),我需要一个$link,而我还没有呢?
发布于 2015-02-17 01:42:47
哈利路亚,我想我找到了解决办法:
Propel::getConnection()->quote($userInput)
这样才有魔力。一步一步地引用和逃避!因此,自定义查询将是:
$criteria->addAsColumn("lastnameRelevance", "CASE WHEN ".self::LAST_NAME." LIKE ".Propel::getConnection()->quote($query."%")." THEN 1 ELSE 0 END");
有人能证实,这是确保输入安全的最佳方法吗?
https://stackoverflow.com/questions/25041491
复制