php - SQL注入(inject)——还有什么?

标签 php sql pdo sql-injection

<分区>

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

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

还有什么比这更能防止注入(inject)的吗?当我搜索时,他们都建议 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

感谢您的帮助。

最佳答案

这个:

    $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?

关于php - SQL注入(inject)——还有什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25721032/

相关文章:

php - 为什么 'Quantity' 值不显示任何值?

javascript - 如何将日期选择器值传递给 Controller ​​?

php - 合并mysql中两个查询的结果

mysql - 如何使子查询的mysql查询将2个结果合并为1个结果

mysql - 子查询返回超过 1 行?

mysql - 使用 MySQL 中的函数验证年龄

php - 使用 PHP cUrl 发送后解码 JSON

php - 基于Mysql数据预填充/预检查复选框

php - Ajax 通过 php 获取价格

php - PDO数据库使用的SQL是独立的吗?