通过PHP获取用户IP地址的最准确方法是什么?
我已经阅读了很多关于它的SO问题和答案,但大多数答案都是陈旧的,用户评论说这些方法是不安全的.
例如,看看这个问题(2011):如何在PHP中获取客户端IP地址?
蒂姆肯尼迪的回答包含一个建议,使用如下:
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
Run Code Online (Sandbox Code Playgroud)
但正如我已经阅读了很多,我已经看到使用X_FORWARDED_FOR是不安全的,因为下面的评论强调:
除非您完全了解它的作用,否则请勿使用上述代码!由于这个原因,我已经看到了MASSIVE安全漏洞.客户端可以将X-Forwarded-For或Client-IP标头设置为它想要的任意值.除非您有可信的反向代理,否则不应使用任何这些值.
由于我完全不知道它的作用,我不想承担风险.他说它不安全,但没有提供一种安全的方法来获取用户的IP地址.
我试过这个简单的$_SERVER['REMOTE_ADDR'];,但这会返回错误的IP.我已经测试了这个,我的真实IP遵循这种模式:78.57.xxx.xxx但我得到的IP地址如下:81.7.xxx.xxx
所以你有什么想法吗?
我有下拉列表,选择任何值后它添加一些字段的新行,示例如下图所示:
我有insert.php将值插入MySQL数据库.但是有问题,只有第一行的值被插入到数据库中.
PHP看起来像:
foreach($_POST['CertificateType'] as $key => $val){
$CertificateType = $val;
$CertificateType = $_POST['CertificateType'][$key];
$STCWCode = $_POST['STCWCode'][$key];
$CertNo = $_POST['CertNo'][$key];
$FromCert = $_POST['FromCert'][$key];
$ToCert = $_POST['ToCert'][$key];
$CertificateType = mysqli_real_escape_string($link, $CertificateType);
$STCWCode = mysqli_real_escape_string($link, $STCWCode);
$CertNo = mysqli_real_escape_string($link, $CertNo);
$FromCert = mysqli_real_escape_string($link, $FromCert);
$ToCert = mysqli_real_escape_string($link, $ToCert);
$sql3 = "INSERT INTO Tbl (
CertificateType
,UserId
,STCWCode
,CertNo
,FromCert
,ToCert
,DateCreated
) VALUES (
'$CertificateType',
'$UserID',
'$STCWCode',
'$CertNo',
'$FromCert',
'$ToCert',
now())";
if(mysqli_query($link, $sql3)){
echo "Resume created successfully.";
} else{
echo …Run Code Online (Sandbox Code Playgroud) 用户试图检查每个销售员的销售额。样本数据:
Salesperson Sales Amount
001 1000
002 500
003 750
Grand Total: 2250
Run Code Online (Sandbox Code Playgroud)
看起来不错,但是Company > Class > Group > Subgroup多维数据集中具有以下层次结构,并且如果用户尝试在过滤器中使用此层次结构-总计总计将失败(如果在此层次结构中未选中任何属性)。样品:
Salesperson Sales Amount
001 1000
002 500
003 750
Grand Total: 350
Run Code Online (Sandbox Code Playgroud)
在尝试过滤Date属性之前,我已经注意到了相同的问题,如果不是每月的每一天都被选中,它也会显示错误的总计。
您是否知道为什么会发生以及如何解决?
销售金额是物理量度(不是计算量度),是从SQL视图中选择的(每个事实都相同)。
我在这里问过同样的问题,但是没人能回答。
我尝试删除所有MDX计算(作用域),但总计总数仍然不正确。
编辑
我注意到这样过滤时会发生问题:
如上图所示,从层次结构的第一级选择1个元素,从层次结构的第二级选择1个元素,从层次结构的第三级选择1个元素。
如果未过滤第3级,则显示良好的总计。
编辑2
我试图在SSAS上进行跟踪,它返回的输出与Excel中的输出完全相同。在行上使用Salesperson维度时,它生成了以下MDX:
SELECT NON EMPTY { [Measures].[Sales Amount] } ON COLUMNS,
NON EMPTY { ([Salesperson].[Salesperson].[Salesperson].ALLMEMBERS ) }
DIMENSION PROPERTIES MEMBER_CAPTION,
MEMBER_UNIQUE_NAME ON ROWS FROM (
SELECT ( { [Item].[Class - Group - Subgroup].[Class].&[XXX]&[1.],
[Item].[Class - …Run Code Online (Sandbox Code Playgroud) 我有电话号码的HTML输入框.
我使用InputMask的格式输入860000000在下面8 600 00 000打字时.
$(window).load(function()
{
var phones = [{ "mask": "# ### ## ###"}, { "mask": "# ### ## ###"}];
$('#phone').inputmask({
mask: phones,
greedy: false,
definitions: { '#': { validator: "[0-9]", cardinality: 1}} });
});
Run Code Online (Sandbox Code Playgroud)
我也使用HTML模式检查数字是否86以及总共9位数,但是InputMask它停止工作,并且无法以任何方式实现它:
<label for="phone" class="first-col">Mobile No.:</label>
<input type="text" id="phone" placeholder="8 600 00 000" required pattern="(86)\d{7}" />
Run Code Online (Sandbox Code Playgroud)
如果有效,CSS添加绿色边框:
input:required:valid {
box-shadow: 0 0 5px #5cd053;
border-color: #28921f;
}
Run Code Online (Sandbox Code Playgroud)
你有什么想法吗?
我有4列,我需要将每个列与边框分开.现在看起来像:
它应该是什么(例如红/蓝颜色):
问题是我没有列的任何div,我在内部生成行,<li> </li>因此内部的4个输入<li> </li>是1行:
<form class="form-style-9">
<h2>Personal details</h2>
<ul>
<div id="personal-details">
<li>
<div class="test">
<label for="Rank">Rank</label>
<input id="Rank" type="text" name="Rank" class="field-style field-split25 align-left" placeholder="Rank" />
</div>
<div class="test">
<label for="RankApplied">Rank Applied</label>
<input id="RankApplied" type="text" name="RankApplied" class="field-style field-split25 align-left" placeholder="Rank Applied" />
</div>
<div class="test">
<label for="Vesselstype">Vessel's type</label>
<input id="Vesselstype" type="text" name="Vesselstype" class="field-style field-split25 align-left" placeholder="Vessel's type" />
</div>
<div class="test">
<label for="datepicker2">Date Applied</label>
<input id="datepicker2" type="date" name="datepicker2" class="field-style field-split25-4 align-left" placeholder="Date Applied" />
</div>
</li> …Run Code Online (Sandbox Code Playgroud) 为了便于解释,我将尝试简化一切.
我有3个SQL表:Users,Certs,Serv
在Users表中存储有关唯一用户的详细信息.
在Certs表中存储有关证书和UserId具有此证书的用户的详细信息(1个用户可以拥有多个证书)
在Serv表中存储有关海上服务和UserId用户的详细信息(如Certs表,1个用户可以在Serv表中有多个条目)
样本数据
用户
UserId Name
1 John
2 Lisa
Run Code Online (Sandbox Code Playgroud)
证书
Id UserId CertName
1 1 A
2 1 B
3 1 C
4 2 A
5 2 C
Run Code Online (Sandbox Code Playgroud)
SERV
UserId Name
1 SA
1 SB
1 SC
1 SD
2 S2A
Run Code Online (Sandbox Code Playgroud)
我需要通过PHP检索输出(例如UserId = 1)同样对于现实,每个表中会有更多列(例如证书的更多细节,如发布日期,到期日期,发布地点等):
Personal details:
Name
John
Certificates:
Certificate Id Certificate Name
1 A
2 B …Run Code Online (Sandbox Code Playgroud) 本题针对Datatables插件为JQuery.
我需要遍历所有表格行(甚至分页)并获取id每个tr元素。
像这样的 HTML 表格:
<table>
<thead>
<tr>
<th>Header content 1</th>
<th>Header content 2</th>
</tr>
</thead>
<tbody>
<tr id="etc_1_en">
<td>Etc 1</td>
<td>Etc 2</td>
</tr>
<tr id="etc_1_ru">
<td>Etc 3</td>
<td>Etc 4</td>
</tr>
<tr id="etc_1_fr">
<td>Etc 5</td>
<td>Etc 6</td>
</tr>
<tr id="etc_2_en">
<td>Foo 1</td>
<td>Foo 2</td>
</tr>
<tr id="etc_2_ru">
<td>Foo 3</td>
<td>Foo 4</td>
</tr>
<tr id="etc_2_fr">
<td>Foo 5</td>
<td>Foo 6</td>
</tr>
</tbody>
</table>
Run Code Online (Sandbox Code Playgroud)
因此,如果最后 2 个字符不等于,我需要遍历每一行并隐藏行en(通过此检查一切正常,我正在使用substr)。
我可以遍历以下所有行:
tbl = $('#myTable').DataTable(); …Run Code Online (Sandbox Code Playgroud) html ×5
javascript ×3
jquery ×3
php ×3
mysql ×2
class ×1
css ×1
datatable ×1
datatables ×1
excel ×1
forms ×1
html5 ×1
input-mask ×1
ip ×1
pivot-table ×1
proxy ×1
regex ×1
security ×1
sql ×1
sql-server ×1
ssas ×1