gpt4 book ai didi

php - 为什么我应该将 REMOTE 和 FORWARDED 都存储为用户的 IP?

转载 作者:行者123 更新时间:2023-11-29 01:37:09 28 4
gpt4 key购买 nike

目前我得到usr的IP是这样的:

if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) ){
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif ( isset($_SERVER['REMOTE_ADDR']) ) {
$ip = $_SERVER['REMOTE_ADDR'];
}

// IPs
+----+----------------+-------------+
| id | user_ip | date_time |
+----+----------------+-------------+
| 1 | 43.12.9.9 | 1468070172 |
| 2 | 173.3.0.1 | 1468070667 |
+----+----------------+-------------+

但是现在,我在 here 中读到了这个:

if you are going to save the $_SERVER['HTTP_X_FORWARDED_FOR'], make sure you also save the $_SERVER['REMOTE_ADDR'] value. E.g. by saving both values in different fields in your database.

所以我将我的代码更改为:

$remote_add = $_SERVER['REMOTE_ADDR']; // I don't use isset() for this becase it is always set
$http_x_forwarded_for = isset( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : null;

// IPs
+----+----------------+----------------+-------------+
| id | remote | forwarded | date_time |
+----+----------------+----------------+-------------+
| 1 | 43.12.9.9 | NULL | 1468070172 |
| 2 | 93.35.40.1 | 173.3.0.1 | 1468070667 |
+----+----------------+----------------+-------------+

好的,我做的是正确的吗?我问这个是因为一些专业的程序员告诉我你做的是无用的,你只需要在列上作为用户的 IP。好吧,请有人帮我清理一下?如何正确获取用户IP?


我的最终代码:

foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED') as $key){
if (array_key_exists($key, $_SERVER) === true){
foreach (explode(',', $_SERVER[$key]) as $header){
$header = trim($header); // just to be safe
if (filter_var($header, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false){
$header = $header;
}
}
}
}

$user_ip = $_SERVER['REMOTE_ADDR'];

// IPs
+----+----------------+----------------+-------------+
| id | user_ip | header | date_time |
+----+----------------+----------------+-------------+
| 1 | 43.12.9.9 | NULL | 1468070172 |
| 2 | 93.35.40.1 | 173.3.0.1 | 1468070667 |
+----+----------------+----------------+-------------+

最佳答案

在 http 请求中,有人可以欺骗任何信息,除了远程地址。如果没有实际访问该 ip 地址上的调制解调器或该调制解调器/路由器后面的计算机,您将无法完成 tcp 握手。 REMOTE_ADDR 键始终设置为与您的服务器建立连接的设备。在某些情况下,该设备是用户使用的代理。

HTTP_X_FORWARDED_FOR header 是好的代理使用的 header ,用于表示命令代理代表他们加载页面的原始 ip 地址。然而,这个 header 可以被欺骗。有人可以在此 header 中发送任何信息,包括诸如 127.0.0.1 (localhost) 之类的有趣内容,甚至是 html 或仅假定该字段只能包含数字和点的服务器脚本,甚至是原始的不使用准备好的查询插入这些东西的服务器的 sql 语句。


唯一保证正确的信息是远程ip,但不一定是用户的ip。如果远程 ip 是代理,记录远程 ip 可能允许您联系欺诈行为的远程代理的所有者,让他们搜索他们的日志,哪个 ip 实际发出了该请求。在某些情况下,转发的 ip 可以在代理不打算掩盖使用代理的人的身份的情况下为您节省时间,这将允许您针对该 ip 而不是代理本身采取一些措施。

根据有根据的猜测,有时使用 HTTP_X_FORWARDED_FOR header ,有时使用 REMOTE_ADDR,将导致数据无法使用。您无法知道哪些数据可以信任,哪些数据不可以信任。

I'm asking this because a few professional programmers tell me what you doing is useless and you need just on column as user's IP.

如果你所做的是无用的,完全取决于你用它来做什么。如果要显示转发字段,请记住为显示它的上下文正确转义所有特殊字符。如果您只存储一个 ip,它将是远程 ip,完全忽略 HTTP_X_FORWARDED_FOR header 。这是您唯一可以完全信任的信息。

关于php - 为什么我应该将 REMOTE 和 FORWARDED 都存储为用户的 IP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38282302/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com