首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL注入相关:为什么我的SQL查询只返回带有concatenate的部分值?

问SQL注入相关:为什么我的SQL查询只返回带有concatenate的部分值?
EN

Stack Overflow用户
提问于 2016-06-07 17:30:21
回答 2查看 330关注 0票数 1

我在试着理解我的问题是什么。也许我不理解拼接是如何工作的?在MySQL版本5.5.40-0+wheezy1中,会发生以下情况:

代码语言:javascript
复制
firstname='something'
salt='123456'

php中的普通查询是

代码语言:javascript
复制
UPDATE users SET firstname='$name' WHERE id=:uid;

我尝试将SQL注入到名字区域:

代码语言:javascript
复制
'+ (SELECT s FROM (SELECT salt as s FROM users WHERE username='something') AS saltEntry)+'

所以完整的查询是

代码语言:javascript
复制
UPDATE users SET firstname=''+ (SELECT s FROM (SELECT salt as s FROM users WHERE username='something') AS saltEntry)+'' WHERE id=:uid;

结果只出现在名字区域12或123中,而不是完整的字符串。

同样当我输入:test'+ (SELECT s FROM (SELECT salt as s FROM users WHERE username='something') AS saltEntry)+'

它还只返回12或123作为名字。

但是,当我在SQL server中不使用‘或+:UPDATE users SET firstname= (SELECT s FROM (SELECT salt as s FROM users WHERE username='something') AS saltEntry) WHERE id=:uid;时,它会将整个salt复制到firstname条目中,并且它可以工作。

我想知道我做错了什么?

EDIT1:根据@ MySQl,如果这个eggyal只是算术运算符,那么+就是算术运算符。我不能使用Concat(),因为单引号“开始”。那么如何将子查询插入到查询中呢?

回答:@eggyall在评论中。

EN

回答 2

Stack Overflow用户

发布于 2016-06-07 17:39:38

使用CONCAT():

您可以使用concat()函数来连接多个字符串,并将firstname和salt作为参数传递,以获得所需的结果:

代码语言:javascript
复制
UPDATE users SET firstname= CONCAT(firstname, (SELECT s FROM (SELECT salt as s FROM users WHERE username='something') AS saltEntry)) WHERE id=:uid;
票数 1
EN

Stack Overflow用户

发布于 2016-06-07 19:04:20

现在,当您将其应用于字符串时,MySQL首先将字符串转换为数字(始终等于0),并将该值与下一个操作数相加。所以,你总是会得到一个与数字操作数相等的结果(如果你有的话)。

正如您已经想到的,在这里使用CONCAT是正确的选择。

如果您不特别需要将select字符串附加到查询中,我建议对其进行一些改进,以避免其中存在过多的嵌套查询。

由于执行了更新,因此不能将值作为对同一个表的嵌套查询的结果。

代码语言:javascript
复制
UPDATE users as original 
JOIN users as salts USING(user_id) 
SET original.firstname = CONCAT({$first_name},salts.salt) 
WHERE salts.username='something'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37675527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档