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

什么是最安全的使用方法?目前我正在使用 JRequest::getVar 和 mysql_real_escape_string。这是正确的吗 ?

  • $_POST 和 mysql_real_escape_string

    $password = mysql_real_escape_string($_POST["pwd"]));
  • JRequest::getVar 与 mysql_real_escape_string

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

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

    $password = $jinput->get('pwd', '', 'STRING');
  • JInput 和 mysql_real_escape_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/

    10-13 02:52