在Laravel中保护原始sql查询以防止注入

时间:2016-06-05 14:40:54

标签: sql laravel

不尝试任何SQL注入修复时的查询工作正常,没有任何连接问题。只有当语法中断时,才会尝试更改查询以防止注入。

我正在尝试保护此原始查询以防止sql注入

我在文档中看到过(我知道来自goo'ol php的预处理语句) Laravel展示了一个简单的例子:

$results = DB::select('select * from users where id = :id', ['id' => 1]);

或者这个

$users = DB::select('select * from users where active = ?', [1]);

我试图在它对应的地方,在WHERE子句中等于从$ a形式提供的变量,但所有尝试都会破坏语法。

所以像:

where author = ?, [$ba], or '$ba' or where author = :ba, ['author' => '$ba']

给出了语法错误。

    $ba = 'whatever';    
    $results = 
DB::select(DB::raw("SELECT 
          t.id, t.AvgStyle, r.RateDesc
          FROM (
               SELECT
               p.id, ROUND(AVG(s.Value)) AS AvgStyle
               FROM posts p
               INNER JOIN styles s
               ON s.post_id = p.id  
               WHERE author = '$ba'    
               GROUP BY p.id
               ) t
               INNER JOIN rates r
                   ON r.digit = t.AvgStyle"
                        ));

谢谢。 注意>问题不符合赏金条件。没有我的允许,有人总是把它放在我的每一个问题上。

2 个答案:

答案 0 :(得分:3)

答案非常接近埃弗顿所说的:它只需要向右边的一个括号。

那是:

, )[$ba]);

答案 1 :(得分:2)

您可以尝试这种方式:

<div ng-cloak ng-app="soExample">
  <div ng-controller="enterLogin">
    <label for="name">Name:</label>
    <input ng-model="name" type="text" id="name" />
    <button ng-click="doLogin()">Login</button>
  </div>
  <div ng-controller="displayLogin">
    <p>Currently logged in as {{loginService.loggedInName}}</p>
  </div>
</div>

angular.module("soExample", [])
  .factory("loginService", function() {
    var loggedInName = "";
    return {
      loggedInName: loggedInName
    };
  }).controller("enterLogin", ["$scope", "loginService", function($scope, loginService) {
    $scope.name = "";
    $scope.doLogin = function() {
        loginService.loggedInName = $scope.name;
    };
  }])
  .controller("displayLogin", ["$scope", "loginService", function($scope, loginService) {
    $scope.loginService = loginService;
  }]);

重要的是,如果你有其他参数,你需要尊重订单。