2013-08-18 25 views
-2

我知道大多數答案會說使用PDO/Mysqli,但我試圖看看我是否可以這樣做,然後移動到PDO/Mysqli仍在學習:這是否足以防止使用MYSQL_QUERY注入Mysql

這個函數是否足以防止mysql注入?

function anti_inject($sql) 
{ 

    $sql = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"), "", $sql); 
    $sql = preg_replace("/[^a-zA-Z0-9]+/", " ", $sql); 
    $sql = mysql_real_escape_string($sql); 
    $sql = trim($sql); 
    $sql = strip_tags($sql); 
    $sql = addslashes($sql); 
    $sql = strtolower($sql); 
    return $sql; 
} 

尋找此行$ SQL =的preg_replace一個更好的替代(sql_regcase(「/(從|選擇|插入|刪除|地方|刪除表|節目表|#| * | - | \\ )/「),」「,$ sql);

由於我想要「從」檢查具有名稱「中選擇」「插入」標籤遊戲等

我已經停用降表從MySQL用戶

+1

爲什麼在學習使用現代的庫之前,你會學習使用已過時的,過時的和通常不好的庫? – Quentin

+4

這看起來像擊中電視遙控器上的每個按鈕只是爲了更換頻道。您可能已經改變了頻道,但您也可能啓動了DVD播放器並將圖像從彩色轉換爲黑白。最好先檢查遙控器是否有正確的按鈕。 (即閱讀關於[SQL注入](https://en.wikipedia.org/wiki/SQL_injection)的文檔!) –

回答

1

號那是毫無希望的。

$sql = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"), "", $sql); 

該扔掉的數據沒有明顯的原因

$sql = preg_replace("/[^a-zA-Z0-9]+/", " ", $sql); 

該扔掉的數據沒有明顯的原因

$sql = mysql_real_escape_string($sql; 

如果您還沒有失去),那麼這就是正確的方式來轉換一塊數據插入到SQL查詢中。

$sql = trim($sql); 

該扔掉的數據沒有明顯的原因

$sql = strip_tags($sql); 

該扔掉的數據沒有明顯的原因

$sql = addslashes($sql); 

這在某種程度上不適合SQL查詢逃逸數據。有些數據會被雙重轉義(因此破壞),因爲您已經使用了mysql_real_escape_string。

$sql = strtolower($sql); 

這無意中破壞了數據。


在使用過時的,過時mysql_庫,mysql_real_escape_string是你應該使用的唯一避開功能。然後,您需要將結果合併,並在適當的時候使用它們當將您的SQL字符串混合在一起時。

雖然不要使用mysql_。使用PDO and parameterised queries

+0

我需要strtolower,我用它來檢查基於java的遊戲的名稱,我只允許數字和字母,我發現更容易使所有字符更低,例如,用戶檢查名稱「isSoFly」;所以其中的2個功能有其他原因,我一直在閱讀。 – Swaly

+0

@Swaly旁邊的閱讀應該*瞭解*他們閱讀的內容,介意你。 –

+0

@Swaly說小寫(與任何安全性無關,因此也是offopic),mysql已經有一個案例獨立的比較。 –

1

嚴格地說,就SQL注入保護而言,這個函數在同一時間是非常無用而且不可用的。雖然它可能在您的某些特定情況下爲您服務,但它不能用作通用解決方案。但即使是這樣的情況,它也是非常多餘的。

那麼,爲什麼不使用已被證明對所有(被覆蓋的)案件都是防錯的解決方案 - PDO prepared statements

+0

說我使用PDO,是否實際查詢更改或只有代碼?像這樣的例子;將這種 [的mysql_query( 「UPDATE SET項目'name' = '$ NEWNAME' WHERE'index' = $ LIMIT索引1」);]變化到 [$ pdo->的mysql_query(「UPDATE SET項目'name' =' $ newname'WHERE'index' = $ index LIMIT 1「);] 還是那個不同呢? – Swaly

+1

*請在開始評論前查看我提供的鏈接。先謝謝你。 –

相關問題