2012-06-28 51 views
1

我開始一個非常基本的網站,它使用單行表單發佈到數據庫中,然後在頁面上回顯$comment變量。我不知道PDO,但願意瞭解我是否真的需要這樣簡單的事情。我很擔心SQL注入。這安全嗎?

else 
mysql_query("INSERT INTO posts (postid, post_content) 
VALUES ('', '$comment <br />')"); 
} 
mysql_close($con); 

上面這段代碼我有基本的strpos命令來阻止一些我不想發佈的東西。

我是否會遇到任何注射問題,從我如何做到這一點?

+4

開始學習準備語句中使用'PDO',而你在它 – tradyblix

+0

PDO可以看看在開始恐嚇。但是做基本的查詢幾乎是相同數量的代碼ad mysqli。另外,一旦你需要/想要更高級的功能,那就是它照在mysqli上的地方 – Kris

回答

3

不,這不是安全的,你需要使用mysql_real_escape_string逃脫$comment

但是,PDO並不困難,使您的代碼更強大。

// create the connection. something like mysql_connect/mysql_error 
try { 
    $dbh = new PDO($dsn, $user, $password); 
} catch (PDOException $e) { 
    echo 'Connection failed: ' . $e->getMessage(); 
} 

// create the prepared statement. 
$stmt = $dbh->prepare("INSERT INTO posts (postid, post_content) VALUES (?, ?)"); 
// execute it with parameters. 
$stmt->execute(array('', $comment.'<br>')); 
+1

+1用於演示PDO以及它的使用方式。 – Herbert

3

是的,這是危險的。所有人需要做的就是把單引號,然後是他們想要的SQL代碼。如果您想以舊方式修復它,或者使用PDO準備好的語句作爲更新的方式,請在此聲明之前使用$ comment = mysql_real_escape_string($ comment)。下面是從documentation一個基本的例子:

<?php 
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); 
$stmt->bindParam(':name', $name); 
$stmt->bindParam(':value', $value); 

// insert one row 
$name = 'one'; 
$value = 1; 
$stmt->execute(); 

// insert another row with different values 
$name = 'two'; 
$value = 2; 
$stmt->execute(); 
?> 
+0

我已經看到過這個,並在之前閱讀過它。 mysql_real_escape_string()到底是什麼?做? – CodingNoob

+0

有一些字符(如單引號)需要轉義,所以它會根據所使用的轉義版本將所有'轉換爲'或''。 [文檔](http://php.net/manual/en/function.mysql-real-escape-string.php) – hackartist

0

這是容易受到SQL注入作爲你的$評論是他們可能也進入了一些SQL命令和你的PHP代碼最終會執行相同的用戶輸入。

考慮$評論值設置爲'TRUNCATE TABLE USERS;'用戶表可以是任何東西,這可能是您的應用程序的關鍵。

在PHP中,我相信你通過使用mysql_real_escape_string()來防止sql注入。閱讀它。

請參閱本文檔的詳細信息ABT SQL innjection:https://docs.google.com/document/d/1rO_LCBKJY0puvRhPhAfTD2iNVPfR4e9KiKDpDE2enMI/edit?pli=1

0

將輸入數據綁定到mysql查詢是SQL注入的完美解決方案。爲此使用binaParam方法。

0

不,僅根據您在此處發佈的代碼判斷,您不受SQL注入的保護。這裏有一個簡單的例子爲$comment

'), (null, (select concat(user(),':',password) s from mysql.user where concat(user,'@',host)=user() LIMIT 1) -- 

這將添加包含當前用戶的登錄憑據另一行。通過LOAD_FILE,他也可以讀取文件系統中的文件。他還可以寫在文件系統上的任意文件:

' + (select '<?php echo "Hello, World!";' into dumpfile '/path/to/your/document_root/foobar.php')) -- 

利用這種技術,攻擊者可以任意上傳文件到您的服務器,E。 G。一個web shell在您的系統上運行任意命令。

所以你一定要protect yourself against SQL injections使用準備好的語句或參數化語句的自動轉義比使用mysql_real_escape_string等功能的手動轉義更受青睞。