【问题标题】:MySQL injection prevention not working?MySQL注入预防不起作用?
【发布时间】:2012-01-06 14:31:54
【问题描述】:

我想使用 mysql_real_escape_string 防止 1=1,但不确定我是否做得对,因为我仍然可以执行 1=1。这是我的代码:

$memberId = mysql_real_escape_string($_GET["memberId"]);
$sql = "SELECT firstName, lastName, dateSent, message, messageId FROM member, message WHERE member.memberId = message.sentFromId AND message.inboxId=" . $memberId . " ORDER BY dateSent DESC;";

谢谢

【问题讨论】:

标签: php mysql security


【解决方案1】:

mysql_real_escape_STRING() 用于 STRINGS,而不是整数。 1=1 中没有任何需要转义的内容,因此 m_r_e_s() 将原样传回。

如果您要处理整数,请使用整数工具:

$memberID = intval($_GET['memberId']);

【讨论】:

    【解决方案2】:

    不进行 SQL 注入的唯一正确方法是使用 prepared statements。 如果您尝试使用转义来缓解,您将失败。 如果您通常从不连接查询并始终使用准备好的语句,那么您就有机会。
    它还具有使您的代码更具可读性的优点。 而且没有缺点。

    【讨论】:

    • +1 我同意 MK。但是(只是为了分享)我对prepared statements 的立场是PDO 而不是mysqli :)
    • 回复。 “没有缺点”:如何使用准备好的语句创建多行插入(也称为扩展插入)?
    • 这不是真的。如果您将所有数据视为字符串作为规则,您将永远不会失败,除了 LIMIT 子句参数。无论如何,准备好的陈述仍然不是灵丹妙药。它对标识符没有帮助
    • @Mchl 看起来你是对的。其他实现(例如 JDBC)有批处理准备语句的概念,但显然没有 PHP。
    • @Col.Shrapnel 我完全不明白你刚才说什么。
    猜你喜欢
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多