DB ::声明();在Laravel(5.5)

时间:2018-02-05 08:21:56

标签: php sql postgresql laravel

我正在使用Laravel 5.5构建一个应用程序,我必须为扩展的PostgreSQL运行一些SQL查询,这些查询不受Eloquent ORM(PostGIS)的支持。相反,我使用DB :: statement($ queryString);将数据插入数据库。 $ queryString是根据与预构建的SQL语句连接的输入变量构建的。

以下是我的控制器中的代码(请注意,实际查询更复杂,这只是一个示例):

/**
 * Store a newly created resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function store(Request $request)
{   
    $id= $request->input('id');
    $name= $request->input('name');
    $geom = $request->input('geom');

    $geom = DB::raw("ST_TRANSFORM(ST_GeomFromGeoJSON('".$geom."'), 3857)");


    $statement = "INSERT INTO tableName(id, name) VALUES ('".$id."', '".$name."', ".$geom.");";
    DB::statement($statement);
    return 'Insert Successful';
}

我对这种方法有两个疑问:

  1. 如何保护我的应用程序免受SQL注入攻击?

  2. 如何检查查询是否成功运行? DB :: statement似乎没有返回任何内容。

3 个答案:

答案 0 :(得分:1)

1,使用参数绑定来保护您的查询。例如:

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

https://laravel.com/docs/5.5/database#running-queries

对于#2,请将您的查询包装在database transactions中。这将防止失败。例如:

DB::transaction(function () {
    DB::table('users')->update(['votes' => 1]);

    DB::table('posts')->delete();
});

答案 1 :(得分:1)

您可以在导入后进行此操作

use Illuminate\Support\Facades\DB;

您可以像这样查询

$quert=DB::insert('insert into tablename (columnname1,columnname2,) values (?,?)',[$id,$username]);

如果你想将整个数据插入到表格中,那么除了id和用户名之外,表格中没有数据

$quert=DB::insert('insert into tablename values (?,?)',[$id,$username]);
问号是问号吗? :D不要在这里输入任何内容 欢迎你

编辑:

约 如何保护我的应用程序免受SQL注入攻击? 你可以使用像

这样的跨站点脚本从中间件制作它
{% raw %} {{}} {% endraw %}

使用CSRF

<form ...>
{!! csrf_field() !!}
</form>

第二个问题 你有多重的东西

1-简单方法

您可以返回您的查询 如果你选择它将返回选择 如果它插入/更新/删除它将是真的,如果不是它将是假的

                return response()->json([
                'Message'=>'what ever you wanna write',
                'Data' => $query,
                 ], 200);

2-艰难的方式(我更喜欢:D)

你可以使用DB :: listen进行调试

DB::listen(function ($query) {
// $query->sql
// $query->bindings
// $query->time
});

答案 2 :(得分:1)

通常,根据OWASP,有四种方法可以防止SQL注入。

  1. 准备好的陈述
  2. 存储过程
  3. 白名单/输入验证
  4. 转义所有用户提供的输入
  5. 在您的情况下,对于Laravel 5+而言,Eloquent ORM不能直接使用,我认为最佳选择是#1,准备好的陈述

    更具体地说,在Laravel中,您可以使用Query Builder内置它来迭代构建语句或使用

    执行完全原始的SQL语句
    DB:: select ( [raw query string] )
    

    <强>来源

    SO Post: Laravel, execute raw queries