2009-07-01 41 views
0

我正在设置一个cookie。例如:查询MySQL中的SHA salt

$_COOKIE['test'] = SHA1('124'.'mysalt'); 

现在124是我的id我想要的。所以在我的MySQL表中,我试图运行如下查询:

$sql = ("SELECT * FROM users WHERE SHA1(`id`) = '".mysql_real_escape_string($_COOKIE['test'])."'"); 

如何将“mysalt”添加到SQL查询中?因为否则我想要得到正确的ID。

回答

4

使用可以使用Concat()了点。

SELECT ... Sha1(Concat(`id`, 'mysalt'))=... 
+0

请记住:MySQL不能使用索引来加快在这种情况下,搜索。向表中添加另一个字段可能会更好,因此您可以查询类似SELECT ... WHERE id = 124和tempkey ='87gesafouvgbaesofiuigsaf' – VolkerK 2009-07-01 08:20:55

1

查询应该是:

$sql = ("SELECT * FROM users WHERE SHA1(CONCAT(`id`,`mysalt`)) = '".mysql_real_escape_string($_COOKIE['test'])."'"); 

如果我理解你正在试图做正确的。

+0

没有检查新答案,但我花了太长时间回答,我的错误。 – Roberto 2009-07-01 08:16:38

+1

这样做是丑陋的,并会表演崩溃的`users`表将增长,因为MySQL将不得不计算`SHA1(CONCAT(“身份证”,“mysalt”))`每次执行请求的时间。考虑添加包含`SHA1(CONCAT( '身份证', 'mysalt'))`新列`id_hash`,指数,并把你的请求过滤的`id_hash = mysql_real_escape_string($ _ COOKIE [ '测试'])` – MaxAuray 2015-09-15 08:46:47

0

使用CONCAT:

$sql = ("SELECT * FROM users WHERE SHA1(CONCAT(`id`,'mysalt')) = '".mysql_real_escape_string($_COOKIE[''test''])."'"); 
1

可能已经提供的解决方案将工作得很好,但是你一定要做到这一点?如果字段“id”确实是一个明确的标识,那么可以使用“LIMIT 1”来停止mysql搜索所有项目。另一件事是,为什么你不使用一个单独的预先计算的领域呢?我的意思是在每个查询中,mysql不必要地计算所有这些sha1值。最后一件事。我不确定你为什么使用你的方法,但我最好的猜测是实现某种会话密钥。我认为这是一个坏主意,原因有两个:如果有人拿到你的盐,他可以访问你的所有账户。如果有人嗅探一个“会话”,他可以随时重用。选择弱盐会产生严重的后果。 HTH。