奶头挺立呻吟高潮av全片,成人试看120秒体验区,性欧美极品v,A片高潮抽搐揉捏奶头视频

php語言

php防止SQL注入的方法

時間:2025-04-22 06:24:46 php語言 我要投稿

php防止SQL注入的方法

  在php編程中,防范sql注入攻擊的簡單方法,感興趣的朋友可以參考下,可能對日常的sql注入防范有一定的幫助。

  sql注入產生的原因,一般如下:

  一個是沒有對輸入的數據進行過濾(過濾輸入),還有一個是沒有對發送到數據庫的數據進行轉義(轉義輸出)。

  這兩個重要的步驟缺一不可,需要同時加以特別關注以減少程序錯誤。

  對于攻擊者來說,進行SQL注入攻擊需要思考和試驗,對數據庫方案進行有根有據的推理非常有必要(當然假設攻擊者看不到你的源程序和數據庫方案)。

  例子, 一個簡單的登錄表單:

  復制代碼 代碼示例:

  <form action="/login.php" method="POST">

  <p>Username: <input type="text" name="username" /></p>

  <p>Password: <input type="password" name="password" /></p>

  <p><input type="submit" value="Log In" /></p>

  </form>

  攻擊者會從推測驗證用戶名和密碼的查詢語句開始。通過查看源文件,他就能開始猜測你的習慣。

  比如命名習慣。通常會假設你表單中的字段名為與數據表中的字段名相同。當然,確保它們不同未必是一個可靠的安全措施。

  第一次猜測,一般會使用下面例子中的查詢:

  復制代碼 代碼示例:

  <?php

  $password_hash = md5($_POST['password']);

  $sql = "SELECT count(*)

  FROM   users

  WHERE  username = '{$_POST['username']}'

  AND    password = '$password_hash'";

  ?>

  使用用戶密碼的MD5值原來是一個通行的做法,但現在并不是特別安全了。

  最近的研究表明MD5算法有缺陷,而且大量MD5數據庫降低了MD5反向破解的難度。

  請訪問http://md5.rednoize.com/ 查看演示。

  最好的保護方法:

  在密碼上附加一個自定義的字符串,例如:

  復制代碼 代碼示例:

  <?php

  $salt = 'SHIFLETT';

  $password_hash = md5($salt . md5($_POST['password'] . $salt));

  ?>

  當然,攻擊者未必在第一次就能猜中,他們常常還需要做一些試驗。有一個比較好的試驗方式是把單引號作為用戶名錄入,原因是這樣可能會暴露一些重要信息。有很多開發人員在Mysql語句執行出錯時會調用函數mysql_error()來報告錯誤。見下面的例子:

  復制代碼 代碼示例:

  <?php

  mysql_query($sql) or exit(mysql_error());

  ?>

  該方法能向攻擊者暴露重要信息。如果攻擊者把單引號做為用戶名,mypass做為密碼,查詢語句就會變成:

  復制代碼 代碼示例:

  <?php

  $sql = "SELECT *

  FROM   users

  WHERE  username = '''

  AND    password = 'a029d0df84eb5549c641e04a9ef389e5'";

  ?>

  當該語句發送到MySQL后,系統就會顯示如下錯誤信息:

  You have an error in your SQL syntax. Check the manual that corresponds to your

  MySQL server version for the right syntax to use near 'WHERE username = ''' AND

  password = 'a029d0df84eb55

  不費吹灰之力,攻擊者已經知道了兩個字段名(username和password)以及他們出現在查詢中的順序。除此以外,攻擊者還知道了數據沒有正確進行過濾(程序沒有提示非法用戶名)和轉義(出現了數據庫錯誤),同時整個WHERE條件的格式也暴露了,這樣,攻擊者就可以嘗試操縱符合查詢的記錄了。

  在這一點上,攻擊者有很多選擇。一是嘗試填入一個特殊的用戶名,以使查詢無論用戶名密碼是否符合,都能得到匹配:

  myuser' or 'foo' = 'foo' --

  假定將mypass作為密碼,整個查詢就會變成:

  復制代碼 代碼示例:

  <?php

  $sql = "SELECT *

  FROM   users

  WHERE  username = 'myuser' or 'foo' = 'foo' --

  AND    password = 'a029d0df84eb5549c641e04a9ef389e5'";

  ?>

  幸運的是,SQL注入是很容易避免的。正如前面所提及的,你必須堅持過濾輸入和轉義輸出。

  雖然兩個步驟都不能省略,但只要實現其中的一個就能消除大多數的SQL注入風險。如果你只是過濾輸入而沒有轉義輸出,你很可能會遇到數據庫錯誤(合法的數據也可能影響SQL查詢的正確格式),但這也不可靠,合法的數據還可能改變SQL語句的行為。另一方面,如果你轉義了輸出,而沒有過濾輸入,就能保證數據不會影響SQL語句的格式,同時也防止了多種常見SQL注入攻擊的方法。

  當然,還是要堅持同時使用這兩個步驟。過濾輸入的方式完全取決于輸入數據的類型(見第一章的示例),但轉義用于向數據庫發送的輸出數據只要使用同一個函數即可。對于MySQL用戶,可以使用函數mysql_real_escape_string( ):

  復制代碼 代碼示例:

  <?php

  $clean = array();

  $mysql = array();

  $clean['last_name'] = "O'Reilly";

  $mysql['last_name'] = mysql_real_escape_string($clean['last_name']);

  $sql = "INSERT

  INTO   user (last_name)

  VALUES ('{$mysql['last_name']}')";

  ?>

  盡量使用為你的數據庫設計的轉義函數。如果沒有,使用函數addslashes()是最終的比較好的方法。

  當所有用于建立一個SQL語句的數據被正確過濾和轉義時,實際上也就避免了SQL注入的風險。如果你正在使用支持參數化查詢語句和占位符的數據庫操作類(如PEAR::DB, PDO等),你就會多得到一層保護。見下面的使用PEAR::DB的例子:

  復制代碼 代碼示例:

  <?php

  $sql = 'INSERT

  INTO   user (last_name)

  VALUES (?)';

  $dbh->query($sql, array($clean['last_name']));

  ?>

  由于在上例中數據不能直接影響查詢語句的格式,SQL注入的風險就降低了。PEAR::DB會自動根據你的數據庫的要求進行轉義,所以你只需要過濾輸出即可。

  如果正在使用參數化查詢語句,輸入的內容就只會作為數據來處理。這樣就沒有必要進行轉義了,盡管你可能認為這是必要的一步(如果你希望堅持轉義輸出習慣的話)。實際上,這時是否轉義基本上不會產生影響,因為這時沒有特殊字符需要轉換。在防止SQL注入這一點上,參數化查詢語句為你的程序提供了強大的保護。

  注:關于SQL注入,不得不說的是現在大多虛擬主機都會把magic_quotes_gpc選項打開,在這種情況下所有的客戶端GET和POST的數據都會自動進行addslashes處理,所以此時對字符串值的SQL注入是不可行的,但要防止對數字值的SQL注入,如用intval()等函數進行處理。但如果你編寫的是通用軟件,則需要讀取服務器的magic_quotes_gpc后進行相應處理。

【php防止SQL注入的方法】相關文章:

php中防止SQL注入的方法06-16

php防止SQL注入的方法分享09-29

php怎么防止sql注入10-15

php中防止SQL注入的解決方法11-04

php防止SQL注入攻擊與XSS攻擊的方法07-01

php防止SQL注入攻擊與XSS攻擊方法08-07

discuz的php防止sql注入函數10-17

PHP中該怎樣防止SQL注入05-23

在PHP中該怎樣防止SQL注入07-25

主站蜘蛛池模板: 铜山县| 晋州市| 沅陵县| 郴州市| 中阳县| 康乐县| 孝义市| 阿拉善左旗| 正蓝旗| 怀宁县| 叶城县| 乌拉特中旗| 汤阴县| 嘉禾县| 张家界市| 云南省| 旬邑县| 凤山市| 馆陶县| 阿巴嘎旗| 搜索| 延川县| 广河县| 隆安县| 琼海市| 信宜市| 襄城县| 舒城县| 绥芬河市| 牙克石市| 中卫市| 丹巴县| 津市市| 福建省| 抚顺市| 新闻| 玉树县| 洱源县| 泸溪县| 滦南县| 昭平县|