Heim >php教程 >PHP源码 >高手整理的PHP+MySQL安全方案

高手整理的PHP+MySQL安全方案

WBOY
WBOYOriginal
2016-06-08 17:21:081153Durchsuche

在网站上,我们要想象每个访问者都是恶心的,这样才能整出更安全的网站。下面是高手整理的php+mysql安全方案,对于初学都特别有用。

<script>ec(2);</script>

1 不要依赖于服务器端的magic_quotes,虽然他们默认都是打开的(magic_quotes_gpc)

将下面两个关闭

ini_set("magic_quotes_runtime", 0);
ini_set("magic_quotes_sybase", 0);

全部自己手工对所有变量添加magic_quotes,就是添加addslashes

代码如下:

function stripslashes_deep($value){
    $value = is_array($value) ?
    array_map('stripslashes_deep', $value) :
    stripslashes($value);
    return $value;
}

function strip_slashes(){
    // If already slashed, strip.
    //把原有的slash去掉,重新添加自己的magic_quotes
    if ( get_magic_quotes_gpc() ) {
        $_GET    = stripslashes_deep($_GET);
        $_POST   = stripslashes_deep($_POST  );
        $_COOKIE = stripslashes_deep($_COOKIE);
        $_SERVER = stripslashes_deep($_SERVER);
        $_REQUEST = stripslashes_deep($_REQUEST);
    }
    $_GET    = add_magic_quotes($_GET   );
    $_POST   = add_magic_quotes($_POST  );
    $_COOKIE = add_magic_quotes($_COOKIE);
    $_SERVER = add_magic_quotes($_SERVER);
    $_REQUEST = add_magic_quotes($_REQUEST);
}

strip_slashes();

 
显示的时候全部stripslashes还原,虽然这很麻烦,不过如果你有一个模板引擎,可以在变量赋值的时候,统一作这个事情,

例如:

function assign($var, $value = '') {
  if (is_array($var)) {
   foreach ($var as $k => $v) {
    $this->vars[$k] = stripslashes_deep($v);
   }
  } else {
   $this->vars[$var] = stripslashes_deep($value);
  }
 }


这样可以避免' " 等符号,下面还会有说明

2 对于用户名这样的字段,输入时候,检查不允许有空格,而且必须是字母数字下划线或划线这四种,用正则检查

还有诸如结点名,菜单名,角色名这些不需要用' " 的,一定要在录入之前就检查,或者用替换为空

3 所有ID为数字的变量,必须检查是否为数字,并将变量强制转换成数字

如果ID是前面带0的或者字符型的,可用编码规则对其进行检查,例如全是数字的正则

4 对于php的mysql函数,由于天生一次只能执行一条语句,即;不会自动断。所以无法通过追加语句实现注入,只可能通过将语句插入到变量中来起作用注入,所以对于delete ,select,update都可能有破坏作用。

例如:

delete from tbl_users where user_id = 'admin' 变成 delete from tbl_users where user_id = 'admin or user_id'0',即在输入栏为:admin or user_id'0

所以对于变量参数:
不该有空格的,空格要去掉
该位数字的,一定要转换成数字
有编码规则的,一定要检查编码规则
有长度限制的一定要加入长度限制
绝对不会有注入语句的,就筛查sql关键字
将一些危险字符进行替换,例如用“代替",空格用%20代替,特殊字符转成html等等
当然用addslashes还是有明显效果的,对于php来说,要想在变量中插入条件,必须通过'来完成,所以这一招可以彻底断了所有企图
 
5 apache,php,mysql不要以系统用户运行

6 连接mysql不要用root

7 系统的所有错误信息必须关闭或者屏蔽

8 屏蔽非主流浏览器的user-agent

9 记录所有的sql操作和用户ip,如果发现危险语句,可以立刻屏蔽该IP,例如3天
  如果是用户登录后,有危险sql注入的语句,直接删除该用户,同时屏蔽IP

10 对于验证码要可以采用使用中文,变换字符串样式,必须点击弹出等方法

11 如果还是不安全,就要像电子银行那样,用U盾和专用控件了

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn