簡體   English   中英

防止SQL注入

[英]Protect from SQL injection

我正在嘗試學習php並希望使用一個函數來保護表單再次SQL注入! 但不知何故形成記錄我的數據庫每個包含任何特殊字符的數據,如'“=)/()/ * /

我的過濾功能:

function filter($data) {
    $data = trim(htmlentities(strip_tags($data)));

    if (get_magic_quotes_gpc())
        $data = stripslashes($data);

    $data = mysql_real_escape_string($data);

    return $data;
}

注冊頁面以獲取POST數據:

foreach($_POST as $key => $value) {
    $data[$key] = filter($value);
}

然后我嘗試特殊字符和形式保存! 我做錯了什么?

如果要防止SQL注入,最好的方法是使用PDO和准備好的查詢,其中所有用戶提供的數據都通過execute()傳入,如下所示:

$stmt = $pdo->prepare("INSERT INTO foo (a_column, b_column) VALUES (:a, :b)");
$stmt->execute(array(':a' => $a, ':b' => $b));

您不必對$a$b執行任何操作; 無論您使用哪個數據庫,PDO都會以正確的方式綁定參數。

嗯...防止SQL注入的目的是繼續允許用戶鍵入他們喜歡的內容,而不會讓服務器或其他用戶面臨風險。 htmlspecialchars是一個很好的起點,因為它看起來像HTML標簽並使它們變得無用。 你使用的stripslashes是好的,雖然最新版本的PHP刪除了魔術引號。 mysql_real_escape_string允許您以合理的安全性以字符串的形式在數據庫中插入任何內容。

所以你的過濾器功能應如下所示:

function filter($data) {
    if( get_magic_quotes_gpc()) $data = stripslashes($data);
    return trim(mysql_real_escape_string(htmlspecialchars($data));
}

現在,如果你真的想要一個過濾器 ,就像只允許某些字符一樣的過濾器 ,請使用preg_match等正則表達式函數。

不推薦使用mysql_ *函數,因為它們已被棄用。 使用PHP數據庫對象(PDO),因為PDO允許參數綁定,以保護您免受SQL注入。

您可以在此處閱讀使用PDO

如果不使用框架,還要考慮檢查正則表達式。 示例: http//www.symantec.com/connect/articles/detection-sql-injection-and-cross-site-scripting-attacks

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM