如何保护此表单免受SQL注入

时间:2011-07-15 12:34:10

标签: php mysql validation

  

可能重复:
  Editing MySQL recode using a HTML form

想知道如何验证此提交表单的输入。通过验证我的意思是保护它免受SQL注入。任何帮助将非常感激。谢谢。

<?php

session_start();
if(!session_is_registered(ausername)){
header("location:main_login.php");
}
include ("header.php");
include ("../db.php");

$catname = $_POST['catname'];
$catdisc = $_POST['catdisc'];

$id = $_GET['id'];
        if (isset($id))
        {
$query = "SELECT * FROM categories WHERE catid='$id'";
$result= mysql_query($query) or die ('Mysql Error');

}
//Get category name and discription
while($row = mysql_fetch_array($result)){
$cname = $row['catname'];
$cdisc = $row['catdisc'];
}
?>

<?php

$result= mysql_query ("UPDATE categories SET catname='$catname', catdisc='$catdisc' WHERE catid='$id'")
or die ('Error Updating'); 

?>

<h1>Edit Categories</h1>

<form method="post" action="../admin/edit_cat.php?id=<?php echo $id;?>">
Category Name: <input type="text" name="catname" value="<?php echo $cname;?>"><br/>
Category Discription: <TEXTAREA NAME="catdisc"ROWS="3" COLS="25"><?php echo $cdisc;?></TEXTAREA><br/><br/>
<input type="submit" value="Update Category"/>
</form>

<?php
include ("footer.php");
?>

5 个答案:

答案 0 :(得分:4)

字符串(在查询中必须是单引号/双引号!) - &gt; mysql_real_escape_string();

整数(可以没有引号) - &gt; intval();

$catname = mysql_real_escape_string($_POST['catname']);
$catdisc = mysql_real_escape_string($_POST['catdisc']);
$id = intval($_GET['id']);

$result= mysql_query ("UPDATE categories SET catname='$catname', catdisc='$catdisc' WHERE catid=$id")

答案 1 :(得分:2)

为所有查询变量添加mysql_real_escape_string调用,请参阅http://php.net/manual/en/function.mysql-real-escape-string.php

答案 2 :(得分:2)

请参阅PHP SQL Injection文档中的“规避技术”。

答案 3 :(得分:0)

使用数据库库使用占位符。更好的API,它免费处理SQL注入。

例如,请参阅准备并执行MDB2

答案 4 :(得分:0)

在处理用户可以更改的值时使用预准备语句:http://us2.php.net/manual/en/pdo.prepare.php

他们无法进行SQL注入。