在Joomla中防止SQL注入的最佳方法

Cha*_*gaD 7 php mysql joomla

我从POST方法中获取变量,并使用Joomla 2.5在MySQL上查询它们.

什么是最安全的方法?目前我正在使用带有mysql_real_escape_string的JRequest :: getVar.这是对的吗 ?

  1. 带有mysql_real_escape_string的$ _POST

    $ password = mysql_real_escape_string($ _ POST ["pwd"]));

  2. 带有mysql_real_escape_string的JRequest :: getVar

    $ password = mysql_real_escape_string(JRequest :: getVar('pwd','','post'));

  3. JRequest :: getVar

    $ password = JRequest :: getVar('pwd','','post');

  4. JInput

    $ password = $ jinput-> get('pwd','','STRING');

  5. 使用mysql_real_escape_string进行JInput

    $ 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();
Run Code Online (Sandbox Code Playgroud)

编辑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;
}
Run Code Online (Sandbox Code Playgroud)

因为escape()使用mysql_real_escape_string()使用如下安全吗?

$ loginUsername = mysql_real_escape_string(JRequest :: getVar('user','','post','STRING'));

nib*_*bra 12

在Joomla!中,你永远不会直接访问任何超级全球.此外,您应始终区分传入和传出的数据.因此,要从请求中获取传入值,请使用

$password = $jinput->get('pwd', '', 'STRING');
Run Code Online (Sandbox Code Playgroud)

(JInput是正确的选择; JRequest已弃用,将来会被删除.)现在您可以使用干净的值.它准备用PHP处理.

接下来要在SQL查询中使用该值(传出),您必须正确地转义它.

$query->where("username = " . $db->quote($loginUsername) . " AND password = " . $db->quote($loginPassword) . " AND state > -1");
Run Code Online (Sandbox Code Playgroud)

与之不同的是$db->escape(),$db->quote()添加底层数据库引擎所需的引号.

为什么不一步处理这个?

好吧,你可能在某些时候想要另一种类型的输出,例如.在一个视图中(即使密码不是这个例子的最佳选择,我也用它来保持一致性):

echo $this->escape($password); // applies html_specialchars in HTML views
Run Code Online (Sandbox Code Playgroud)

因此,最好始终尽可能地避开所需的地方.对于传入数据,这在检索之后立即用于在发送/打印之前立即传出数据.