程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 淺析MySQL的注入平安成績

淺析MySQL的注入平安成績

編輯:MySQL綜合教程

淺析MySQL的注入平安成績。本站提示廣大學習愛好者:(淺析MySQL的注入平安成績)文章只能為提供參考,不一定能成為您想要的結果。以下是淺析MySQL的注入平安成績正文


假如把用戶輸出到一個網頁,將其拔出到MySQL數據庫,無機會分開了產生平安成績被稱為SQL注入關閉。這一課將教若何贊助避免這類情形的產生,並贊助掩護劇本和MySQL語句。

注入平日產生在處置一個用戶輸出,如他們的名字,而不是一個名字,他們給一個會在不知不覺中你的數據庫上運轉的MySQL語句。

永久不要信賴用戶供給的數據,只能驗證後處置這些數據,作為一項規矩,這是經由過程形式婚配。鄙人面的例子中,用戶名被限制為字母數字字符加下劃線的長度在8到20個字符之間 - 依據須要修正這些規矩。

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
{
  $result = mysql_query("SELECT * FROM users 
             WHERE username=$matches[0]");
}
 else 
{
  echo "username not accepted";
}

為了解釋這個成績,以為這是摘要:

// supposed input
$name = "Qadir'; DELETE FROM users;";
mysql_query("SELECT * FROM users WHERE name='{$name}'");

函數挪用應當是從用戶表中的稱號列的稱號相婚配用戶指定的檢索記載。在正常情形下,稱號只包括字母數字字符或空間,如字符串髂骨。但在這裡,給$name經由過程附加一個全新的查詢,挪用數據庫釀成災害:注入DELETE查詢刪除用戶的一切記載。

榮幸的是,假如應用MySQL,在mysql_query()函數不會許可查詢堆疊,或在一個單一的函數挪用履行多個查詢。假如測驗考試到堆放查詢則挪用掉敗。

其他PHP數據庫擴大,如SQLite和PostgreSQL則高興地停止堆查詢,履行在一個字符串中的一切的查詢,並創立一個嚴重的平安成績。
避免SQL注入:

可以處置一切的本義字符奇妙的劇本說話,好比Perl和PHP。 PHP的MySQL擴大供給的函數mysql_real_escape_string()輸出到MySQL的特別字符停止本義。

if (get_magic_quotes_gpc()) 
{
 $name = stripslashes($name);
}
$name = mysql_real_escape_string($name);
mysql_query("SELECT * FROM users WHERE name='{$name}'");

LIKE窘境:

為懂得決的LIKE成績,一個自界說的本義機制必需用戶供給的%和_字符轉換成文字。應用addcslashes()函數,讓可以指定一個字符規模本義。

$sub = addcslashes(mysql_real_escape_string("%something_"), "%_");
// $sub == \%something\_
mysql_query("SELECT * FROM messages WHERE subject LIKE '{$sub}%'");


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved