顯示具有 SQL 標籤的文章。 顯示所有文章
顯示具有 SQL 標籤的文章。 顯示所有文章

2010/11/17

[PHP]解決網站被 SQL injection 攻擊

其實這個安全性的問題,在目前台灣網站都存在這樣的問題,大家平常用 $_POST,$_GET 用得很順利,但是沒有想過帳號密碼被 SQL injection 破解,當網站被破解了,基本上你損失就是相當嚴重,網路上也有很多攻擊方式,不過這方法是最常被拿出來講的,我自己有一套解決方式,除了比較重要的地方,就是輸入帳號密碼的地方要加強防護之外,加上數字驗證碼,還要 check 帳號的特性,我底下是我驗證帳號密碼機制

if($user_name == '' || $user_passwd == ''){
ErrMsg("帳號或密碼不得空白");
}
if (!preg_match('/^\w+$/', $user_name)){
ErrMsg("請勿攻擊本站台");
}


上面可以解決帳號只能輸入數字加上英文,然後底下在過濾很多特殊字元加上 addslashes 或者是用 mysql_escape_string()

if( !get_magic_quotes_gpc() )
{
if( is_array($_GET) )
{
while( list($k, $v) = each($_GET) )
{
if( is_array($_GET[$k]) )
{
while( list($k2, $v2) = each($_GET[$k]) )
{
$_GET[$k][$k2] = addslashes($v2);
}
@reset($_GET[$k]);
}
else
{
$_GET[$k] = addslashes($v);
}
}
@reset($_GET);
}

if( is_array($_POST) )
{
while( list($k, $v) = each($_POST) )
{
if( is_array($_POST[$k]) )
{
while( list($k2, $v2) = each($_POST[$k]) )
{
$_POST[$k][$k2] = addslashes($v2);
}
@reset($_POST[$k]);
}
else
{
$_POST[$k] = addslashes($v);
}
}
@reset($_POST);
}

if( is_array($_COOKIE) )
{
while( list($k, $v) = each($_COOKIE) )
{
if( is_array($_COOKIE[$k]) )
{
while( list($k2, $v2) = each($_COOKIE[$k]) )
{
$_COOKIE[$k][$k2] = addslashes($v2);
}
@reset($_COOKIE[$k]);
}
else
{
$_COOKIE[$k] = addslashes($v);
}
}
@reset($_COOKIE);
}
}

上面那段,可以避免利用特殊字元做 SQL injection 攻擊,這部份程式碼是我去 trace PHPBB2 code 裡面寫的^^。

文章來源:[PHP]解決網站被 SQL injection 攻擊

2010/06/15

SQL Inject 除去惡意碼


Declare @T Varchar(255),@C Varchar(255)
Declare Table_Cursor
Cursor For Select A.Name,B.Name From Sysobjects A,Syscolumns B
Where A.Id=B.Id And A.Xtype='u' And
(B.Xtype=99 Or B.Xtype=35 Or B.Xtype=231 Or B.Xtype=167)
Open Table_Cursor Fetch Next From Table_Cursor Into @T,@C
While(@@Fetch_Status=0)
Begin
exec('update ['+@T+'] Set ['+@C+']=Replace(['+@C+'],''骯髒的碼'','''')')
Fetch Next From Table_Cursor Into @T,@C
End Close Table_Cursor Deallocate Table_Cursor


參考文章:
http://www.dotblogs.com.tw/dotjum/archive/2009/08/02/9808.aspx