如何安全地将带有URL的文本作为参数传递给CodeIgniter控制器?

时间:2014-08-20 05:21:05

标签: javascript jquery codeigniter

我正在尝试使用jQuery通过AJAX发送一个可能包含一个或多个URL的字符串。

该文本将由CodeIgniter控制器接收。

我有一些错误。有时它是404错误或其他时间是406错误,具体取决于我发送数据的方式。

现在我这样发送:

var dsPost = encodeURIComponent(base64_encode(postContent));

$.ajax({
    url: "/posts/createTextPost/" + dsPost,
    type: "POST",
    data: "userIdWall" + "=" + userIdWall,
    success: function(data, textStatus, jqXHR) {

    },
    error: function (jqXHR, textStatus, errorThrown) {

    }
});

base64_encode fn是phpjs实现。

在CI控制器中,我这样做:

public function createTextPost($dsPost) {
    $dsPost = base64_decode(urldecode($dsPost));
}

问题是,数据可以保存到数据库但我无法理解为什么会出现404错误。

有什么想法吗?

感谢。

4 个答案:

答案 0 :(得分:0)

base64_encode()函数有时会在编码字符串中添加/,因此Codeigniter操作方法的行为类似于second参数计

  

如果编码字符串如:qwqw221 @ 1223 / dds *(ewfd)

比ci问题

  

字符串部分" /" char表现得像2 nd param

     

' *'不允许使用char

因此,您应该使用GET查询字符串而不是CI param

喜欢

url: "/posts/createTextPost/?crypt=" + dsPost

CI控制器操作

中获取查询sting
public function createTextPost() {
     $dsPost = base64_decode(urldecode($this->input->get("crypt")));
}

答案 1 :(得分:0)

我建议在AJAX调用中将dsPost添加到数据中,而不是将其作为参数添加到url中:

$.ajax({
    url: "/posts/createTextPost/",
    type: "POST",
    data: { "dsPost": dsPost, "userIdWall", userIdWall },
    success: function(data, textStatus, jqXHR) {
      // Yippie!
    },
    error: function (jqXHR, textStatus, errorThrown) {
      // Bhuhuhu....
    }
});

...然后更新CI控制器以使用发布的对象而不是输入参数:

public function createTextPost() {
  $dsPost = base64_decode( urldecode( $this->input->post('dsPost') ) );
  userIdWall = $this->input->post('userIdWall');
}

答案 2 :(得分:0)

您必须通过如下的ajax数据发送内容。

$.ajax({
//double check your url setting in this way in case you have diffrent setting for index.php      then remove the index.php
url: "<?=base_url()?>.index.php/posts/createTextPost/",

type: "POST",
data: { 
       "dsPost": dsPost, 
       "userIdWall", userIdWall 
},
success: function(data, textStatus, jqXHR) {

},
error: function (jqXHR, textStatus, errorThrown) {

}
});

然后在您的控制器中

public function createTextPost() {
$dsPost = base64_decode( urldecode( $this->input->post('dsPost') ) );
$userIdWall=$this->input->post('userIdWall');

我希望它会有所帮助。

答案 3 :(得分:0)

所以,感谢您的想法,但答案可以在这里找到:

PHP/Apache Error:406 Not Acceptable

我引用那里给出的答案:

  

如果任何用户输入项目正在启动,您的网站就会生成错误   使用http://或https://。

     

当我尝试使用以http://开头的链接时,我得到了406 Not   可以接受:

     

http://onkore.us/?blah=http://www.google.com

     

我尝试这个时很好:

     

http://onkore.us/?blah=www.google.com