Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 插入方法中的DB::raw易受SQL注入攻击吗?_Php_Mysql_Laravel_Sql Injection_Query Builder - Fatal编程技术网

Php 插入方法中的DB::raw易受SQL注入攻击吗?

Php 插入方法中的DB::raw易受SQL注入攻击吗?,php,mysql,laravel,sql-injection,query-builder,Php,Mysql,Laravel,Sql Injection,Query Builder,我在Laravel中有这样一个简化的代码: $uid = $request->input('uid'); DB::table('users')->insert([ 'uid' => DB::raw("CONV('$uid', 16, 10)"), 'created_at' => date("Y-m-d H:i:s") ]); 我的代码容易受到SQL注入攻击吗?为什么?如果是这样,我如何防止它?是的,它很容易受到SQL注入的攻击,因为$uid的原始内容将

我在Laravel中有这样一个简化的代码:

$uid = $request->input('uid');
DB::table('users')->insert([
    'uid' => DB::raw("CONV('$uid', 16, 10)"),
    'created_at' =>  date("Y-m-d H:i:s")
]);

我的代码容易受到SQL注入攻击吗?为什么?如果是这样,我如何防止它?

是的,它很容易受到SQL注入的攻击,因为
$uid
的原始内容将被注入到SQL查询中

尽管
DB::raw()
接受准备好的参数,但不能在insert方法中正确使用它

为此,您需要手动编写insert查询:

$uid = $request->input('uid');

DB::statement('INSERT INTO users (uid, created_at) VALUES (CONV(?, 16, 10), ?)', [
    $uid,
    date("Y-m-d H:i:s")
]);

是的,将请求输入直接复制到原始SQL查询就是SQL注入漏洞的一个示例

我建议这样做:

$uid = base_convert($request->input('uid'), 16, 10);
DB::table('users')->insert([
    'uid' => $uid,
    'created_at' =>  date("Y-m-d H:i:s")
]);



您正在使用
$uid
进行注入,因此是的,您创建了一个注入漏洞。提示:在PHP中进行转换,然后在不带
DB::raw
的情况下传入普通的旧参数@tadman我必须处理无符号的64位整数,这就是为什么我更喜欢mysql方式来转换十六进制值。不幸的是,这对我不起作用,它给了我以下错误:
Next Illumb\Database\QueryException:SQLSTATE[22007]:无效的日期时间格式:1292截断了不正确的十进制值:':uid'(SQL:insert-into'users'('uid','created_at')值(CONV('uid',16,10),2020-04-08 20:39:33)),位于vendor/larvel/framework/src/illighted/Database/Connection中。php:669
参数不能放在SQL引号内。您必须使用
“CONV(:uid,16,10)”
@BillKarwin遗憾的是它仍然给我错误:
SQLSTATE[HY093]:无效参数编号:混合命名参数和位置参数(SQL:insert-into-users(uid,created_-at)值(CONV(:uid,16,10),2020-04-08 20:59:41))
。看起来它根本没有将
uid
值传递给原始查询!Laravel似乎不支持这一点:请尝试更新的代码。不确定,我现在正在用手机写信。如果不起作用,明天我用正确的代码更新我的答案。对不起,这实际上不是我的答案。由于PHP无法处理无符号大整数,我无法将
ffffffffffffff
转换为十进制,即
18446744073709551615
当然我可以使用自定义函数,但它与SQL注入漏洞无关。MySQL的CONV()函数也限制为64位。如果需要更大的数字,请使用PHP的
base\u convert()
。我已经更新了我的答案来说明这一点。谢谢,但是
base\u convert()
返回
18446744073709552046
ffffffffffff
不正确。正确的值为
18446744073709551615