gpt4 book ai didi

php - 我的代码可以安全注入(inject)吗?

转载 作者:搜寻专家 更新时间:2023-10-31 22:12:48 24 4
gpt4 key购买 nike

我以前用的是 MySQL,被告知它不安全,所以现在我用 PDO 重新编码了我的管理登录面板,这里和其他论坛的用户说不能注入(inject)。但是黑客仍在进入...登录后我编辑了页面并告诉黑客告诉我我在上面放了什么,黑客告诉我...

我需要知道我的代码是否安全。他告诉我他正在通过 SQL 进入。

所以首先我将他们的 IP 存储在一个 session 中,所以如果他们的 IP 发生变化,它将注销他们(或用户名)

if ( isset($_SESSION['last_ip']) == false )
{
$_SESSION['last_ip'] = $_SERVER['REMOTE_ADDR'];
}
if ( $_SESSION['last_ip'] !== $_SERVER['REMOTE_ADDR'] )
{
session_unset();
session_destroy();
}

然后这是我的登录名:

session_start();
include 'functions/functions.php';
$db = mysqlconnect();
$password = md5($_POST['mypassword']);
$mod = 1;
$statement = $db->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$statement->execute(array($_POST['myusername'],$password));
$result = $statement->fetchObject()->mod;
$count = $statement->rowCount();
if ( $result == 1 ) {
$db = mysqlconnect();
// Register $myusername, $mypassword and redirect to file "login_success.php"
$_SESSION['user'] = $_POST['myusername'] ;
//Test if it is a shared client
if ( !empty($_SERVER['HTTP_CLIENT_IP']) ) {
$ip=$_SERVER['HTTP_CLIENT_IP'];
//Is it a proxy address
} elseif ( !empty($_SERVER['HTTP_X_FORWARDED_FOR']) ) {
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip=$_SERVER['REMOTE_ADDR'];
}
$sqll = "UPDATE users SET lastip=? WHERE username=?";
$q = $db->prepare($sqll);
$q->execute(array($ip,$_SESSION['username']));
$_SESSION['user'] = $_POST['myusername'] ;
$sqlll = "INSERT INTO user_log (username,ip) VALUES (?, ?)";
$qq = $db->prepare($sqlll);
$qq->execute(array($_SESSION['username'],$ip));
header("Location: home.php");
} else {
echo "Wrong Username or Password";
}

代码可以注入(inject)吗?

这是我的 home.php 页面,它阻止用户查看它。

/// My conenct is here                    
$sql = "SELECT * FROM users WHERE username='$_SESSION[user]'";
$result = mysql_query($sql) or die(mysql_error());
$values = mysql_fetch_array($result);


if( isset($_SESSION['user']) ) {

} else {
echo "Bye Bye";
die;
}

if ( $values['mod'] == 1 ) {
echo "welcome";
} else {
echo"Your account has been reported for hacking";
die;
}

最佳答案

假设您显示的查询是您使用的唯一查询,那么有趣的是黑客如何使用您认为会阻止他的代码。在 IT 世界中,前门通常是三重锁定的,但后门是敞开的。在这种情况下,它不是后门,而是门上的小窗口,您可以用它来查看您是否在向骗子开放。

对所有查询使用准备好的语句和变量绑定(bind)。

这是一般规则。您只是忘记了“所有查询”中的“全部”。

你的陈述:

$sql = "SELECT * FROM users WHERE username='$_SESSION[user]'";

是您打开的窗口。很明显,您的黑客在 session 数据中欺骗了用户名。简单的解决方案是:

  1. 在使用它做任何事情之前验证用户名或您从外部接收到的任何数据($_SESSION、$_POST、一些 $_SERVER 和其他)。当然是在您执行任何数据库交互之前。
  2. 像在其他查询中一样使用变量绑定(bind)。

在这种情况下删除标签或使用 mysql_real_escape_string 的值(value)较小,因为没有任何不可存储的字符完全可以破解。

顺便说一句,您实际上并不需要使用 PDO 来使用变量绑定(bind)。在 mysql 中也完全有可能。

$verbLok = mysqli_connect(Iam, not, gonna, tellyou);
$result = array();
if (($stmtLok = $verbLok->prepare( "SELECT * FROM users WHERE username = ? limit 1")))
{
$stmtLok->bind_param("s", $_SESSION[user]);
$stmtLok->execute();
$result = $stmtLok->get_result();
$stmtLok->close();
}
mysqli_close($verbLok);

应该可以为您解决问题。 $result 将保存一组结果行。我不太熟悉常规查询了,但据我所知,它与您的代码相似。

可以找到有关如何对您的查询进行 SQL 代码注入(inject)攻击的有趣阅读 on this page .

关于php - 我的代码可以安全注入(inject)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10765671/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com