php搜索中的sql注入(sql查詢注入)

本文目錄一覽:

淺談:在PHP中該怎樣防止SQL注入

使用預處理語句和參數化查詢。

禁止使用拼接sql語句,和參數類型驗證,就可以完全避免sql注入漏洞!

預處理語句和參數分別發送到數據庫服務器進行解析,參數將會被當作普通字符處理。這種方式使得攻擊者無法注入惡意的SQL。 你有兩種選擇來實現該方法:

1、使用PDO:

$stmt=$pdo-prepare(‘SELECT * FROM employees WHERE name = :name’);

$stmt-execute(array(‘name’=$name));

foreach($stmtas$row) {

// do something with $row

}

2、使用mysqli:

$stmt = $dbConnection-prepare(‘SELECT * FROM employees WHERE name = ?’);

$stmt-bind_param(‘s’, $name);

$stmt-execute();

$result = $stmt-get_result();

while($row = $result-fetch_assoc()) {

// do something with $row

}

PHP代碼網站如何防範SQL注入漏洞攻擊建議分享

做為網絡開發者的你對這種黑客行為恨之入骨,當然也有必要了解一下SQL注入這種功能方式的原理並學會如何通過代碼來保護自己的網站數據庫。今天就通過PHP和MySQL數據庫為例,分享一下我所了解的SQL注入攻擊和一些簡單的防範措施和一些如何避免SQL注入攻擊的建議。

簡單來說,SQL注入是使用代碼漏洞來獲取網站或應用程序後台的SQL數據庫中的數據,進而可以取得數據庫的訪問權限。比如,黑客可以利用網站代碼的漏洞,使用SQL注入的方式取得一個公司網站後台數據庫里所有的數據信息。拿到數據庫管理員登錄用戶名和密碼後黑客可以自由修改數據庫中的內容甚至刪除該數據庫。SQL注入也可以用來檢驗一個網站或應用的安全性。SQL注入的方式有很多種,但本文將只討論最基本的原理,我們將以PHP和MySQL為例。本文的例子很簡單,如果你使用其它語言理解起來也不會有難度,重點關注SQL命令即可。

一個簡單的SQL注入攻擊案例

假如我們有一個公司網站,在網站的後台數據庫中保存了所有的客戶數據等重要信息。假如網站登錄頁面的代碼中有這樣一條命令來讀取用戶信息。

$q

=

“SELECT

`id`

FROM

`users`

WHERE

`username`=

.$_GET[‘username’].

AND

`password`=

.$_GET[‘password’].

“;?現在有一個黑客想攻擊你的數據庫,他會嘗試在此登錄頁面的用戶名的輸入框中輸入以下代碼:

;

SHOW

TABLES;

點擊登陸鍵,這個頁面就會顯示出數據庫中的所有表。如果他現在使用下面這行命令:

‘;

DROP

TABLE

[table

name];

這樣他就把一張表刪除了!

防範SQL注入

使用mysql_real_escape_string()函數

在數據庫操作的代碼中用這個函數mysql_real_escape_string()可以將代碼中特殊字符過濾掉,如引號等。如下例:

$q

=

“SELECT

`id`

FROM

`users`

WHERE

`username`=

.mysql_real_escape_string(

$_GET[‘username’]

).

AND

`password`=

.mysql_real_escape_string(

$_GET[‘password’]

).

“;?防範SQL注入

使用mysql_query()函數

mysql_query()的特別是它將只執行SQL代碼的第一條,而後面的並不會執行。回想在最前面的例子中,黑客通過代碼來例後台執行了多條SQL命令,顯示出了所有表的名稱。所以mysql_query()函數可以取到進一步保護的作用。我們進一步演化剛才的代碼就得到了下面的代碼:

//connection

$database

=

mysql_connect(“localhost”,

“username”,”password”);

//db

selection

$q

=

mysql_query(“SELECT

`id`

FROM

`users`

WHERE

`username`=

.mysql_real_escape_string(

$_GET[‘username’]

).

AND

`password`=

.mysql_real_escape_string(

$_GET[‘password’]

).

“,

$database);?除此之外,我們還可以在PHP代碼中判斷輸入值的長度,或者專門用一個函數來檢查輸入的值。所以在接受用戶輸入值的地方一定要做好輸入內容的過濾和檢查。當然學習和了解最新的SQL注入方式也非常重要,這樣才能做到有目的的防範。如果使用的是平台式的網站系統如Wordpress,要注意及時打上官方的補丁或升級到新的版本。

php中防止SQL注入,該如何解決?

防sql注入的一個簡單方法就是使用框架,一般成熟框架中會集成各種安全措施。

當然也可以自己處理,如果用戶的輸入能直接插入到SQL語句中,那麼這個應用就易收到SQL注入的攻擊。我認為最重要的一點,就是要對數據類型進行檢查和轉義。

php.ini

————

display_errors 選項,應該設為 display_errors = off。這樣 php 腳本出錯之後,不會在 web 頁面輸出錯誤,以免讓攻擊者分析出有作的信息。

打開magic_quotes_gpc來防止SQL注入,magic_quotes_gpc= Off,這個默認是關閉的,如果它打開後將自動把用戶提交對sql的查詢進行轉換,比如把 ‘ 轉為 \’等,對於防止sql注射有重大作用。如果magic_quotes_gpc=Off,則使用addslashes()函數。

mysql 函數

—————

調用mysql_query 等mysql 函數時,前面應該加上 @,即 @mysql_query(…),這樣 mysql 錯誤不會被輸出。同理以免讓攻擊者分析出有用的信息。另外,有些程序員在做開發時,當mysql_query出錯時,習慣輸出錯誤以及sql 語句。

mysql_real_escape_string — 轉義 SQL 語句中使用的字符串中的特殊字符,並考慮到連接的當前字符集。

Sql語句

————

對提交的 sql 語句,進行轉義和類型檢查。如果請求是數值型,那麼調用is_numeric() 判斷是否為數值。如果不是,則返回程序指定的默認值。簡單起見,對於文本串,我將用戶輸入的所有危險字符(包括HTML代碼),全部轉義。由於php 函數 addslashes()存在漏洞,我用str_replace()直接替換。get_magic_quotes_gpc()函數是php  的函數,用來判斷magic_quotes_gpc 選項是否打開。

其它

———

使用預處理語句和參數化查詢(PDO或mysqli)。預處理語句和參數分別發送到數據庫服務器進行解析,參數將會被當作普通字符處理。這種方式使得攻擊者無法注入惡意的SQL。

已知網站直接把變量加入的查詢語句中,php如何進行SQL注入?

你說的只是php代碼中可能會允許你使用注入語句,但是一般來說,網站防注入都是在鏈接數據庫的類中加入了轉換,也就是說把注入語句的關鍵字都加上了轉義字符。比如你遇到的這種情況,就是被防注入了。

關於你這個問題:

問:輸入框中的SQL語句應該如何寫?

條件:數據庫表、字段全已知,輸入框長度不限。

我只能跟你說,你可以在輸入框中加入;,/這種符號,讓語句解析的時候出現問題,讓php把sql語句拼合成兩個或兩個以上。這樣你就可以在第二條語句之後加入你想要執行的命令了。

如果這種方法沒有效果,你只能使用溢出的方式來注入!

什麼是SQL注入?

SQL注入:利用現有應用程序,將(惡意)的SQL命令注入到後台數據庫引擎執行的能力,這是SQL注入的標準釋義。

隨着B/S模式被廣泛的應用,用這種模式編寫應用程序的程序員也越來越多,但由於開發人員的水平和經驗參差不齊,相當一部分的開發人員在編寫代碼的時候,沒有對用戶的輸入數據或者是頁面中所攜帶的信息(如Cookie)進行必要的合法性判斷,導致了攻擊者可以提交一段數據庫查詢代碼,根據程序返回的結果,獲得一些他想得到的數據。

SQL注入利用的是正常的HTTP服務端口,表面上看來和正常的web訪問沒有區別,隱蔽性極強,不易被發現。

SQL注入攻擊過程分為五個步驟:

第一步:判斷Web環境是否可以SQL注入。如果URL僅是對網頁的訪問,不存在SQL注入問題,如:就是普通的網頁訪問。只有對數據庫進行動態查詢的業務才可能存在SQL注入,如:=39,其中?id=39表示數據庫查詢變量,這種語句會在數據庫中執行,因此可能會給數據庫帶來威脅。

第二步:尋找SQL注入點。完成上一步的片斷後,就要尋找可利用的注入漏洞,通過輸入一些特殊語句,可以根據瀏覽器返回信息,判斷數據庫類型,從而構建數據庫查詢語句找到注入點。

第三步:猜解用戶名和密碼。數據庫中存放的表名、字段名都是有規律可言的。通過構建特殊數據庫語句在數據庫中依次查找表名、字段名、用戶名和密碼的長度,以及內容。這個猜測過程可以通過網上大量注入工具快速實現,並藉助破解網站輕易破譯用戶密碼。

第四步:尋找WEB管理後台入口。通常WEB後台管理的界面不面向普通用戶

開放,要尋找到後台的登陸路徑,可以利用掃描工具快速搜索到可能的登陸地址,依次進行嘗試,就可以試出管理台的入口地址。

第五步:入侵和破壞。成功登陸後台管理後,接下來就可以任意進行破壞行為,如篡改網頁、上傳木馬、修改、泄漏用戶信息等,並進一步入侵數據庫服務器。

SQL注入攻擊的特點:

變種極多,有經驗的攻擊者會手動調整攻擊參數,致使攻擊數據的變種是不可枚舉的,這導致傳統的特徵匹配檢測方法僅能識別相當少的攻擊,難以防範。

攻擊過程簡單,目前互聯網上流行眾多的SQL注入攻擊工具,攻擊者藉助這些工具可很快對目標WEB系統實施攻擊和破壞。

危害大,由於WEB編程語言自身的缺陷以及具有安全編程能力的開發人員少之又少,大多數WEB業務系統均具有被SQL注入攻擊的可能。而攻擊者一旦攻擊成功,可以對控制整個WEB業務系統,對數據做任意的修改,破壞力達到及至。

SQL注入的危害和現狀

SQL注入的主要危害包括:

未經授權狀況下操作數據庫中的數據

惡意篡改網頁內容

私自添加系統帳號或者是數據庫使用者帳號

網頁掛木馬

如何防止SQL參數:

1,檢查上傳的數據,並過濾

2. 禁止拼接SQL字符串

3.使用SQL參數化處理

4.加載防入侵等硬件設施

php網站在檢測時總是提示網站存在sql注入漏洞

1,用正則表達式過濾一些SQL注入關鍵字。

2,盡量使用參數形式,少用拼湊型SQL語句

3,條件可以的話,請使用存儲過程操作數據庫.

4,轉換參數類型.如是參數是數字型,則轉換成數字型的才操作

public class AntiSqlInAttack

{

public System.Web.HttpRequest request;

public AntiSqlInAttack(System.Web.HttpRequest request)

{

this.request = request;

}

public bool CheckBadQuery()

{

//整串字符對比方法

//string badword = “;|’|*|%| and |20%and20%| master |20%master20%|exec|insert|select|delete|count|chr|mid|truncate|char|declare|update”;

//string query = request.ServerVariables[“Query_String”].ToString();

//string[] badwordArry = badword.Split(new char[] { ‘|’ });

//for (int i = 0; i badwordArry.Length; i++)

//{

// string tempWord = badwordArry[i].Trim();

// if (query.IndexOf(tempWord) = 1)

// return true;

//}

//return false;

if (request.QueryString.Count != 0)

{

for (int i = 0; i request.QueryString.Count; i++)

{

if (CheckBadWord(request.QueryString[i].ToString()))

return true;

}

}

return false;

}

public bool CheckBadForm()

{

if (request.Form.Count 0)

{

for (int i = 0; i request.Form.Count; i++)

{

if (CheckBadWord(request.Form[i]))

return true;

}

}

return false;

}

public bool CheckBadWord(string str)

{

string pattern = @”select|insert|delete|from|count\(|drop table|update|truncate|asc\(|mid\(|char\(|xp_cmdshell|exec master|netlocalgroup administrators|:|net user|””|or|and”;

if (Regex.IsMatch(str, pattern, RegexOptions.IgnoreCase) || Regex.IsMatch(str, @”[-|;|,|\/|\(|\)|\[|\]|\}|\{|%|@|\*|!|\’]”))

return true;

return false;

}

/**//// summary

/// 反SQL注入

/// /summary

public void AntiSqlInjectionAttack()

{

if (CheckBadQuery() || CheckBadForm())

{

string msg = string.Empty;

msg += “span style=’font-size:12px;’非法操作!系統做了如下記錄!br”;

msg += “操作IP:” +Utils.GetRealIP()+ “br”;

msg += “操作時間:” + DateTime.Now + “br”;

msg += “頁面:” + request.ServerVariables[“URL”].ToLower() + “br”;

msg += “a href=\”#\” onclick=\”history.back()\”返回上一頁/a/span”;

MessageBox.ResponseWrite(msg, true);

}

}

}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/298104.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-28 12:17
下一篇 2024-12-28 12:17

相關推薦

  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • Hibernate日誌打印sql參數

    本文將從多個方面介紹如何在Hibernate中打印SQL參數。Hibernate作為一種ORM框架,可以通過打印SQL參數方便開發者調試和優化Hibernate應用。 一、通過配置…

    編程 2025-04-29
  • PHP怎麼接幣

    想要在自己的網站或應用中接受比特幣等加密貨幣的支付,就需要對該加密貨幣擁有一定的了解,並使用對應的API進行開發。本文將從多個方面詳細闡述如何使用PHP接受加密貨幣的支付。 一、環…

    編程 2025-04-29
  • 使用SQL實現select 聚合查詢結果前加序號

    select語句是數據庫中最基礎的命令之一,用於從一個或多個表中檢索數據。常見的聚合函數有:count、sum、avg等。有時候我們需要在查詢結果的前面加上序號,可以使用以下兩種方…

    編程 2025-04-29
  • 理解Mybatis中的SQL Limit用法

    Mybatis是一種非常流行的ORM框架,提供了SQL映射配置文件,可以使用類似於傳統SQL語言的方式編寫SQL語句。其中,SQL的Limit語法是一個非常重要的知識點,能夠實現分…

    編程 2025-04-29
  • SQL預研

    SQL預研是指在進行SQL相關操作前,通過數據分析和理解,確定操作的方法和步驟,從而避免不必要的錯誤和問題。以下從多個角度進行詳細闡述。 一、數據分析 數據分析是SQL預研的第一步…

    編程 2025-04-28
  • 使用PHP foreach遍歷有相同屬性的值

    本篇文章將介紹如何使用PHP foreach遍歷具有相同屬性的值,並給出相應的代碼示例。 一、基礎概念 在講解如何使用PHP foreach遍歷有相同屬性的值之前,我們需要先了解幾…

    編程 2025-04-28
  • PHP獲取301跳轉後的地址

    本文將為大家介紹如何使用PHP獲取301跳轉後的地址。301重定向是什麼呢?當我們訪問一個網頁A,但是它已經被遷移到了另一個地址B,此時若服務器端做了301重定向,那麼你的瀏覽器在…

    編程 2025-04-27
  • PHP登錄頁面代碼實現

    本文將從多個方面詳細闡述如何使用PHP編寫一個簡單的登錄頁面。 1. PHP登錄頁面基本架構 在PHP登錄頁面中,需要包含HTML表單,用戶在表單中輸入賬號密碼等信息,提交表單後服…

    編程 2025-04-27
  • PHP與Python的比較

    本文將會對PHP與Python進行比較和對比分析,包括語法特性、優缺點等方面。幫助讀者更好地理解和使用這兩種語言。 一、語法特性 PHP語法特性: <?php // 簡單的P…

    編程 2025-04-27

發表回復

登錄後才能評論