【问题标题】:How to protect $_POST and params from hackers [duplicate]如何保护 $_POST 和参数免受黑客攻击 [重复]
【发布时间】:2016-02-06 08:50:56
【问题描述】:

我将它与html2canvas.js 一起使用以从 HTML 生成和保存图像。

我使用 url 参数来完成这项工作 - 例如:website.com/?price=10&name=xxx

到这里为止一切正常 - 脚本运行良好 - 图像保存在 /cart/ dir

<?php
$image = $_POST['image'];
$username = $_POST['username'];
$front_class = $_POST['front_plass'];
$decoded = base64_decode(str_replace('data:image/png;base64,', '', $image));
$date = date('d-M-Y-h-i-a', time());
$curdir = getcwd();
$cartDir = $curdir ."/cart";
$userDir = $cartDir.'/'.$username;
if (!file_exists($userDir)) {
    mkdir($cartDir.'/'.$username, 0777);
}
$name = $front_class."-front-".$date.".png";
$full_path = $userDir.'/'.$name;
$name1 = 'cart/'.$username.'/'.$name;
function ImageFillAlpha($image, $color) {
    imagefilledrectangle($image, 0, 0, imagesx($image), imagesy($image), $color);
}
function imageCreateCorners($sourceImageFile, $name, $radius) {
...
}
file_put_contents($full_path, $decoded);
imageCreateCorners($full_path, $name, 25);
echo '<img src="'.$name1.'" alt="front" id="front_img" />'; 
?>

还有js

 html2canvas($('#front'), {
        "logging": true,
        //"proxy":"html2canvasproxy.php",
        "onrendered": function(canvas){
               var dataURL = canvas.toDataURL("image/png");
               $.post('image_front.php',{
                    image: dataURL,
                    username: username,
                    front_class: frontClass
               },function(data){
                    $('.imageHolder_front').html(data);
               });
        }
});

问题是昨天有人黑了我两次,我认为这是我需要保护$_POST 或者参数可能是问题?

这里有什么帮助吗?我不太擅长后端开发——更擅长前端。

谢谢。

【问题讨论】:

  • 您没有验证您的数据。编程的第一条规则是假设您的用户是恶意的。 (第二个是假设他们很愚蠢)。
  • @JohnConde 我无法验证 用户名,因为它可以使用任何类型的字符。
  • 您还应该有一些 CSRF(跨站点请求伪造)保护,因为我猜您是在使用表单中的参数构建 URL?
  • @Adrian 你可以验证用户名是真实的。
  • 为什么有些固定在数据库的使用上?这个问题没有代码支持它,也没有提到它。

标签: php post


【解决方案1】:

你犯了几个大错误。

首先,如@JohnConde 所说,验证您的 POST 数据,永远不要直接在您的代码中使用它们。

其次,不要在您的服务器上创建具有 777 权限的目录,因为每个人都可以写入它并以这种方式入侵您。

【讨论】:

    【解决方案2】:

    您不能“保护”参数。您的服务器是一个接收任意 HTTP 请求并返回 HTTP 响应的盒子。意识到这一点:任何人都可以随时向您的服务器发送任意 HTTP 请求,其中包含他们想要的任何数据。您无法控制他人向您发送的内容。您唯一可以控制的是您如何处理这些数据。预计此数据不符合您的期望。事实上,预计它是恶意的。验证它而不是假设它符合任何特定格式。切勿在 SQL 查询或构建文件路径时盲目使用用户提供的数据,而无需转义/绑定/验证/确认数据,否则您可能会构建意想不到的字符串。

    这是所有编程的一个基本真理。您需要牢记这一点,从头开始编写应用程序。没有简单的解决办法,只有勤奋。

    【讨论】:

      【解决方案3】:

      清理您的用户输入。一般来说:永远不要相信用户输入!

      我会推荐@Charles 在这个问题的第一个答案中的非常好的文章:What are the best PHP input sanitizing functions?

      【讨论】:

        【解决方案4】:

        即使您不使用 url 参数,黑客也可以进行黑客攻击。

        必须在后端完成。在与数据库交互之前,您已经检查了参数是否是您所期望的。 例如,你不应该在你的参数中允许单引号,这实际上会允许黑客在你的查询中添加更多的查询。

        使用 mysqli 准备好的语句

        【讨论】:

        • '不允许单引号'...?!那么,没有人可以通过互联网发送单引号吗?我称之为恶作剧。
        • 准备好的语句只能保护您免受数据库可能发生的坏事。那么跨站点脚本攻击呢?我已经在我的回答中指出了在哪里可以找到有关此的好信息。
        • 例如 select * from users where username='shiva' and password='password';从 username='shiva' 和 password='1' 或 1=1 或 1=1 的用户中选择 *。如果在密码字段中允许此字符串,他们可以轻松登录到您的系统。
        • 我这里不使用数据库。我将尝试过滤用户名 - 用户 ID 只能包含字母、数字、句号、星号、下划线或破折号。
        • 您好 Adrian,即使您从前端保护,也可以使用代理等工具修改您的值并将其发送到数据库。所以你必须对银行进行消毒。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-05
        • 2011-03-16
        • 2019-05-22
        • 1970-01-01
        • 2011-01-31
        • 1970-01-01
        • 2018-04-02
        相关资源
        最近更新 更多