php实现一个记录访问次数 次日归零 并具有防攻击注入功能

以下代码实现尝试从当日日期对应的文件中读取访问次数,然后每次增加一次访问次数并保存到文件中。在输出当日访问次数后,如果当前时间已经超过凌晨12点,则将访问次数归零。

例如,如果在2023年4月10日9点访问这个脚本,则输出访问次数为1,如果在2023年4月11日1点访问,则访问次数将被归零。

请注意,这个例子并没有考虑文件读写权限、跨时区时间等问题,可以根据实际情况进行改进

实现代码如下:

<?php
/**
 * 防止注入函数
 * @param string $str 待处理字符串
 * @return string       返回经过处理的字符串
 */
function prevent_injection($str) {
    $str = addslashes(trim($str));
    $str = str_replace("_", "\_", $str);
    $str = str_replace("%", "\%", $str);
    $str = nl2br($str);
    $str = htmlspecialchars($str);
    return $str;
}

// 获取当前日期
$date_today = prevent_injection(date('Ymd'));

// 尝试从文件中读取当日访问次数
$count = 0;
$filename = prevent_injection($date_today) . '.txt';
if (file_exists($filename)) {
    $count = intval(file_get_contents($filename));
}

// 增加一次访问次数
$count++;
file_put_contents($filename, strval($count));

// 输出当日访问次数
echo '今日访问次数:' . $count;

// 如果当前时间已经超过凌晨12点,则归零访问次数
if (date('H') >= 0 && date('i') >= 0) {
    file_put_contents($filename, '0');
}
?>

在代码中增加了一个名为`prevent_injection`的函数来防止注入。该函数使用了`addslashes`和`htmlspecialchars`两种方法来过滤输入参数中的特殊字符,使得用户无法通过输入特殊字符来攻击我们的程序。同时,我们使用`str_replace`来转义`%`和`_`字符,以保证查询时不会发生错误。最后,我们使用`nl2br`函数来将换行符`
`转换为HTML的`<br>`标签,以便在页面中正确显示。

同时,也对日期和文件名进行了过滤,保证我们的文件名只能为数字格式,防止攻击者通过伪造文件名来进行攻击。

© 版权声明
THE END