⑴ 已知網站直接把變數加入的查詢語句中,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}'";