av手机免费在线观看,国产女人在线视频,国产xxxx免费,捆绑调教一二三区,97影院最新理论片,色之久久综合,国产精品日韩欧美一区二区三区

php語言

php防止SQL注入的方法分享

時(shí)間:2025-04-08 13:53:59 php語言 我要投稿
  • 相關(guān)推薦

php防止SQL注入的方法分享

  在php編程中,防范sql注入攻擊的簡單方法,感興趣的朋友可以參考下,可能對日常的sql注入防范有一定的幫助。就跟隨小編去了解下吧,想了解更多相關(guān)信息請 持續(xù)關(guān)注我們應(yīng)屆畢業(yè)生考試網(wǎng)!

  sql注入產(chǎn)生的原因,一般如下:

  一個(gè)是沒有對輸入的數(shù)據(jù)進(jìn)行過濾(過濾輸入),還有一個(gè)是沒有對發(fā)送到數(shù)據(jù)庫的數(shù)據(jù)進(jìn)行轉(zhuǎn)義(轉(zhuǎn)義輸出)。

  這兩個(gè)重要的步驟缺一不可,需要同時(shí)加以特別關(guān)注以減少程序錯(cuò)誤。

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

  例子, 一個(gè)簡單的登錄表單:

  復(fù)制代碼 代碼示例:

  <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>

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

  比如命名習(xí)慣。通常會假設(shè)你表單中的字段名為與數(shù)據(jù)表中的字段名相同。當(dāng)然,確保它們不同未必是一個(gè)可靠的安全措施。

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

  復(fù)制代碼 代碼示例:

  <?php

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

  $sql = "SELECT count(*)

  FROM   users

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

  AND    password = '$password_hash'";

  ?>

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

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

  請?jiān)L問http://md5.rednoize.com/ 查看演示。

  最好的保護(hù)方法:

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

  復(fù)制代碼 代碼示例:

  <?php

  $salt = 'SHIFLETT';

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

  ?>

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

  復(fù)制代碼 代碼示例:

  <?php

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

  ?>

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

  復(fù)制代碼 代碼示例:

  <?php

  $sql = "SELECT *

  FROM   users

  WHERE  username = '''

  AND    password = 'a029d0df84eb5549c641e04a9ef389e5'";

  ?>

  當(dāng)該語句發(fā)送到MySQL后,系統(tǒng)就會顯示如下錯(cuò)誤信息:

  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

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

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

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

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

  復(fù)制代碼 代碼示例:

  <?php

  $sql = "SELECT *

  FROM   users

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

  AND    password = 'a029d0df84eb5549c641e04a9ef389e5'";

  ?>

  幸運(yùn)的是,SQL注入是很容易避免的。正如前面所提及的,你必須堅(jiān)持過濾輸入和轉(zhuǎn)義輸出。

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

【php防止SQL注入的方法分享】相關(guān)文章:

php防止SQL注入的方法10-13

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

php怎么防止sql注入10-15

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

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

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

discuz的php防止sql注入函數(shù)10-17

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

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