DB::statement();在 Laravel (5.5)

新手上路,请多包涵

我正在使用 Laravel 5.5 构建一个应用程序,我必须为 Eloquent ORM (PostGIS) 不支持的扩展 PostgreSQL 运行一些 SQL 查询。相反,我使用 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 似乎没有返回任何东西。

原文由 Marin Leontenko 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 657
2 个回答

你可以在导入后做这个

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-简单的方法

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

                 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
});

原文由 Ahmed Shams 发布,翻译遵循 CC BY-SA 3.0 许可协议

1、使用参数绑定来保护你的查询。例子:

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

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

至于#2,将您的查询包装在 数据库事务 中。这将防止失败。例子:

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

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

原文由 user320487 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏