⑴ 已知网站直接把变量加入的查询语句中,php如何进行SQL注入
你说的只是php代码中可能会允许你使用注入语句,但是一般来说,网站防注入都是在链接数据库的类中加入了转换,也就是说把注入语句的关键字都加上了转义字符。比如你遇到的这种情况,就是被防注入了。
关于你这个问题:
问:输入框中的SQL语句应该如何写?
条件:数据库表、字段全已知,输入框长度不限。
我只能跟你说,你可以在输入框中加入;,/这种符号,让语句解析的时候出现问题,让php把sql语句拼合成两个或两个以上。这样你就可以在第二条语句之后加入你想要执行的命令了。
如果这种方法没有效果,你只能使用溢出的方式来注入!
⑵ PHP SQL注入攻击
这是服务器端的魔法引号。你可以看看你的magic_quotes_gpc是否开启状态,如果开启了,所有的引号会被自动转义,防止此类SQL注入。
另外,就算没有开启魔法引号,PHP脚本里面也可以通过addslashes对$_GET、$_POST、$_COOKIE等等作转义处理,也就是在引号前加上“\”转义符号,防止此类SQL注入。
至于攻击的方法,这条SQL在我看来还是很安全的,从别的地方下手吧~~~
⑶ PHP网站怎么sql注入有没有破解防御的方法
网站的运行安全肯定是每个站长必须考虑的问题,大家知道,大多数黑客攻击网站都是采用sql注入,这就是我们常说的为什么最原始的静态的网站反而是最安全的。 今天我们讲讲PHP注入的安全规范,防止自己的网站被sql注入。
如今主流的网站开发语言还是php,那我们就从php网站如何防止sql注入开始说起:
Php注入的安全防范通过上面的过程,我们可以了解到php注入的原理和手法,当然我们也同样可以制定出相应该的防范方法:
首先是对服务器的安全设置,这里主要是php+mysql的安全设置和linux主机的安全设置。对php+mysql注射的防范,首先将magic_quotes_gpc设置为On,display_errors设置为Off,如果id型,我们利用intval()将其转换成整数类型,如代码:
$id=intval($id);
mysql_query=”select *from example where articieid=’$id’”;或者这样写:mysql_query(”SELECT * FROM article WHERE articleid=”.intval($id).”")
如果是字符型就用addslashes()过滤一下,然后再过滤”%”和”_”如:
$search=addslashes($search);
$search=str_replace(“_”,”\_”,$search);
$search=str_replace(“%”,”\%”,$search);
当然也可以加php通用防注入代码:
/*************************
PHP通用防注入安全代码
说明:
判断传递的变量中是否含有非法字符
如$_POST、$_GET
功能:
防注入
**************************/
//要过滤的非法字符
$ArrFiltrate=array(”‘”,”;”,”union”);
//出错后要跳转的url,不填则默认前一页
$StrGoUrl=”";
//是否存在数组中的值
function FunStringExist($StrFiltrate,$ArrFiltrate){
foreach ($ArrFiltrate as $key=>$value){
if (eregi($value,$StrFiltrate)){
return true;
}
}
return false;
}
//合并$_POST 和 $_GET
if(function_exists(array_merge)){
$ArrPostAndGet=array_merge($HTTP_POST_VARS,$HTTP_GET_VARS);
}else{
foreach($HTTP_POST_VARS as $key=>$value){
$ArrPostAndGet[]=$value;
}
foreach($HTTP_GET_VARS as $key=>$value){
$ArrPostAndGet[]=$value;
}
}
//验证开始
foreach($ArrPostAndGet as $key=>$value){
if (FunStringExist($value,$ArrFiltrate)){
echo “alert(/”Neeao提示,非法字符/”);”;
if (empty($StrGoUrl)){
echo “history.go(-1);”;
}else{
echo “window.location=/”".$StrGoUrl.”/”;”;
}
exit;
}
}
?>
/*************************
保存为checkpostandget.php
然后在每个php文件前加include(“checkpostandget.php“);即可
**************************/
另外将管理员用户名和密码都采取md5加密,这样就能有效地防止了php的注入。
还有服务器和mysql也要加强一些安全防范。
对于linux服务器的安全设置:
加密口令,使用“/usr/sbin/authconfig”工具打开密码的shadow功能,对password进行加密。
禁止访问重要文件,进入linux命令界面,在提示符下输入:
#chmod 600 /etc/inetd.conf //改变文件属性为600
#chattr +I /etc/inetd.conf //保证文件属主为root
#chattr –I /etc/inetd.conf // 对该文件的改变做限制
禁止任何用户通过su命令改变为root用户
在su配置文件即/etc/pam.d/目录下的开头添加下面两行:
Auth sufficient /lib/security/pam_rootok.so debug
Auth required /lib/security/pam_whell.so group=wheel
删除所有的特殊帐户
#userdel lp等等 删除用户
#groupdel lp等等 删除组
禁止不使用的suid/sgid程序
#find / -type f \(-perm -04000 - o –perm -02000 \) \-execls –lg {} \;
⑷ 这样的php代码能不能被SQL注入攻击
base64_encode 不能有效的防御sql注入
看下php的文档有段描述
Base64-encoded data takes about 33% more space than the original data.
就是encode后的内容比原来的内容要多占33%的空间
真的要预防sql注入还是用 预处理 用php中的 pdo或者mysqli都支持预处理
⑸ 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注入问题
你说的只是php代码中可能会允许你使用注入语句,但是一般来说,网站防注入都是在链接数据库的类中加入了转换,也就是说把注入语句的关键字都加上了转义字符。比如你遇到的这种情况,就是被防注入了。
关于你这个问题:
问:输入框中的SQL语句应该如何写?
条件:数据库表、字段全已知,输入框长度不限。
我只能跟你说,你可以在输入框中加入;,/这种符号,让语句解析的时候出现问题,让php把sql语句拼合成两个或两个以上。这样你就可以在第二条语句之后加入你想要执行的命令了。
如果这种方法没有效果,你只能使用溢出的方式来注入!
如果帮助到您,请记得采纳为满意答案哈,谢谢!祝您生活愉快!
vae.la
⑺ 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注入
这个方法比较多,这里简单举个例子:
提交的变量中所有的
'
(单引号),
"
(双引号),
\
(反斜线)
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注入,同时要求记录下攻击的数据
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}'";