phpsql注入
sql 注入的问题,是利用sql本身的漏洞来爆库的啊,防止sql注入,主要是在接到的数据入库的时候,把数据进行过滤即可,mysql_real_escape_string(),php.ini中的magic_quotes_gpc,magic_quotes_runtime参数(尽量不要使用),addslashes(),htmlspecialchars()也可以的,可以过滤一些字符串等,如果接到的只为整型可用intval(),其实sql注入,主要是防止一些特殊字符,例如:*,-,<,>等等
⑵ php如何防范sql注入攻击
数据进行转义,
数据类型要转换判断,如id,要强制转换为整形。
mysql语句中 值要加上单引号
$username=addslashes($_GET['username']);
$id=intval($_GET['id']);
$sql="update member set username='$username' where id='id'";
ps:配置环境不同,有的环境下会对提交的数据自动进行转义,注意不要重复转义
⑶ PHP中该怎样防止SQL注入
比较有效的方式,放入到公共的配置文件中。360safe.php
<?php
//CodeBySafe3
functioncustomError($errno,$errstr,$errfile,$errline)
{
echo"<b>Errornumber:</b>[$errno],erroronline$errlinein$errfile<br/>";
die();
}
set_error_handler("customError",E_ERROR);
$getfilter="'|(and|or)\b.+?(>|<|=|in|like)|\/\*.+?\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)";
$postfilter="\b(and|or)\b.{1,6}?(=|>|<|\bin\b|\blike\b)|\/\*.+?\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)";
$cookiefilter="\b(and|or)\b.{1,6}?(=|>|<|\bin\b|\blike\b)|\/\*.+?\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)";
functionStopAttack($StrFiltKey,$StrFiltValue,$ArrFiltReq){
if(is_array($StrFiltValue))
{
$StrFiltValue=implode($StrFiltValue);
}
if(preg_match("/".$ArrFiltReq."/is",$StrFiltValue)==1){
//slog("<br><br>操作IP:".$_SERVER["REMOTE_ADDR"]."<br>操作时间:".strftime("%Y-%m-%d%H:%M:%S")."<br>操作页面:".$_SERVER["PHP_SELF"]."<br>提交方式:".$_SERVER["REQUEST_METHOD"]."<br>提交参数:".$StrFiltKey."<br>提交数据:".$StrFiltValue);
print"360websecnotice:Illegaloperation!";
exit();
}
}
//$ArrPGC=array_merge($_GET,$_POST,$_COOKIE);
foreach($_GETas$key=>$value){
StopAttack($key,$value,$getfilter);
}
foreach($_POSTas$key=>$value){
StopAttack($key,$value,$postfilter);
}
foreach($_COOKIEas$key=>$value){
StopAttack($key,$value,$cookiefilter);
}
if(file_exists('update360.php')){
echo"请重命名文件update360.php,防止黑客利用<br/>";
die();
}
functionslog($logs)
{
$toppath=$_SERVER["DOCUMENT_ROOT"]."/log.htm";
$Ts=fopen($toppath,"a+");
fputs($Ts,$logs." ");
fclose($Ts);
}
?>
⑷ php如何防止sql注入
这个方法比较多,这里简单举个例子:
提交的变量中所有的
'
(单引号),
"
(双引号),
\
(反斜线)
and
空字符会自动转为含有反斜线的转义字符,给SQL注入带来不少的麻烦。
请看清楚:“麻烦”而已~这并不意味着PHP防范SQL注入,书中就讲到了利用改变注入语句的编码来绕过转义的方法,比如将SQL语句转成ASCII编码(类似:char(100,58,92,108,111,99,97,108,104,111,115,116…)这样的格式),或者转成16进制编码,甚至还有其他形式的编码,这样以来,转义过滤便被绕过去了
//
去除转义字符
function stripslashes_array($array) {
if (is_array($array)) {
foreach ($array as $k => $v) {
$array[$k] = stripslashes_array($v);
}
}
else if (is_string($array)) {
$array = stripslashes($array);
} return $array;
}
@set_magic_quotes_runtime(0); // 判断 magic_quotes_gpc 状态
if (@get_magic_quotes_gpc()) {
$_GET = stripslashes_array($_GET);
$_POST = stripslashes_array($_POST);
$_COOKIE = stripslashes_array($_COOKIE);
}PHP防范SQL注入的代码
$keywords = addslashes($keywords); $keywords =
str_replace("_","\_",$keywords);//转义掉”_” $keywords =
str_replace("%","\%",$keywords);//转义掉”%”
⑸ php如何防止sql注入
额,这是我老师给的答案
答:过滤一些常见的数据库操作关键字,
select ,insert,update,delete,and,*等或通过系统函数addslashes对内容进行过滤
php配置文件中register_globals=off;设置为关闭状态.(作用将注册全局变量关闭);如接收POST表单的值使用$_POST['user'],假设设置为ON的话$user才接收值
sql语句书写的时候尽量不要省略小引号(tab上面那个)和单引号
提高数据库命名技巧,对于一些重要的字段根据程序的特点命名,使之不易被猜中
对于常的方法加以封装,避免直接暴漏SQL语句
开启PHP安全模式safe_mode=on
打开magic_quotes_gpc来防止SQL注入,默认为关闭,开启后自动把用户提交sql查询语句进行转换把"'"转换成"\'"
控制错误信息输出,关闭错误信息提示,将错误信息写到系统日志
使用MYSQLI或PDO预处理
⑹ php防sql注入,同时要求记录下攻击的数据
sql过滤参数放在$keyword变量里,如单双引号、and、or空格等,这里过滤了get post cookie变量,根据需要在$input删减,例如文章提交的页面就没必要过滤post变量。
攻击信息保存在sql.txt
<?php
$keyword = array("'",'"','and','or',' ');
$input = array(&$_GET,&$_POST,&$_COOKIE);
foreach($input as $k){
foreach($k as $name=>$value){
foreach($keyword as $key){
if(strpos($value, $key)!==false){
$fp=fopen('sql.txt','a');
fputs($fp,date("Y-m-d H:i:s")."\t$_SERVER[REMOTE_ADDR]\t$_SERVER[SCRIPT_NAME]\t$value\r\n");
fclose($fp);
die("非法参数");
}
}
}
}
⑺ php sql注入 强制类型转换
<?php
$id=intval($_GET['id']);
$sql="select * from `user` where id='{$id}'";
⑻ 这样的php代码能不能被SQL注入攻击
base64_encode 不能有效的防御sql注入
看下php的文档有段描述
Base64-encoded data takes about 33% more space than the original data.
就是encode后的内容比原来的内容要多占33%的空间
真的要预防sql注入还是用 预处理 用php中的 pdo或者mysqli都支持预处理
⑼ sql注入与转义的php函数代码
sql注入:
正常情况下:
delete.php?id=3;
$sql
=
'delete
from
news
where
id
=
'.$_GET['id'];
恶意情况:
delete.php?id=3
or
1;
$sql
=
'delete
from
news
where
id
=
3
or
1';
-------如此执行后,所有的记录将都被删除
应该采取相关措施。。。比如用之前先判断是否是数字等等。
要使自己相信,从客户端传来的信息永远是不可靠的!!
转义:
有时候从客户端传来的数据,可能恶意包含些特殊的字符,比如单引号、斜杠等,所以需要转义,转义成普通的字符,此时就要用到string
addslashes
(
string
$str
),这个函数可以对某个变量进行转义。但是,如果对数组里的元素进行转义,就用foreach循环数组,如下:
复制代码
代码如下:
foreach($_POST
as
$k=>$v)
{
if(is_string($v))
{
$_POST[$k]
=
addslashes($v);
}
}
但是如果数组中还包含数组,那就要递归进行转义了,此时用到
array_walk_recursive(array
&$input
,
callback
$funcname
[,
mixed
$userdata
])
将用户自定义函数
funcname
应用到
array
数组中的每个单元。本函数会递归到更深层的数组中去。典型情况下
funcname
接受两个参数。input
参数的值作为第一个,键名作为第二个。如果提供了可选参数
userdata,将被作为第三个参数传递给
callback
funcname。成功时返回
TRUE,
或者在失败时返回
FALSE
也就是说:用自定义的函数,至少要能接收两个参数,而addslashes()只能接收一个参数所以自定义一个函数如下:
复制代码
代码如下:
function
a(&$v,$k){
$v=addslashes($v);
}
array_walk_recursive(&$arr,'a');
系统自动转义:
PHP中,有一个魔术引号的概念,如何打开?答:在PHP.ini中,magic_quotes_gpc=On;重启apache即可
魔术引号被打开后,系统会自动对$_GET,$_POST,$_COOKIE数据进行转义,在不知情的情况下,再次进行手动转义的话,就转多了,要想合理的进行转义,就要首先判断,魔术符号是否已经打开了,用magic_quotes_gpc()进行判断,不需要传值,关闭返回0,关闭返回1
复制代码
代码如下:
if(!get_magic_quotes_gpc())
{
//
如果魔术引号没开
function
_addslashes(&$v,$k)
{
$v
=
addslashes($v);
}
array_walk_recursive(&$_GET,'_addslashes');
array_walk_recursive(&$_POST,'_addslashes');
array_walk_recursive(&$_COOKIE,'_addslashes');
}
⑽ PHP SQL注入攻击
这是服务器端的魔法引号。你可以看看你的magic_quotes_gpc是否开启状态,如果开启了,所有的引号会被自动转义,防止此类SQL注入。
另外,就算没有开启魔法引号,PHP脚本里面也可以通过addslashes对$_GET、$_POST、$_COOKIE等等作转义处理,也就是在引号前加上“\”转义符号,防止此类SQL注入。
至于攻击的方法,这条SQL在我看来还是很安全的,从别的地方下手吧~~~