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在我看來還是很安全的,從別的地方下手吧~~~