首页 > 编程技术 > php

禁止IP访问代码

发布时间:2016-11-25 15:26

if($_SERVER['HTTP_X_FORWARDED_FOR']){
     $onlineip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}elseif($_SERVER['HTTP_CLIENT_IP']){
     $onlineip=$_SERVER['HTTP_CLIENT_IP'];
}else{
     $onlineip=$_SERVER['REMOTE_ADDR'];
}
$onlineip =substrs($onlineip,16);
//截取IP
function substrs($content,$length) {
        if($length && strlen($content)>$length){
                $num=0;
                for($i=0;$i<$length-3;$i++) {
                        if(ord($content[$i])>127){
                                $num++;
                        }
                }
                $num%2==1 ? $content=substr($content,0,$length-4):$content=substr($content,0,$length-3);
                $content.='..';
        }
        return $content;
}
//分析IP是否在 列表内
function cvipfrom($ip){
        global $ipa0;
        $d_ip=explode(".",$ip);
        $f_n=file_exists("./ipdata/$d_ip[0].txt") ? "./ipdata/$d_ip[0].txt" : './ipdata/0.txt';
        $ip=implode('.',d_ip($d_ip));
        $db=fopen($f_n,"rb");
        flock($db,LOCK_SH);
        $d=fread($db,filesize($f_n));
        $s_ip="\n$d_ip[0].$d_ip[1].$d_ip[2]";
        if($s=strpos($d,$s_ip)){
                !($f=s_ip($db,$s,$ip)) && list($l_d,$ff)=nset($db);
        }else{       
                $s_ip="\n$d_ip[0].$d_ip[1]";
                if($s=strpos($d,$s_ip)){
                        !($f=s_ip($db,$s,$ip)) && list($l_d,$ff)=nset($db);
                }elseif($s=strpos($d,"\n$d_ip[0]") && $f_n=='./ipdata/0.txt'){
                        $s_ip="\n$d_ip[0]";
                        !($f=s_ip($db,$s,$ip)) && list($l_d,$ff)=nset($db);
                }else{
                        $f='';//IP 没有在受限列表内就返回空
                }
        }
        if(empty($f) && $s!==false){
                while(ereg("^$s_ip","\n".$l_d)!==false){
                        if($ipa0==1 || $f=s_ip($db,$s,$ip,$l_d)) break;
                        list($l_d,$cff)=nset($db);
                        $cff && $ff=$cff;
                }
        }
        fclose($db);
        return $f ? $f : $ff;
}
function s_ip($db,$s,$ip,$l_d=''){
        global $ipa0;
        if(!$l_d){
                fseek($db,$s+1,SEEK_SET);
                $l_d=fgets($db,100);
        }
        $ip_a=explode("\t",$l_d);
        $ip_a[0]=implode('.',d_ip(explode('.',$ip_a[0])));
        $ip_a[1]=implode('.',d_ip(explode('.',$ip_a[1])));
        if($ip<$ip_a[0]) $ipa0=1;
        if ($ip>=$ip_a[0] && $ip<=$ip_a[1]) return $ip_a[2].$ip_a[3];
}
function nset($db){
        $l_d=fgets($db,100);
        $ip_a=explode("\t",$l_d);
        return array($l_d,$ip_a[2].$ip_a[3]);
}
function d_ip($d_ip){
        for($i=0; $i<=3; $i++){
                $d_ip[$i]     = sprintf("%03d", $d_ip[$i]);
        }
        return $d_ip;
}


$ipfrom=cvipfrom($onlineip);
if(!empty($ipfrom)){ //ipfrom IP来源不为空...禁止访问 显示 FUCK YOU
    die("fuck you");
}
?>
[/code]

以上代码偷至 PHPWIND 4.0 ..ipdata请自己到 phpwind.net 下载...
phpwind 用来显示用户来源,偶反其道而行之...直接在 ipdata 内添加受限 IP...


 
一:

这个话题太老生常谈了.
在PHP.INI中将magic_quotes_gpc = On
确实能防得住一些注入式攻击,但这是不是万能的?
我们现在是将POST或者GET收到的变量,将其中的空格转换掉,标点符号,特殊字符全部转换为HTML编码.
演示的时候再将他还原.请问大家是如何做的?交流一下代码啊.

不过还是没有用的.防不了union语句,当你的SQL写得不规范的时候.
比如select * from news where id=$Id,这个变量$Id没有用小引号括起来,而且又没有判断这个$Id是不是数字字符串的时候,就肯定会被注入,就算magic_quotes_gpc = On也一样.
彻底的防注入的方法只有在SQL语句内将变量用小引号括起来,然后
magic_quotes_gpc = On,然后将空格转换掉,标点符号,特殊字符全部转换为HTML编码.
这样我认为就一劳永逸了,不知道有无漏网之鱼,请高手指教,我们现在开发的系统杜绝了注入的话,我才能睡上好觉.哈哈.
一般我是直接在每个页面用函数将_get,_post,_session等数据初步过滤

在具体写入数据库时候强制检查数据类型~

基本这些对一般的注入效果还是不错的

1 SQL语句最好通过sprintf格式化,再query
2 登陆检测之类的时候,最好通过一个值取出另一个值,然后进行比对
 
举例说明:
哈哈,那是我举的一个例子啊。我仔细的总结了一下,不被注入很容易。
总结如下:
magic_quotes_gpc = On这个打开,然后变量用小引号括住,别人想注入的话,得突破引号,所以他得在变量内加入小引号,加入小引号又会被magic_quotes_gpc = On给转义掉了,突破小引号失败。就干不了坏事。
还有一点就是在MYSQL中有两个注释标记,#和/*,通过这个能将后面的SQL语名注释掉,将这俩字符给转成ASC码或者HTML码。
然后就是注入攻击的爸妈是空格。
如select * from news where id=1 union select * from admin,如果我将空格给删除或者转换掉。
就成了select * from news where id=1unionselect*fromadmin,这是偷窃数据的下场。
select * from news where id=1; drop table news这里将空格弄掉.
select * from news where id=1; droptablenews无法执行。
所以说注入式攻击的爸妈是空格。空格被替换掉之后。真的是能安心睡觉了


最近在公司一边自学一边写PHP程序,由于公司对程序的运行效率要求很高,而自己又是个新手,一开始就注意程序的效率很重要,这里就结合网上的一些资料,总结下php程序效率优化的一些策略:

1.在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下,尽量用file_get_contents,因为他的效率高得多!但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题

2.尽量的少进行文件操作,虽然PHP的文件操作效率也不低的;

3.优化Select SQL语句,在可能的情况下尽量少的进行Insert、Update操作(在update上,我被恶批过);

4.尽可能的使用PHP内部函数(但是我却为了找个PHP里面不存在的函数,浪费了本可以写出一个自定义函数的时间,经验问题啊!);

5.循环内部不要声明变量,尤其是大变量:对象(这好像不只是PHP里面要注意的问题吧?);

6.多维数组尽量不要循环嵌套赋值;

7.在可以用PHP内部字符串操作函数的情况下,不要用正则表达式;

8.foreach效率更高,尽量用foreach代替while和for循环;

9.用单引号替代双引号引用字符串;

10.“用i+=1代替i=i+1。符合c/c++的习惯,效率还高”;

11.对global变量,应该用完就unset()掉

SQL注入式攻击是利用是指利用设计上的漏洞,在目标服务器上运行Sql命令以及进行其他方式的攻击,动态生成Sql命令时没有对用户输入的数据进行验证是Sql注入攻击得逞的主要原因。比如:
  如果你的查询语句是select * from admin where username=‘"&user&"‘ and password=‘"&pwd&"‘"
  那么,如果我的用户名是:1‘ or ‘1‘=‘1
  那么,你的查询语句将会变成:
select * from admin where username=‘1 or ‘1‘=‘1‘ and password=‘"&pwd&"‘"
  这样你的查询语句就通过了,从而就可以进入你的管理界面。
  所以防范的时候需要对用户的输入进行检查。特别式一些特殊字符,比如单引号,双引号,分号,逗号,冒号,连接号等进行转换或者过滤。
  需要过滤的特殊字符及字符串有:
 net user
 xp_cmdshell
 /add
 exec master.dbo.xp_cmdshell
 net localgroup administrators
 select
 count
 Asc
 char
 mid
 ‘
 :
 "
 insert
 delete from
 drop table
 update
 truncate
 from
 %
  下面是我写的两种关于解决注入式攻击的防范代码,供大家学习参考!
  js版的防范SQL注入式攻击代码~:
[CODE START]  
<script language="javascript">
<!--
var url = location.search;
var re=/^?(.*)(select%20|insert%20|delete%20from%20|count(|drop%20table
  |update%20truncate%20|asc(|mid(|char(|xp_cmdshell|exec%20master
  |net%20localgroup%20administrators|"|:|net%20user|‘|%20or%20)(.*)$/gi;
var e = re.test(url);
if(e) {
alert("地址中含有非法字符~");
location.href="error.asp";
}
//-->
<script>
[CODE END]
  asp版的防范SQL注入式攻击代码~:
[CODE START]
<%
On Error Resume Next
Dim strTemp
If LCase(Request.ServerVariables("HTTPS")) = "off" Then
一、Web服务器安全
PHP其实不过是Web服务器的一个模块功能,所以首先要保证Web服务器的安全。当然Web服务器要安全又必须是先保证系统安全,这样就扯远了,无穷无尽。PHP可以和各种Web服务器结合,这里也只讨论Apache。非常建议以chroot方式安装启动Apache,这样即使Apache和PHP及其脚本出现漏洞,受影响的也只有这个禁锢的系统,不会危害实际系统。但是使用chroot的Apache后,给应用也会带来一定的麻烦,比如连接mysql时必须用127.0.0.1地址使用tcp连接而不能用localhost实现socket连接,这在效率上会稍微差一点。还有mail函数发送邮件也是个问题,因为php.ini里的:
[mail function]
; For Win32 only.
SMTP = localhost
; For Win32 only.
sendmail_from = me@localhost.com
都是针对Win32平台,所以需要在chroot环境下调整好sendmail。

标签:[!--infotagslink--]

您可能感兴趣的文章: