【问题标题】:Is this code protected for SQL injection?此代码是否受 SQL 注入保护?
【发布时间】:2021-03-19 17:24:42
【问题描述】:

这足够安全吗?还是应该改进?此代码是否受 SQL 注入保护? (PHP)

if (isset($_POST['mailSet'])) {
$asd=filter_input(INPUT_POST, 'TypeM', FILTER_SANITIZE_NUMBER_INT);
$zxc=filter_input(INPUT_POST, 'mailFor', FILTER_SANITIZE_NUMBER_INT);
global $wpdb;

try {
    $wpdb->get_row($wpdb->prepare("UPDATE mail_sttng set setting_val=%d
    WHERE setting=1
    ", $asd));
    $wpdb->get_row($wpdb->prepare("UPDATE mail_sttng set setting_val=%d
    WHERE setting=2
    ", $zxc));


bla bla...

【问题讨论】:

  • 缺少标签? php 或许?
  • 我没有包含所有代码。是的,PHP

标签: php sql wordpress code-injection protected


【解决方案1】:

我想当然地认为$wpdbfrom the WordPress project

那么作为explained by the documentation,这些占位符的目的就是防止SQL注入。

因此您可以认为您的代码对 SQL 注入是安全的。

我个人喜欢尽快将我的值转换为正确的类型,现在也许这就是filter_input 的目的,我不知道。

$asd = (int) filter_input(INPUT_POST, 'TypeM', FILTER_SANITIZE_NUMBER_INT);
$zxc = (int) filter_input(INPUT_POST, 'mailFor', FILTER_SANITIZE_NUMBER_INT);

【讨论】:

    【解决方案2】:

    可能不会。您可能应该这样做:

    $wpdb->get_row($wpdb->prepare("UPDATE mail_sttng set setting_val=%d
        WHERE setting=1
        ", htmlspecialchars($asd)));
    

    如果 setting_val 不是字符串字段,您可能需要验证是否也传递了正确的数据类型

    【讨论】:

    • prepare 方法的目的是已经适当地处理数据。 developer.wordpress.org/reference/classes/wpdb/prepare 在此之上添加额外的编码“层”是错误的,并且在数据库查询中使用 htmlspecialchars 毫无意义。
    • “可能”听起来你不确定,所以你能至少解释一下为什么这应该是必要的吗?
    猜你喜欢
    • 2011-02-03
    • 2010-12-24
    • 2012-04-14
    • 2010-12-20
    • 2013-03-12
    • 2014-01-15
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多