【问题标题】:Crash Ajax Request When Use Slash In Url在 URL 中使用斜杠时崩溃 Ajax 请求
【发布时间】:2014-07-14 18:42:32
【问题描述】:

当 Url 重写时,我有一个用于测试 Ajax 请求的简单项目,如下所示:

htaccess:

Options +FollowSymLinks  
RewriteEngine On  

RewriteCond %{SCRIPT_FILENAME} !-d  
RewriteCond %{SCRIPT_FILENAME} !-f  



RewriteRule ^(.*)$ index.php?param=$1

index.php:

<?php 

if (!isset($_GET['param'])){

    include('home.php');

}


if (isset($_GET['param'])){

include('tick.php');

}

?>

home.php:

<h1>HOME</h1>

tick.php:

$(document).ready(function ($) {    

     $.ajax({
    type: "POST",
    url: "php/request.php", 
    dataType: "json",   
    data: {k_name:'book'},
        success: function (data) {

      //ghtml();

        }
      })

  }

request.php:

<?php 

require("config.inc.php");
require("Database.singleton.php");

$k_name=$_POST['k_name'];
$data = array();

//Connect To DB
    $db= new Database(DB_SERVER, DB_USER, DB_PASS, DB_DATABASE);
    $db->connect();


    $sql = "SELECT id, name FROM table1 WHERE name=$k_name ";
    $rows = $db->fetch_array($sql);



    foreach($rows as $record){
        $data[] = array('id' => $record['id'], 'name' => $record['name']); 
    }



echo json_encode(array_values($data));
 ?>

当 URL 是:

http://localhost/ajax/aaaa

注意:我的文件夹项目名称是 Ajax。

Ajax 请求运行良好,但在 Url 中使用斜杠时:

http://localhost/ajax/aaaa/

Ajax 请求崩溃,我现在必须使用框架来更好地调度请求,但我不明白为什么会出现这个问题。

【问题讨论】:

标签: php jquery ajax .htaccess


【解决方案1】:

您没有使 AJAX 崩溃。您正遭受sql injection attack 漏洞的困扰,并且您的代码中缺少任何形式的错误处理:

您直接将 AJAX 值插入到查询中:

$sql = "SELECT id, name FROM table1 WHERE name=$k_name ";
                                               ^^^^^^^

这会导致如下查询:

SELECT ... WHERE name=foo

除非您的表中有一个名为 foo 的字段,否则这将导致语法错误并终止您的查询。但由于您没有任何错误处理,您只需假设查询永远不会失败并继续处理错误数据。

您的fetch 调用可能会吐出有关在输出非对象上调用方法的PHP 警告。而且由于您的调用 JS 代码期望 JSON 作为响应返回,因此该错误将导致 JSON 解析错误,等等等等。

简而言之,如果您对最基本的错误处理感到厌烦,这本可以避免:

if (query failed) {
   output json error message
} else {
   process query results
}

永远不要永远假设成功。总是假设失败,把成功当作一个惊喜。查询成功的方式只有一种,失败的方式几乎无限。拉斯维加斯的赌场会欢迎您,因为您将无限的 1 机会视为“保证成功”。

【讨论】:

  • name=$k_name 是一个示例,在实际项目中我使用转义和其他算法进行验证,但我在 url 中使用斜线的问题
猜你喜欢
  • 2013-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 2013-06-30
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
相关资源
最近更新 更多