【问题标题】:SQL query not being executed from AJAX '$_POST' to PHP file未从 AJAX '$_POST' 到 PHP 文件执行 SQL 查询
【发布时间】:2019-06-01 06:19:39
【问题描述】:

我正在从 facebook API 检索用户信息并通过 AJAX 将其发送到我的 php 文件以写入 mysql 数据库。 这样做的原因是我可以生成一个随机凭证代码给他们,该代码也被写入数据库。

我完全没有这方面的经验,我只是一路学习。

我的 php 文件:

<?php
include_once 'db_connect.php';//$mysqli = new mysqli(HOST, USER, PASSWORD, 
DATABASE);
include_once 'psl-config.php';//database login details

if(isset($_POST['name'],$_POST['email'],$_POST['id'])){
    $name = $_POST['name'];
    $email = $_POST['email'];
    $uid = $_POST['id'];
    $code = generateRandomString();
    $prep_stmt="INSERT INTO memberinfo (name, email, id,code,dateadded) VALUES ('$name','$email','$uid','$code',now())";
    $stmt = $mysqli->prepare($prep_stmt);
    if($stmt) {
        $stmt->execute();
        $stmt->close();
}}

我的 javascript 然后从带有 onlogin="checkLoginState();" 的 facebook 按钮运行它功能:

    function checkLoginState() {
    FB.getLoginStatus(function(response) {

        if (response.status === 'connected') {
            FB.api('/me', { locale: 'en_US', fields: 'name,email,id' },
                function(response) {
                    $.ajax({
                        method: "POST",
                        url: "includes/process_fb_login.php",
                        data: response,
                        dataType: 'json',
                        cache: false,
                        success: function(data){
                            console.log(data);
                        }

                    });
                });
        }else{
            alert("Failed to login");
        }
    });
}

目前没有任何内容写入数据库,我什至不确定如何排除故障以查看正在执行的内容。

【问题讨论】:

  • 你遇到了什么错误?
  • 完全没有错误,我怀疑它甚至可能没有超过“isset”
  • 数据库登录详细信息似乎在数据库连接之后 - 这似乎是错误的方式?!此外,您正在使用mysqli 并且正在使用准备好的语句,但通过嵌入变量使您的 sql 易受攻击
  • 是的,可能是这样,明天早上我会检查,谢谢!另外,您对 SQL 易受攻击有何建议?你的意思是使用 preg_replace 之类的东西吗?
  • 这对SQL注入开放;使用准备好的语句php.net/manual/en/mysqli.quickstart.prepared-statements.php

标签: javascript php mysql ajax facebook


【解决方案1】:

我有几个问题:

首先 - 我的数据库 ID 是“整数”类型。这意味着我从 facebook 获得的 ID 号是 15 个字符长,您可以拥有的最大值是 2147483647(10 个字符)(有符号)或 4294967295(无符号)。所以我把它改成了varchar。

其次 - 似乎 if(isset($_POST['name'],$_POST['email'],$_POST['id'])) 让我有些吃力,我无法让它越过那条线。 最后,这是对我有用的代码。 不确定这是否是最好的方法,但是,嘿,它对我有用。

$email_exists="select email from memberinfo where email ='".$_POST['email']."'";
$exe = $mysqli->prepare($email_exists);
if($exe) {
    $exe->execute();
    $exe->store_result();
    if ($exe->num_rows == 1) {
        // A user with this email address already exists
        $exe->close();
    } else {
        $prep_stmt = "INSERT INTO memberinfo (name, email,username,id,code,dateAdded) 
    VALUES ('".$_POST['name']."','".$_POST['email']."','".$_POST['email']."','".$_POST['id']."','$code',now())";
    $stmt = $mysqli->prepare($prep_stmt);
    if ($stmt) {
        $stmt->execute();
        $stmt->close();
    }
}}

【讨论】:

  • 旁注:使用没有占位符的准备/执行本身并不构成prepared statement。您仍然对 SQL 注入持开放态度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
相关资源
最近更新 更多