我有几个带用户输入的自定义SQL查询,例如人物搜索。我知道addslashes()不可靠,但我不能使用mysqli_real_escape_string()或PDO语句与Propel,我可以吗?
对等方法示例:
$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);
如果我没有将addslashes()添加到$ query,那么很容易进行SQL注入。 但对于mysqli_real_escape_string(),我需要一个$ link,我没有?
答案 0 :(得分:1)
Halleluja,我想我找到了解决方案:
Propel::getConnection()->quote($userInput)
这就是魔术。一步引用和逃避! 所以自定义查询将是:
$criteria->addAsColumn("lastnameRelevance", "CASE WHEN ".self::LAST_NAME." LIKE ".Propel::getConnection()->quote($query."%")." THEN 1 ELSE 0 END");
有人可以验证,这是确保输入安全的最佳方法吗?