我在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
感谢您的帮助。
答案 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');
无论如何,感谢任何人的帮助