2016-09-23 41 views
1

情况:未注册用户访问网站并发出物品请求。根据当前的数据流,这个请求首先被插入到数据库中,然后请求标识将在后续页面的URL中继承(用户可以在其中添加更多信息)。防止用户操纵查询字符串参数

问题:用户可以更改ID。

是我迄今所做的:只要我检索请求后,ID是通过使用lastInsertId()插入,我将其存储在会话变量中,并在对阵ID后续页面从$ _GET检查。我还实施了CRSF保护,但是当令牌匹配时,会话令牌未设置。因此,即使用户在相同的URL上刷新,检查也会失败。

我该如何解决这个问题?请指出我缺乏的概念。当许多并发用户发出请求时,服务器将确定哪个用户是哪个用户的唯一会话id,对于不同的用户会有所不同,是否正确?由于这种并发性,是否会有任何问题或漏洞?

+1

添加会话是一个好方法。除此之外,您还可以使用存储在配置中的一些盐手动散列Id。你也可以使用类似天和年组合的东西作为盐,在这种情况下它会保持一天不变。将盐与ID一起传递并重新检查盐和会话,如果它们匹配,则继续, – AtulBhatS

+0

感谢@AtulBhatS!使用mcrypt_create_iv()可以照顾盐吗?只是尝试与stackoverflow的url一样,它将我重定向到另一个问题。猜猜这取决于有问题的数据的敏感性:) – Bonzo

回答

3

基于''(用户可以添加更多信息)'我假设你正在使用某种形式/ POST来获取数据? 我会使用AtulBhatS评论中陈述的技术并使用散列数据。您可以在GET中设置散列数据,或者将它设置在前面提到的表单/ POST字段中的隐藏字段中。

基本上它是这样的:

$id = $thisRequestIdOfYours; 
$hash = hash('sha512', 'aRandomSaltStringOnlyKnownByYourScript'.$id); 

只需使用这2个值作为$ _GET(而不是只有$ ID,像你现在这样做)。或者将其设置在隐藏字段中。

在后的重发,你可以做一个检查:由于“盐”(aRandomSaltStringOnlyKnownByYourScript)仅脚本这是非常非常困难的解码和改变与该进去已知的

// Use $_POST if you use the hidden field way. 
if(hash(sha512, 'aRandomSaltStringOnlyKnownByYourScript'.$_GET['id']) !== $_GET['superSecretHash']) { 
    // h4x0r d3tect3d 
    die('you have no business here'); 
} 

哈希以匹配手动更改的ID。

显然就像所有的通行证一样,盐越强,裂缝越难。因此,请输入一些空格,数字或甚至其他字符来抓住坏人。

0

理想情况下,您应该避免保留在urls中隐藏的数据,所以我建议您应用Pim的解决方案,但将散列值存储在cookie中,而不是经典用户比url参数更难以访问。