【发布时间】:2013-04-26 12:28:55
【问题描述】:
我对 php 很陌生,我只是在尝试编写一个脚本,但它的编写并不恰当,因为它容易受到 SQL 注入的攻击。我打算对此进行改进,但这只有在我使用 PHP 时才有可能。当我尝试从 Java (Android) 发布变量并使用它们来查询我的数据库时,我目前面临一个问题。但是脚本执行了两次,我在我的数据库中发现了重复的记录。以下是脚本:
<?php
require 'DbConnect.php';
$Make = $_POST["Make"];
$Model = $_POST["Model"];
$Version= $_POST["Version"];
$FuelType= $_POST["FuelType"];
$Kilo = $_POST["Kilo"];
$Price= $_POST["Price"];
$Reg= $_POST["Reg"];
$Color= $_POST["Color"];
$Mdate= $_POST["Mdate"];
$Desc= $_POST["Desc"];
$Loc= $_POST["Loc"];
$Owners = $_POST["Owners"];
$Negot= $_POST["Negot"];
$Trans= $_POST["Trans"];
$AC= $_POST["AC"];
$car_lockk= $_POST["Lockk"];
$Sunroof= $_POST["Sunroof"];
$Window= $_POST["Window"];
$Seat= $_POST["Seats"];
$Stearing= $_POST["Stearing"];
$Music= $_POST["Player"];
$Wheels= $_POST["Wheel"];
$Sound= $_POST["Sound"];
$Drive= $_POST["Drive"];
$ID = $_POST["Seller_ID"];
$query2 = "INSERT INTO used_cars (make, model, version, color, \
manufacturing_date, km_driven, fuel_type, expected_price, \
negotiable, registration_place, no_of_owners, description, \
current_location, transmission, ac, sunroof, window, seats, \
stearing, player, wheels, sound_system, drive, car_lockk, seller_id) \
VALUES ('$Make', '$Model', '$Version', '$Color', '$Mdate', '$Kilo', \
'$FuelType', '$Price', '$Negot', '$Reg', '$Owners', '$Desc', '$Loc', \
'$Trans', '$AC', '$Sunroof', '$Window', '$Seat', '$Stearing', \
'$Music', '$Wheels', '$Sound', '$Drive', '$car_lockk', '$ID')";
if(mysql_query($query2)){
echo 'success';
//echo $Img
}else{
echo 'Fail';
}
?>
【问题讨论】:
-
此代码易受SQL injection 的攻击,
mysql_函数已被弃用。请改为通过MySQLi 使用参数化查询。 -
在执行了两次点击后,您知道,例如,如果我发布我的数据,使用 query() 函数引导到您的页面,即刷新页面,它将发布又是相同的数据?
-
取消注释
if语句,数据插入成功后重定向。也请使用mySQLi或PDO。 -
如果使用 foreach 循环,可以节省大量代码:
foreach(array("make","whatever") as $col){ if(isset($_POST[$col])){ /*COPY AND ESCAPE*/} else {/*ERROR*/}} -
@Polynomial 这不仅仅是易受攻击,我会努力编写更多易受攻击的代码。