php - 来自远程文件的 SQL 注入(inject)

标签 php mysql security code-injection mysql-real-escape-string

我有一个文件“submit.php”,它将从“choose-product.php”中的先前表单提交的一系列值写入 MySQL 数据库。我已经按照上一个问题中的建议使用了 mysql_real_escape_string ,但我注意到,如果我将“choose-product.php”文件上传到单独的服务器并将表单的打开方式更改为

<form name="form" id="form" action="http://www.myserver.com/submit.php" method="post">

还会将一系列值写入数据库。显然,这是非常糟糕的!现在,我知道会有一种方法来纠正这个问题,但由于这是我第一次编写这样的代码,所以我有点困惑。

以下是 submit.php 的完整代码:

<?php
include("db.php");

function random_string() {
    $character_set_array = array();
    $character_set_array[] = array('count' => 7, 'characters' => 'abcdefghijklmnopqrstuvwxyz');
    $character_set_array[] = array('count' => 1, 'characters' => 'ABCDEFGHIJKLMNOPQRSTUVWXYZ');
    $character_set_array[] = array('count' => 3, 'characters' => '0123456789');
    $character_set_array[] = array('count' => 1, 'characters' => '!@#$*&:');
    $temp_array = array();
    foreach ($character_set_array as $character_set) {
        for ($i = 0; $i < $character_set['count']; $i++) {
            $temp_array[] = $character_set['characters'][rand(0, strlen($character_set['characters']) - 1)];
        }
    }
    shuffle($temp_array);
    return implode('', $temp_array);
}

$key = random_string();


if($_SERVER["REQUEST_METHOD"] == "POST") {
    $productid = mysql_real_escape_string($_POST['productid']);
    mysql_query("INSERT INTO sales VALUES('','$productid','$key',CURRENT_TIMESTAMP,'','active')");
    echo "
    <form action='XYZ' id='BB_BuyButtonForm' method='post' name='BB_BuyButtonForm' target='_top'>
        <input name='item_name_1' type='hidden' value='Test item 1'/>
        <input name='item_description_1' type='hidden' value='Testing item sales'/>
        <input name='item_quantity_1' type='hidden' value='1'/>
        <input name='item_price_1' type='hidden' value='0.5'/>
        <input name='item_currency_1' type='hidden' value='GBP'/>
        <input name='shopping-cart.items.item-1.digital-content.url' type='hidden' value='http://www.XYZ.com/download.php?key=$key'/>
        <input name='_charset_' type='hidden' value='utf-8'/>
        <input alt='' src='XYZ' type='image'/>
    </form>
    ";
}
?>

最佳答案

欢迎使用 HTTP 协议(protocol)。

http://www.myserver.com/submit.php任何人都可以随时调用。调用的表单可以位于任何其他网页上。或者用户实际上可能根本不从表单调用它,而是可以使用命令行工具来提交数据。该工具可能声称自己是一个网络浏览器,而您却并不知道。

我从你的问题中猜测:

您是否依赖choose-product.php 为submit.php 提供某种安全性?

你不能。

您必须对submit.php 进行所有安全检查,即使您刚刚在5 秒前对choose-product.php 进行了这些检查。

关于php - 来自远程文件的 SQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8885478/

相关文章:

php - 使用 preg_replace 删除 php 中两个字符串之间的文本

php - 检查数据库值的复选框

php - 如何检查数据库中已有的空表

MYSQL:自动从输入的日期中提取年份到另一列

git - 为什么要签署 Git 标签?

c# - 在执行托管应用程序时,.NET 执行的最耗时的检查是什么?

php - 覆盖后图像未更新

PHP fatal error : require_once(): Failed opening required 'Zend/Gdata/Extension.php'

mysql - 保存或更新时自动插入日期列之间经过的天数

c# - 在 .NET 中加密短字符串的最佳方法是什么?