super 后期编辑(重要):请不要将此问题用作任何类型的教程。这里显示的示例对于任何攻击来说都是一场绝对的噩梦。我无法删除该问题,但请帮自己一个忙并关闭此选项卡。如果您将此处提供的 PHP 代码的某些部分放入此处,那么您的网站就会对最简单的 SQL 注入(inject)开放 - 如果您设法使其运行,因为即使在提出此问题时,此处显示的方法也已被弃用。如果您将此代码放入任何页面,则接受的答案会对您的网站产生所有可能的危险。谢谢。
我想要的只是一个具有 MySQL 行值的输入:
<?php
ob_start();
session_start();
require_once 'dbconnect.php';
$results = mysqli_query($con,"Select * FROM users WHERE userName ='$username'");
while ($name = mysqli_fetch_array($results))
{
extract($row);
}
// if session is not set this will redirect to login page
if( !isset($_SESSION['user']) ) {
header("Location: index.php");
exit;
}
// select loggedin users detail
$res=mysql_query("SELECT * FROM users WHERE userId=".$_SESSION['user']);
$userRow=mysql_fetch_array($res);
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
You just have logged in, so now you can go to your personal folder:<br>
<?php
if (isset($_POST['bt']))
{
header("Location: http://yougle.rf.gd/" . $_POST['folder']);
}
?>
<html>
<form id="form1" name="form1" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<input type="text" name="folder" id="folder" value=<?php echo $name[userName] ?>>
<input type="submit" name="bt" id="bt" value="Go To" />
</form>
</body>
</html>
<?php ob_end_flush(); ?>
正如你所看到的,我有表单...但是该字段是空的...我已经检查了所有变量(在数据库中是否相同),一切看起来都很好。
最佳答案
我几乎不知道从哪里开始。
- 您对 SQL 注入(inject)持开放态度。您不应该使用 mysql_* 函数。它们已被弃用并从当前的 PHP 版本中删除。而是使用 PDO或mysqli带有准备好的语句和绑定(bind)参数。
- 您(我假设)不必要地缓冲输出,以此来回避您不必要地发送
header()
的事实。内容被回显后。 - 你的 HTML 太糟糕了。两个
<html>
标签,无<body>
标签等。 - 这里有语法错误:
echo $name[userName]
因为userName
不是一个定义的常数。试试enabling error reporting你应该看到这个。 - 最后,为了锦上添花,您通过回显
$_SERVER['PHP_SELF']
获得了 XSS 漏洞。直接到浏览器。 http://www.html-form-guide.com/php-form/php-form-action-self.html解释如何使用htmlentities
逃避这些数据可以缓解这个问题。
就我个人而言,我更喜欢谨慎行事,将所有未硬编码到脚本中的变量绑定(bind)到查询,并在将其回显到浏览器之前正确转义所有内容,这样我就不必考虑其他内容可能会一路操纵这些值。
关于php - 如何使输入值成为 mysql 行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41454120/