我从 POST 方法中获取变量并使用 Joomla 2.5 在 MySQL 上查询它们。
什么是最安全的使用方法?目前我正在使用 JRequest::getVar 和 mysql_real_escape_string。这是正确的吗 ?
$password = mysql_real_escape_string($_POST["pwd"]));
$password= mysql_real_escape_string(JRequest::getVar('pwd', '', 'post'));
$password= JRequest::getVar('pwd', '', 'post');
$password = $jinput->get('pwd', '', 'STRING');
$password = mysql_real_escape_string($jinput->get('pwd', '', 'STRING'));
或者是其他东西 ?
编辑 1:
我找到了另一种使用 mysql_real_escape_string http://docs.joomla.org/API15:JDatabaseMySQL/getEscaped 转义字符的方法
这是我的查询代码。
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select(array('username', 'password', 'state','name'));
$query->from('#__dbusers');
$query->where('username = \''.$loginUsername.'\' AND password = \''.$loginPassword.'\' AND state > -1');
$db->setQuery($query);
$results = $db->loadObjectList();
编辑 2:MySQL 的 Framework 11.1 escape() 方法
public function escape($text, $extra = false)
{
$result = mysql_real_escape_string($text, $this->getConnection());
if ($extra)
{
$result = addcslashes($result, '%_');
}
return $result;
}
由于escape() 使用mysql_real_escape_string() 如下使用是否安全?
$loginUsername = mysql_real_escape_string(JRequest::getVar('user', '', 'post','STRING'));
最佳答案
在 Joomla! 中,您永远不会直接访问任何超全局变量。此外,您应该始终区分传入和传出数据。因此,要从请求中获取传入值,请使用
$password = $jinput->get('pwd', '', 'STRING');
(
JInput
是正确的选择;JRequest
已弃用,将来会被删除。)现在您有一个干净的值(value)可以使用。它已准备好用 PHP 处理。
接下来是在 SQL 查询(传出)中使用该值,您必须正确转义它。
$query->where("username = " . $db->quote($loginUsername) . " AND password = " . $db->quote($loginPassword) . " AND state > -1");
与
$db->escape()
不同的是, $db->quote()
添加了底层数据库引擎所需的引号。为什么不一步解决这个问题?
好吧,您可能在某个时候想要另一种类型的输出,例如。在一个 View 中(即使密码对于这个例子来说不是最好的,我还是使用它来保持一致性):
echo $this->escape($password); // applies html_specialchars in HTML views
因此,最好总是尽可能靠近需要的地方逃生。对于传入数据,这是在检索之后立即,对于在发送/打印之前立即传出的数据。
关于php - 防止Joomla中的SQL注入(inject)的最佳方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16416850/