2016-12-16 80 views
-1

我正在構建一個網站,該網站使用通過URL傳遞的信息從數據庫表中挑選信息,但引起了我的注意,這樣做可能會導致SQL注入。正如我以爲這只是一個問題,你是插入信息到數據庫中,我有點困惑,你應該保護你的代碼的時間,方式和位置。SQL注入保護 - 何時何地

目前,我有一個網址,它看起來像:

www.website.com/article.php?title=title&id=1 

這是htaccess的縮短www.website.com/article/title/1

在我article.php頁我那麼有:

<?php 
if(isset($_GET["id"])){$url_id = $_GET["id"];}else{ 
header("Location: $site_url"); 
exit(); 
}; 
?> 
<?php 
if(isset($_GET["title"])){$url_title = $_GET["title"];}else{ 
header("Location: $site_url"); 
exit(); 
}; 
?> 
<?php 
$article_sql = "SELECT ... 

我目前使用mysqli_real_escape_string來防止SQL注入威脅,但我不確定在這裏使用它。我猜測加入...

... 
<?php 
if(isset($_GET["title"])){$url_title = $_GET["title"];}else{ 
header("Location: $site_url"); 
exit(); 
}; 
?> 
<?php 
$url_id = mysqli_real_escape_string($url_id); // ADDED 
$url_title = mysqli_real_escape_string($url_title); // ADDED 
?> 
<?php 
$article_sql = "SELECT 
... 

應該這樣做,但這是正確的嗎?

+1

您需要的所有內容都在此主題中。 –

+1

僅供參考,mysqli_real_escape_string與SQL注入完全無關。 –

+0

@YourCommonSense那麼爲什麼我在很多場合被告知它是注射威脅的解決方案? –

回答

0

您已經在使用mysqli_,請充分利用它。以下是基於您提供的代碼的簡單示例:

<?php 
// $mysqli is the connection 
$article_sql = $mysqli->prepare("SELECT * FROM table WHERE url_id = ? AND url_title = ?"); 

$article_sql->bind_param("is", $url_id, $url_title); 
$article_sql->execute(); 

$result = $article_sql->get_result(); 
while ($row = $result->fetch_array(MYSQLI_NUM)) { 
    foreach ($row as $r) { 
    print "$r "; 
    } 
    print "\n"; 
} 
+0

謝謝。我一定會考慮使用這個代碼。就像一個側面的問題 - 對於一個注入式攻擊來放棄你的表中的一個表,它肯定知道表的名字是真的嗎?如果是這樣,那麼給表名輸入一個晦澀的名字不是一個好的解決辦法嗎? –

+0

嗯,是的......攻擊者必須知道他所攻擊的是什麼:)但是他必須通過注射來找到它,否則你將會阻止使用這種技術。選中這個[cheet sheet](http:// pentestmonkey。net/cheat-sheet/sql-injection/mysql-sql -injection-cheat-sheet) –

+0

似乎攻擊者可以找到解決所有問題的方法,哈哈。正如我確信他們不幸被迫再次做,即使準備好的聲明將來不安全:-(有沒有辦法阻止他們使用通用PHP代碼來列出表和數據庫,這些代碼可以放在一個單獨的'包括文件? –