欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

请问这个PHP下防范MySQL注入攻击的方法管用吗?

程序员文章站 2022-04-13 20:34:05
...
function strinput($input)
{
$input=strval($input);
$replace=array('union','load','and','or','select','update','insert','delete','create','char','ascII','ord','conv','=','--','#','*','%','_','\\','\'',"\"");
$input=str_ireplace($replace,"0",$input);
return $input;
}

定义一个这样的过滤函数,对所有GPC来的字符串数据都先过一遍。这样可以完全防范MySQL注入攻击吗?

回复内容:

这类的过滤只能给注入者增加一些麻烦,远远做不到完全防范。
1、注入者可以用sElEcT来代替select
2、注入者可以用selselectect来让你过滤一遍,尝试获得select
3、注入者可以用url码来替代所有输入
4、注入者可以。。。用很多种方法,试出你的过滤函数是什么样的
你和注入者的技能可以在遭受泄露的拉锯战中不断获得提升。
直到你使用了以下方法的其中之一,才开始踏上了安全的征程:
1、白名单。严格定义只能输入哪些字符来查询,其他一律不行。
2、参数化查询。先将SQL语言编译,再代入参数。这时候就算他提交了select * from password where table=admin也只会去查询这一长串字符而不会执行SQL语句了。php下的示例如李世光所说。 这个函数做到完全防范MySQL注入攻击还是比较难的,攻与防本来就是动态的,要是实现一劳永逸的防守还是有难度的。

1、针对一些安全防御,可能目前没法绕过,但是随着对攻击技术的研究可能就会出现绕过方法,像dedecms、dz等的安全防御经常被bypass。
2、根据你业务的不同,实现业务的代码可能就提供了绕过方法。例如一个简单的搜索业务,可能在后面的代码会调用urldecode解码函数:
.....
$q = strinput($_GET['query']);
$q = urldecode($q);
$sql = "select * from table where key='".$q."'";
.....
你在urldecode前面做的所有过滤都是徒劳的

要做到尽量减少安全漏洞不只是sql注入,需要在恰当的地方做正确的事情。这可能要了解一些安全知识,像《白帽子讲web安全》,《web前端黑客》都是web安全不错的书籍。

php安全的在线文档(e文):Survive The Deep End: PHP Security 关于mysql防护其实很简单。
1.使用PDO::prepare PDO::bindParam来过滤输入参数
2.将HTML转成实体 htmlspecialchars 用PHP的PDO扩展去使用数据库,该扩展封装的类和方法已经考虑了防注入。 用PHP的安全函数在query的时候把变量转义一下就可以了。 建议使用参数化查询或白名单。
黑名单几乎在任何时候都是不可取的。 请使用pdo 不要自作聪明地过滤,总会有遗漏的地方的,你过滤不完的。
请用pdo + 参数绑定,一劳永逸,一了百了。 你要注意到,这样子很有可能过滤用户的合法输入。
过滤sql注入的方法常见的有如下两种:
1 mysql_real_escape_string
2 pdo的prepare+bind

另,网站安全性不止是sql注入一方面,还要考虑到csrf和xss等。 字符串过滤:
1>mysql_real_escape_string
2>PDO::prepare