【问题标题】:jQuery - Save to SQL via PHPjQuery - 通过 PHP 保存到 SQL
【发布时间】:2010-05-06 11:34:13
【问题描述】:

这对你们来说可能很容易,但我无法理解。 我想将图像的文件名保存到 SQL 库中它自己的行中。

基本上,我登录到我拥有自己的用户 ID 的网站。 每个用户都有自己的背景图片栏。用户可以根据需要选择自己的图像。所以基本上,当用户点击他想要的图像时,会发生一个 jquery click 事件,并对一个应该负责实际更新的 php 文件进行 ajax 调用。每个用户的行始终存在,因此只需要更新数据。

首先,我收集 css 属性 'background-image' 的文件名并将其拆分,因此我只得到文件名。然后我将该文件名存储在我称为“文件名”的变量中,然后将其传递给这个 jQuery sn-p:

    $.ajax({
        url: 'save_to_db.php',
        data: filename,
        dataType:'Text',
        type: 'POST',
        success: function(data) {
            // Just for testing purposes.
            alert('Background changed to: ' + data);
   }   

  });

这是保存数据的php:

<?php 
require("dbconnect.php");

$uploadstring = $_POST['filename'];

mysql_query("UPDATE brukere SET brukerBakgrunn = '$uploadstring' WHERE brukerID=" .$_SESSION['id']);
mysql_close();  
?>

基本上,每个用户都有自己的 ID,这称为“brukerID” 表中的所有内容都称为“brukere”,而我应该更新的列是名为“brukerBakgrunn”的列

当我只运行 javascript sn-p 时,我得到这个消息框作为回报:

背景更改为:
警告:session_start() [function.session-start]: 无法发送会话缓存限制器 - 标头已发送(输出开始 在 /var/www/clients/client2/web8/web/save_to_db.php:1) 在 /var/www/clients/client2/web8/web/access.php 上线3

这是 dbconnect.php

<?php
$con = mysql_connect("*****","******","******");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }  

mysql_select_db("****", $con);
require("access.php");
?>

这是access.php:

<?php
// Don't mess with ;)
session_start();

if($_REQUEST['inside']) session_destroy();

session_register("inside");
session_register("navn");
if($_SESSION['inside'] == ""){
    if($_POST['brukernavn'] and $_POST['passord']){
    $query = "select * from brukere where brukerNavn='" . $_POST['brukernavn'] . "' and brukerPassord = md5('" . $_POST['passord'] ."')";
    $result = mysql_query($query);      
    if(!$result) mysql_error();
    $rows = @mysql_num_rows($result);
        if($rows > 0){
    $_SESSION['inside'] = 1;
    $_SESSION['navn'] = mysql_result($result,"navn");
    $_SESSION['id'] = mysql_result($result,"id");
    Header("Location: /");
    } else {
    $_SESSION['inside'] = 0;
    $denycontent = 1;
    }
    } else {
    $denycontent = 1;
    }
}

if($denycontent == 1){
include ("head.php");
print('   
<body class="bodylogin">
   content content content      
</body>
');
include ("foot.php");
exit;
}
?>

【问题讨论】:

    标签: php javascript jquery sql sql-update


    【解决方案1】:

    重大安全问题!

    您没有引用和转义 MySQL 查询的输入。我可以轻松破解结尾,堆叠另一个查询,然后删除您的整个数据库!

    另外,您缺少mysql_query() 末尾的结尾括号。

    【讨论】:

    • 您将如何将您的查询放入他的会话变量 ID 中?这可能会被检查并且不受污染。
    • 为什么是会话? uploadstring 来自 post 数据。
    • 所以?甚至 $uploadString 也没有被引用 + 转义;我可以轻松破解那个。
    • 从未听说过引用和转义输入。可以轻松解决吗?
    • 您需要在输入周围加上引号(以允许空格),然后用反斜杠转义任何引号,这样黑客就无法“摆脱”字符串并形成自己的 MySQL 语句。
    【解决方案2】:
    mysql_query("UPDATE brukere SET brukerBakgrunn = $uploadstring WHERE brukerID=" .$_SESSION['id'] ."";
    

    应该是

    mysql_query("UPDATE brukere SET brukerBakgrunn = $uploadstring WHERE brukerID=" .$_SESSION['id']);
    

    右括号丢失,引号(“”)无用。

    阅读SQL injection 以确保您的应用程序安全。

    编辑:

    <?php
     require("dbconnect.php")
    ?>
    
    <?php
    

    此代码向输出发送(在 ?> 和

    【讨论】:

    • +1,我进行了编辑以修复您的错字,并想对注入发表评论。但是你已经把注射的东西放进去,不小心把我的更正了;-)
    • 好的,我更新了第一篇文章。我从 ajax 方法得到不同的消息。这是关于它无法发送会话缓存限制器,标头已发送。而且数据也没有更新。如果我从 php 文件中删除 'require("dbconnect.php"),那么我从 ajax 得到的所有回报都没有。所以看起来很有必要。
    • 删除多余的 ?>
    • 啊!好的,所以这删除了该错误消息并给了我另一个:p 检查我更新的第一篇文章
    • $uploadstring = ($_POST['filename']); - 我不确定你用括号包裹变量的原因是什么。 $uploadstring = $_POST['文件名'];应该没问题。
    【解决方案3】:

    去掉 session_start() 之前的空行:

    ?>
    
    <?php
    

    【讨论】:

    • 不做任何事情,因为 session_start() 之前没有空行;编辑:对不起,我现在明白你的意思了:) 修复了那个。
    【解决方案4】:

    最初的错误是由于 require 行中缺少分号。

    正如其他人所说,您需要了解sql注入和使用占位符。改掉使用提交数据而不使用占位符或先转义的习惯。

    【讨论】:

    • 我连习惯都没有!我只是在摸索,试图了解所有这些。
    【解决方案5】:
    <?php
    //require_once("dbconnect.php");
    
    $uploadstring = $_REQUEST['filename'];
    
    $db_pswd = 'xxx-xxx-xxx';
    $db_user = 'john_doe';
    $db_table = 'my_table';
    
    $con = mysql_connect( 'localhost' , $user , $pswd );
    if (!$con)
      {
      die('Could not connect: ' . mysql_error());
      }
    
    mysql_select_db( $db_table , $con );
    
    mysql_query(" UPDATE brukere SET brukerBakgrunn = '".$uploadstring."'
    WHERE brukerID = '".$_SESSION['id']."' ");
    
    mysql_close($con);
    ?>
    

    我认为您需要使用新代码!你的被妥协了! ;-))

    【讨论】:

    • 好吧,我想我需要了解这一切是如何运作的。我的意思是,在登录网站之前,您的代码的第一部分基本上也是我所做的。那么,我登录后,连接是否仍然打开?我需要再次提供连接属性吗?
    【解决方案6】:

    您忘记了 mysql_query 行中的结束 ')' !

    mysql_query("UPDATE brukere SET brukerBakgrunn = $uploadstring WHERE brukerID=" .$_SESSION['id'] );
    

    您也不需要在查询末尾加上 .""。

    【讨论】:

      【解决方案7】:
      require("dbconnect.php")
      

      应该是

      require("dbconnect.php");
      

      【讨论】:

      • 如果我这样做,同样的错误消息会再次显示“无法发送会话缓存限制器”。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多