代码是
if($_POST['update_id'])
{
$sql = '
UPDATE
affiliate_updates
SET
update_subject="' . $_POST['update_subject'] . '",
update_body="' . $_POST['update_body'] . '"
WHERE
update_id="' . $_POST['update_id'] . '"
LIMIT 1
';
mysql_query($sql);
header('Location: affiliate_updates?update_id=' . $_POST['update_id']);
exit;
}
如何修剪上述代码或简化代码?
任何想法或示例代码请告诉我。
如何使用SQLinjection上面的代码。有人给我看样例代码吗?
答案 0 :(得分:8)
您可以使用PHP的PDO库,它是数据库的OOP处理程序。优点是您可以根据需要更改数据库类型,whitout必须替换每个mysql_query
。
你的代码也做得非常糟糕。您在查询中使用未经验证的用户输入。使用准备好的PDO语句。或者使用mysql_real_escape_string($_POST['somevar'])
。
这与PDO相同:
$db = // already instanced somewhere earlier (PDO Instance)
$query = $db->prepare('UPDATE affiliate_updates SET update_subject = ?, update_body = ? WHERE update_id = ? LIMIT 1');
$query->execute(array($_POST['update_subject'], $_POST['update_body'], $_POST['update_id']));
header('Location: affiliate_updates?update_id=' . $_POST['update_id']);
答案 1 :(得分:2)
我建议使用一个小帮助函数从$ _POST数组和允许字段列表中生成正确的SET语句
function dbSet($fields) {
$set='';
foreach ($fields as $field) {
if (isset($_POST[$field])) {
$set.="`$field`='".mysql_real_escape_string($_POST[$field])."', ";
}
}
return substr($set, 0, -2);
}
所以,你的代码变成了
$id = intval();
$set = dbSet(array("update_subject","update_body"));
$sql = "UPDATE affiliate_updates SET $set WHERE update_id=$id";
mysql_query($sql) or trigger_error(mysql_error()." in ".$sql);
但是为了更方便的编码,您可能希望开发一些占位符系统,以及一些抽象层来访问您的数据库。因此,它可能会为您节省更多行:
$set = $db->filterPost(array("update_subject","update_body"));
$db->run("UPDATE affiliate_updates SET ?u WHERE update_id=?i",$set,$_POST['update_id']);