【问题标题】:Is it a bad approach to loop in values from JS->PHP->mySQL?从 JS->PHP->mySQL 循环输入值是一种不好的方法吗?
【发布时间】:2017-08-04 09:34:50
【问题描述】:

我仍在学习并尝试编写尽可能小而有效的代码。

所以我从 HTML 表单向 mySql 插入数据时的常规方法是 使用 Jquery 获取输入值:

var formdata = {};
    $('.formdata').each(function(){
        formdata[ $(this).attr('name') ] = $(this).val();
});

使用 Ajax 将其发送到 PHP:

$.ajax({
        url: 'file.php',
        method: 'post',
        data: {formdata: formdata},
        success: function(result){
            console.log(result)
        }
 });

抓取 POST 并将其放入数组中:

$params_array = array(
        ':artNr' => $_POST['formdata']['artNr'],
        ':etc' => $_POST['formdata']['etc'],
);

最后放到mySql中:

$query = "INSERT INTO table SET artNr = :artNr, etc = :etc";
    try{ 
        $stmt = $db->prepare($query);
        $result = $stmt->execute($params_array);
    } 
    catch(PDOException $ex){
        die("Failed to run query: " . $ex->getMessage()); 
    }

我现在的问题是:
将值从 POST 循环到数组是一种不好的方法吗?

foreach( $_POST['formdata'] as $name => $value ){
    $params_array[$name] = $value;
}

询问的原因是我不知道您是否能够从控制台将内容发送到我的 JS“formdata[]”并进行黑客攻击?

我的意思是我将 HTML 表单中存在的任何内容循环到我的数据库中。我的“params_array”中没有任何硬编码键..
也许还有更多我不知道的安全漏洞?

我知道 PDO 对于 SQL 注入非常安全?!

【问题讨论】:

  • 不是 PDO 对 SQL 注入是安全的,准备好的语句是。您可以对mysqli_ 驱动程序执行相同的操作,这也很安全。我知道这根本不能回答你的问题,它只是一个小提示。
  • 一些想法,您应该明确您期望file.php 将返回的数据类型。我可以建议设置您的 $.ajax 属性 dataType: "json" 并在您完成处理后将结果返回到您的 file.php 中:echo json_encode( $result->fetchAll() );
  • @AnwarNairi 我不需要将 dataType 设置为 JSON 就可以使用 echo json_encode 返回它。我已经这样做了,并且有效。但是使用 dataType 更安全吗?
  • @Twinfriends 好的,谢谢你清除它。
  • “问的原因是我不知道你是否能够从控制台向我的 JS“formdata[]”发送东西并进行黑客攻击?” - 当然,如果您期望到达您的服务器的所有请求甚至都由“浏览器”发送,那您就太天真了……任何人都可以向您的脚本发送 any 数据,因此您不能依赖任何东西,但必须始终检查。

标签: php jquery ajax security pdo


【解决方案1】:

始终认为用户输入是(潜在的)危险的。如果您期望一个整数,请确保它实际上是一。客户端的验证并不能确保安全。我仍然可以为您的端点创建一个POST request,提供我想要的参数。

我不会在后端循环遍历 formdata 数组。如果参数的数量不加起来占位符的数量,它可能会破坏您准备好的语句。

所以,你做得很好:

$data = $_POST['formdata'];

$params = [
    ':artNr' => intval($data['artNr']),
    ':etc'   => htmlspecialchars($data['etc']),
];

另外,使用 jQuery 的serialize 方法将一组表单元素编码为字符串。这是一种更有效的获取表单值的方法。

var $form = $('#myForm');

$form.submit(function(event) {
    var request = $.post('https://endpoint.com', $form.serialize());

    request
        .done(function(data) {
            console.log('Done', data);
        })
        .fail(function(error) {
            console.log('Request fail', error);
        });

    event.preventDefault();
});

这样您就不需要遍历每个 .formdata 元素。

【讨论】:

  • 谢谢。我会调查一下。我没有使用常规的 HTML 表单,因为我不想重新加载页面。是否可以在 DIV 上使用 .serialize?
  • 不要对表单使用div 来开始黑客攻击,只需使用e.preventDefault() 防止触发默认操作即可。我会更新我的答案。
  • 为什么var前面的“$”? $form
  • 表示该变量包含一个jQuery对象,这是我喜欢遵循的代码实践。
猜你喜欢
  • 2012-07-13
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2022-11-21
  • 1970-01-01
  • 2018-05-01
相关资源
最近更新 更多