作者 主題: SQL Injection 防範問題  (閱讀 4484 次)

0 會員 與 1 訪客 正在閱讀本文。

crazyday7

  • 懷疑的國中生
  • **
  • 文章數: 83
    • 檢視個人資料
SQL Injection 防範問題
« 於: 2010-09-21 11:31 »
目前我是把
magic_quotes_gpc=on
display_errors=off

想請問這樣安全性就夠了嗎?
還是有更好的方法呢?
有時問的問題會有點奇怪...
請見怪不怪...
新手上路,希望各位多多包含,謝謝m(_ _)m。

fillano

  • 鑽研的研究生
  • *****
  • 文章數: 526
    • 檢視個人資料
回覆: SQL Injection 防範問題
« 回覆 #1 於: 2010-09-21 11:50 »
光是這兩個沒用吧...

最重要的是register_globals=off,另外magic_quotes_gpc=off吧?好像沒需要打開。

幾個原則:

如果是用mysql,資料存入前都用mysql_real_escape_string()處理過。

如果查詢沒有用到union,那就直接過濾掉。這是最常用的injection手法。

不要用$_REQUEST,嚴格區分$_GET,$_POST,不要信任任何傳進程式的東西,需要的話都過濾一下比較可靠。(不過這樣過濾會影響稍微效能)

變數使用前,最好都先初始化。

...應該還有很多...
Sapere aude! Habe Mut, dich deines eigenen Verstandes zu bedienen! ist also der Wahlspruch der Aufklärung.

ricky

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 669
    • 檢視個人資料
    • Ricky 碎碎唸
回覆: SQL Injection 防範問題
« 回覆 #2 於: 2010-09-21 12:17 »
最根本的解決方法還是照規矩來
使用mysql_*系列的function請使用mysql_real_escape_string
使用PDO時,請善用prepare -> execute
這才是治本的方法。
我的symfony作品:YOMOpets 寵物誌
有興趣可以一起來討論symfony喔
我的部落格:http://ricky.ez2.us/

crazyday7

  • 懷疑的國中生
  • **
  • 文章數: 83
    • 檢視個人資料
回覆: SQL Injection 防範問題
« 回覆 #3 於: 2010-09-21 13:40 »
我參考一下網路上面的寫法
想請問這樣安全嗎?
代碼: [選擇]
<?php
function check_input($value){// Stripslashes
if (get_magic_quotes_gpc())  {
  
$value stripslashes($value);
}
// Quote if not a number
if (!is_numeric($value))  {
  
$value "&#39;" mysql_real_escape_string($value) . "&#39;";
}
return 
$value;
}
$con mysql_connect("localhost""peter""abc123");
if (!
$con)  {  die(&#39;Could not connect: &#39; . mysql_error());  }
// Make a safe SQL
$user check_input($_POST[&#39;user&#39;]);
$pwd check_input($_POST[&#39;pwd&#39;]);
$sql "SELECT * FROM users WHEREuser=$user AND password=$pwd";
mysql_query($sql);
mysql_close($con);
?>


有時問的問題會有點奇怪...
請見怪不怪...
新手上路,希望各位多多包含,謝謝m(_ _)m。

hyhmss

  • 可愛的小學生
  • *
  • 文章數: 19
  • 性別: 男
    • 檢視個人資料
回覆: SQL Injection 防範問題
« 回覆 #4 於: 2010-10-10 20:20 »
自己写个公用函数来做转义,配置个参数,把需要转义的字符都加上,以后随时可以新增加减少,根据不同系统可能需要转的也不同。