括号内的URL突破codigniter查询传递(Parentheses passed in url

2019-10-19 19:18发布

我通过一个URL的笨驱动的网站传递的字符串。 被传递到其搜索数据库中的表中的字符串模型的函数之前传递前的字符串url编码,然后通过控制器urldecoded。 我读过这几个其他职位/文章,但没有提供一个可行的(对我来说)解决问题。 这里有一些我已经阅读过的事情:

URL具有笨不工作与DataMapper的ORM括号

括号问题笨网址

PHP rawurldecode不产生传递给rawurlencode相同的字符串

http://qubitlogs.com/PHP/2013/01/24/parentheses-in-urls-not-working-codeigniter-datamapper-orm/#.U0MtAce7mxa

这里是正在发生的事情:

一个URL编码字符串被通过URL传递,就像这样:

http://www.awebsite.com/controllername/functionname/test%28string%29

该控制器处理这就像这样:

public function functionname($string) {
    $this->load->model("codeigniter_model");
    $dstring = urldecode($string);
    $validString = $this->codeigniter_model->valid_string($dstring);        
    if (!$validString) { 
        $thiserror =  "<br>Error: Invalid String. (".$dstring.")"; 
        echo $thiserror; 
        exit;
    }
}

和模型:

function valid_string($string)
    {
    $sql = "select id from dbtable where dbfield = ?"; 
    $query = $this->db->query($sql, array($string));
    //Added this in to see what the query actually end up being
    echo $this->db->last_query();
        if ($query->num_rows() > 0) :
            return TRUE;
        else:
            return FALSE;       
        endif;
}

回送的查询是正确的:从DBTABLE选择id其中dbfield =“测试(串)”,并在Navicat运行时返回正确的ID。 然而 - 笨返回的查询FALSE。

我还检查了查询字符串得到呼应不包含HTML实体。

我已经被经过串没有控制权,真正需要的笨接受(和)作为字符串的一部分。

思想,任何人吗?

编辑:在相同的字符串是通过从表单后传递给笨控制器,它工作正常。

编辑#2:只是尝试使用Active Record的方法创建查询作为这里建议:不能这么添加其他链接:ellislab.com论坛viewthread 162036

这个:

$this->db->select('id');
$this->db->where('dbfield', "'".$string."'", FALSE);
$query = $this->db->get('dbfield');

也不行。

编辑#3:感谢Kyslik的建议使用分析器。 该字符串被明显HTML编码毕竟:从用户选择id其中字符串=“测试&#40;串&#41;” 这当然会因为HTML实体返回false。

不幸的是,添加代码同时使用常规查询和活动记录查询中删除这些实体:

$sql = "select id from dbtable where dbfield = ?"; $query = $this->db->query($sql, array(htmlspecialchars_decode($string)));

$this->db->select('id'); $this->db->where('dbfield', "'".htmlspecialchars_decode ($string)."'", FALSE); $query = $this->db->get('dbtable');

仍然不工作。

Answer 1:

答案是htmlspecialchars_decode()不能用于解码实体(和)。 如果我传递字符串(并在URL解码)在此之前的代码添加到控制器:

$dstring = str_replace("&#40;", "(", $dstring); $dstring = str_replace("&#41;", ")", $dstring);

然后一切正常,因为它应该。



文章来源: Parentheses passed in url break codigniter query