介面防sql注入的調研

2022-03-09 16:48:07 字數 1670 閱讀 9363

http請求的路徑、引數和header,比如cookie等都可能作為sql注入的**。

在實際的開發工作中,因為現有框架中header、路徑作為引數直接查詢資料庫的使用比較少。因此,主要處理引數sql注入。

未經轉義的引數直接作為sql語句發給db就會發生sql注入,防止sql注入主要有以下幾種方式:

強型別引數校驗和轉義,禁止特殊字元的引數傳遞。

框架和資料庫統一提供的prepare, execute語法。

讀寫分離。

需要注意的是addslashes和mysql_real_escape_string都不能作為防sql注入的方式。原因請參考:

1. thinkphp框架input()幫助函式提供了以下幾種引數轉義:`d`:轉義int型別,`a`:轉義陣列型別,`f`: 轉義浮點型別, `b`:轉義bool型別,`s`: 轉義字串型別.

2. 也可以用intval, doubleval, floatval相關的函式進行引數過濾。識別無效的引數返回。

thinkphp框架提供了prepare, execute語法來處理引數。詳細的mysql prepare語法可以檢視:

sql-prepared-statements

執行步驟:

傳送sql語句。

設定變數。

使用變數執行語句。

舉個例子:

prepare example from

'select * from sdb_user where id=?';

set@a=1

;execute example using @a;

步驟1中的sql語句會被mysql認為是需要執行的部分。步驟2, 3的語句傳入的變數不會被mysql執行。因此這種方式是最安全的mysql防注入的方式。對於thinkphp框架來說,是語句部分還是需要繫結的引數,是根據是否是變數來標識的。對於直接字串拼接的部分,框架會認為是是sql語句而直接在步驟1傳送給mysql,如果這部分有引數拼接就可能發生sql注入。

thinkphp提供了方便的讀寫分離的配置。對於大部分業務來說,讀的介面都是在其中佔據較大的部分,因此可以使用讀寫分離的方式來降低sql注入時對db造成嚴重破壞的概率,比如改寫資料,刪庫等。

主要包含以下database.php配置

<?php

return

[ "hostname":[

"127.0.0.1", //

master

"127.0.0.1" //

readonly

],"username":[

"foo_write", //

master

"foo_read", //

readonly

],"password":[

"bar_write", //

master

"bar_read", //

readonly

],'hostport' => '3306',

'deploy' => 1,

'rw_separate' => true,];

因此使用tp框架防止sql注入可以做以下改進:

強型別引數校驗。

使用引數的方式傳遞查詢條件,禁止直接拼接引數。

讀寫分離。

by: zhangfeng

防SQL注入

這段 有好處也有壞處,用的時候得小心,搞不好就會跳進錯誤 dimsql injdata sql injdata and exec insert select delete update chr mid master truncate char declare sql inj split sql in...

防SQL注入

1.必須認定使用者輸入的資料都是不安全的 使用者輸入的資料進行過濾處理 if preg match w get username matches else 讓我們看下在沒有過濾特殊字元時,出現的sql情況 設定 name 中插入了我們不需要的sql語句 name qadir delete from ...

防SQL注入

與資料庫互動的 web 應用程式中最嚴重的風險之一 sql 注入攻擊。sql 注入是應用程式開發人員未預期的把 sql 傳入到應用程式的過程,它由於應用程式的糟糕設計而使攻擊成為可能,並且只有那些直接使用使用者提供的值構建 sql 語句的應用程式才會受影響。sql 語句通過字串的構造技術動態建立,文...