2016-12-16 127 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代码来列出表和数据库,这些代码可以放在一个单独的'包括文件? –