2015-10-06 143 views
-4

此代码是否可安全地用于我的网站?没有sql注入或黑客攻击,是或否?我不想被黑客攻击等安全代码与否? (需要帮助)

<?php 

$db = new mysqli ("localhost", "-", "-", "-"); 

if($_GET['look'] && $_GET['username']) 
{ 

    $username = $db->real_escape_string($_GET['username']); 
    $look = $db->query("SELECT look FROM users WHERE username = '".$username."'")->fetch_assoc(); 
    echo $look['look']; 
} 

if($_GET['missie'] && $_GET['username']) 
{ 
    $username = $db->real_escape_string($_GET['username']); 
    $motto = $db->query("SELECT motto FROM users WHERE username = '".$username."'")->fetch_assoc(); 
    echo $motto['motto']; 
} 

if($_GET['while'] && $_GET['status']) 
{ 
    $status = $db->real_escape_string($_GET['status']); 
    $motto = $db->query("SELECT * FROM users WHERE motto = '".$status."'"); 
    while($lol = $motto->fetch_assoc()) { 
     echo $lol['username'] . '/'; 
    } 
} 

?> 

,我怎么能提高呢?

+2

如果你想成为安全,停止插值直接转换为SQL语句(甚至逃跑),并开始使用预处理语句使用绑定变量的 –

+0

我用这个作为我的另一个网站获得座右铭和用户名等的“api”。所以我需要这样做,对吧? @Mark Ba​​ker – Yonas

+0

如果您从其他网站访问它,那么其公开访问 –

回答

2

如果你看一下mysql_real_escape_string的功能描述,它指出

mysql_real_escape_string - 字符串中的转义特殊字符用在SQL语句中

所以它会逃离你的参数,但我不会建议完全依赖于此。

在未来的版本中,php将不再支持mysql或mysqli,您将需要使用PDO。我已经多次用于自己的项目的一个很好的资源是http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers

PDO允许您创建预先准备好的语句,并为您避开参数并保护自己免受sql注入。这里是你如何能做到的例子,使用PDO:

$db = new \PDO('mysql:host=localhost;dbname=test;charset=utf8', 'username', 'password'); 
$stmt = $db->prepare(' 
    SELECT * 
    FROM `book` AS b 
    WHERE b.genre = ? 
'); 

$stmt->execute(array('fantasy')); // Will replace the ? with 'fantasy' and escape it 
+0

感谢您的信息!那么,我的代码是安全的?我正在过滤一切。 @Jeff Burgin – Yonas

+0

那么根据函数定义,是的。但正如其他一些评论所说,准备好的声明更安全,并且将成为标准的前进。 –

+0

我并不擅长准备报表。也许你可以修复我的代码? @Jeff Burgin – Yonas