Pfsense强制门户凭证生成无需登录防火墙

时间:2016-03-08 21:59:39

标签: pfsense

我想知道是否有任何方法可用于生成可在Pfsense强制门户中兑换的优惠券。基本上我有一个防火墙,为客人提供互联网到wifi路由器。我想为工作人员提供某种形式的界面,以便能够创建优惠券并将其提供给客户而无需登录到wifi。我在网上找到了两个潜在客户,https://sourceforge.net/projects/vouchergen/https://github.com/jpardobl/pfsense_vouchers_rest,但他们不再有效。有什么建议?提前谢谢。

1 个答案:

答案 0 :(得分:0)

我刚刚写完一个简单的php页面来做到这一点。它适用于mysql数据库,它只有两个表,一个用于凭证,另一个用于IP地址,我想授予对此页面的访问权。

一旦用户选择了凭证类型(分钟)并点击"生成"然后它在本地数据库中选择任何有效的凭证并将其标记为已使用。

以下是代码:

<!DOCTYPE html>
<html>
    <head>   
        <meta charset="UTF-8">
        <title>Vouchers DSA</title>
    </head>
    <body> 
        <?php
        function gera_form(){
            ?>
            <style>
            table {
                font-family: arial, sans-serif;
                border-collapse: collapse;
                width: 100%;
            }
            td, th {
                border: 1px solid #dddddd;
                text-align: left;
                padding: 8px;
            }
            tr:nth-child(even) {
                background-color: #dddddd;
            }
        </style>
        <?php
            echo '<h2 align="center">Gerador de vouchers para WiFi</center></h2>';
            echo '<p align="center">Selecione a duração desejada e clique em "Gerar Voucher"</center></p>';
            echo '<br><br>';
            echo '<div align="center">';
            echo '<form method="POST">';
            echo '<select name="state">'; 
            echo '<option value="--">Duração</option>';
            echo '<option value="30">1/2 hora</option>';
            echo '<option value="60">1 hora</option>';
            echo '<option value="120">2 horas</option>';
            echo '<option value="1440">1 dia</option>';
            echo '<option value="43200">1 mês</option>';
            echo '</select>';
            echo '<br><br><input type="submit" value="Gerar Voucher">';
            echo '</form> </center>';
            echo '</div>';  
        }    
        $ip=get_client_ip();
        $hostname="localhost";  
        $username="root";  
        $password="771477";  
        $db = "banco_voucher";  
        $dbh = new PDO("mysql:host=$hostname;dbname=$db", $username, $password);       
        function get_client_ip() {
            $ipaddress = '';
            if (getenv('HTTP_CLIENT_IP'))
                $ipaddress = getenv('HTTP_CLIENT_IP');
            else if(getenv('HTTP_X_FORWARDED_FOR'))
                $ipaddress = getenv('HTTP_X_FORWARDED_FOR');
            else if(getenv('HTTP_X_FORWARDED'))
                $ipaddress = getenv('HTTP_X_FORWARDED');
            else if(getenv('HTTP_FORWARDED_FOR'))
                $ipaddress = getenv('HTTP_FORWARDED_FOR');
            else if(getenv('HTTP_FORWARDED'))
               $ipaddress = getenv('HTTP_FORWARDED');
            else if(getenv('REMOTE_ADDR'))
                $ipaddress = getenv('REMOTE_ADDR');
            else
                $ipaddress = 'UNKNOWN';
            return $ipaddress;
        }
        function get_voucher($valor, $ip, $dbh){       
            $hostname="localhost";  
            $username="root";  
            $password="771477";  
            $db = "banco_voucher";  
            $dbh = new PDO("mysql:host=$hostname;dbname=$db", $username, $password);    
            foreach($dbh->query("update vouchers 
                                    set solicitado_por = 
                                    (select id_usuario from usuarios where ip_maquina = '$ip'), 
                                    solicitado_em = now(), 
                                    validade = 0
                                    where validade != 0 and minutos = '$valor'
                                    limit 1;" ) as $row);
        }
        function get_time($minutos){
            $dur = "";
            if ($minutos == 30) {
                $dur = "1/2 hora";
            } else if ($minutos == 60) {
                $dur = "1 hora";
            } else if ($minutos == 120) {
                $dur = "2 horas";
            } else if ($minutos == 1440) {
                $dur = "1 dia";
            } else if ($minutos == 43200) {
                $dur = "1 mes";
            } else {
                $dur = "desconhecida";
            }
            return $dur;
        }
        function gera_tabela($ip){
            $hostname="localhost";  
            $username="root";  
            $password="771477";  
            $db = "banco_voucher";  
            $dbh = new PDO("mysql:host=$hostname;dbname=$db", $username, $password);      
            $historico = array("<table>
                                <tr>
                                <th>Departamento</th>
                                <th>Voucher</th>
                                <th>Duracao</th>
                                <th>Data</th>
                                </tr>",);
            $teste = array ("a");
            try {
                $select = $dbh->query("select b.departamento, 
                                        a.cod_voucher, a.minutos, 
                                        date_format(a.solicitado_em, '%d/%c/%Y - %H:%i:%s') as stamp 
                                        from vouchers as a
                                        right join usuarios as b on (solicitado_por = id_usuario)
                                        where ip_maquina = '$ip' and cod_voucher is not null
                                        order by stamp desc limit 10;");
            } catch (Exception $exc) {
                echo $exc->getTraceAsString();
            }
            $result = $select->fetchAll();
            echo "<br><br>";
            echo $historico[0];
            $i = 0;
            foreach($result as $row){
                $dur = get_time($row['minutos']);        
                array_push($historico, "<tr><td>".$row['departamento']."</td>"
                        . "<td>".$row['cod_voucher']."</td>"
                        . "<td>".$dur."</td>"
                        . "<td>".$row['stamp']."</td>"
                        . "</tr>");
                $i++;
                echo $historico[$i];       
            }
            echo "</table>";
        }
        foreach($dbh->query("select-count(ip_maquina) as ip from usuarios where ip_maquina = '$ip';") as $row){
            if($row['ip'] == 0){
                echo "<h1>Acesso negado</h1>";
                echo "<p>Sua estação de trabalho não tem as permissões de acesso necessárias."
                        . "<br>Contate a equipe de TI para mais informações.</p><hr>";
                echo "<address>Gestão de vouchers - Divisão Sul Americana da IASD</address>";
            }
            else if($row['ip'] != 0){
                gera_form();
                get_voucher($_POST['state'], $ip);
                gera_tabela($ip);
                if(isset($_POST['state'])){
                    header("Location:SandBox.php");
                    unset($_POST['state']);
                    if($_POST['state']=="--"){
                        echo "Escolha um tempo apropriado para a validade do voucher.";
                    }
                }
            }     
    }
        ?>
    </body>
</html>

由于这是我的第一个php页面,它可能是一个经验丰富的php程序员的眼中的灾难,但它非常实用,并且正确地做你想要的。

将上面的代码复制到名为SandBox.php的文件中,并放在Apache / www / html文件夹中。

可以使用以下代码创建mysql中的表:

对于优惠券:

CREATE TABLE `vouchers` (
  `id_voucher` int(11) NOT NULL AUTO_INCREMENT,
  `cod_voucher` varchar(10) DEFAULT NULL,
  `validade` bit(1) DEFAULT NULL,
  `solicitado_em` varchar(20) DEFAULT NULL,
  `solicitado_por` varchar(15) DEFAULT NULL,
  `minutos` int(11) DEFAULT NULL,
  PRIMARY KEY (`id_voucher`)
) ENGINE=InnoDB AUTO_INCREMENT=131073 DEFAULT CHARSET=utf8;

您必须在“验证”栏中进行手动更新。设置值&#39; 1&#39;所有优惠券的[含义有效]。在页面挑选后,它将更新为&#39; 0&#39; 0 [意思是使用]。

update vouchers set validade = 1;

对于允许访问该页面的IP地址:

CREATE TABLE `usuarios` (
  `id_usuario` int(11) NOT NULL AUTO_INCREMENT,
  `ip_maquina` varchar(15) DEFAULT NULL,
  `departamento` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id_usuario`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

您必须在此表中手动插入,解析管理机器的IP地址及其名称/位置/标签/您想用作人类可读ID的任何内容。

insert into usuarios(ip_maquina, departamento) values ('10.91.198.12', 'Cyber Cafe');

PS:字段名称是葡萄牙语。

将.csv文件从PfSense加载到本地数据库中:

LOAD DATA LOCAL INFILE '/home/infra/Downloads/vouchers.csv' 
INTO TABLE vouchers
LINES TERMINATED BY '\n' (cod_voucher);

希望它可以帮到你。

相关问题