我在试着理解我的问题是什么。也许我不理解拼接是如何工作的?在MySQL版本5.5.40-0+wheezy1中,会发生以下情况:
firstname='something'
salt='123456'php中的普通查询是
UPDATE users SET firstname='$name' WHERE id=:uid;我尝试将SQL注入到名字区域:
'+ (SELECT s FROM (SELECT salt as s FROM users WHERE username='something') AS saltEntry)+'所以完整的查询是
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在评论中。
发布于 2016-06-07 17:39:38
使用CONCAT():
您可以使用concat()函数来连接多个字符串,并将firstname和salt作为参数传递,以获得所需的结果:
UPDATE users SET firstname= CONCAT(firstname, (SELECT s FROM (SELECT salt as s FROM users WHERE username='something') AS saltEntry)) WHERE id=:uid;发布于 2016-06-07 19:04:20
现在,当您将其应用于字符串时,MySQL首先将字符串转换为数字(始终等于0),并将该值与下一个操作数相加。所以,你总是会得到一个与数字操作数相等的结果(如果你有的话)。
正如您已经想到的,在这里使用CONCAT是正确的选择。
如果您不特别需要将select字符串附加到查询中,我建议对其进行一些改进,以避免其中存在过多的嵌套查询。
由于执行了更新,因此不能将值作为对同一个表的嵌套查询的结果。
UPDATE users as original
JOIN users as salts USING(user_id)
SET original.firstname = CONCAT({$first_name},salts.salt)
WHERE salts.username='something'https://stackoverflow.com/questions/37675527
复制相似问题