SQL注入 - 还有什么?

时间:2014-09-08 09:26:12

标签: php sql pdo sql-injection

我在Intranet站点上有以下PHP代码,我最近了解了一个Firefox插件'SQL Inject Me'。出于好奇,我试图在这个非常简单的网站上运行它(基本上是一个带有管理员帐户的电话簿)。

测试返回了51#302错误,但是当我尝试它们时,我不会造成任何伤害,也无法访问(到)数据库。

还有什么可以做的,以防止注射?当我搜索时,他们都建议PDO准备好的声明,但这是使用它完成的。

PHP

include_once("inetcon.php");
session_start();
$uid = $_POST['uid'];
$pass = $_POST['pass'];

// This is what I've added after seeing the errors

$uid = mysql_real_escape_string($uid);
$pass = mysql_real_escape_string($pass);

$uid = str_replace("'","fag",$uid); 

// end of block

$extract = $handler->prepare('SELECT * FROM net_users WHERE users_fname = ? and users_role = ? and users_active = "2"');
$extract->execute(array($uid, md5($pass)));

插件会返回所有基本的内容,例如:

Server Status Code: 302 Found
Tested value: 1' OR '1'='1

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

此:

    $uid = $_POST['uid'];
    $pass = $_POST['pass'];

应该是:

$uid = mysqli_real_escape_string($db_connect, $_POST['uid']);
$pass = mysqli_real_escape_string($db_connect, $_POST['pass']);

这样变量就变成了转义字符串,否则你就不会对它们做任何事情。 为什么在mysql_*mysqli_*使用pdo? 使用准备好的陈述是很难的。

<强> 更新 您还可以添加trim()以删除无用空格,并添加strip_tags()以删除所有html标记:

$uid = mysqli_real_escape_string($db_connect, trim(strip_tags($_POST['uid'])));
$pass = mysqli_real_escape_string($db_connect, trim(strip_tags($_POST['pass'])));

因此,<b onClick="some javascript injection">Test</b> is this <u>striped</u>?之类的输入将变为:Test is this striped?

答案 1 :(得分:0)

嗯,是的......

刚刚找到了这个答案,所以这个问题实际上是重复的:

How to fix Server Status Code: 302 Found by SQL Inject Me Firefox Addon

他们在这里说的是这并不意味着表单不受保护这是重定向的标志:

  

302是服务器的说法&#34;我希望你去[某个地方   别的]&#34; (在这种情况下是login.php)。这不是错误,而是完美的   正常的反应。

通过代码的其余部分它是完全合理的,因为它在查询后确实有header location - 即使它成功或失败了(通过查看此代码,似乎有点蹩脚,包括在while子句中以及在它之后的重定向,但是meh ...)

while ($results = $extract->fetch()) {
    $_SESSION['username'] = $results['users_lname'];
    echo $_SESSION['username'];
    header('location: ../phonebook.php');
}
header('location: ../phonebook.php');

无论如何,感谢任何人的帮助