【问题标题】:WordPress SQL commands in textareas文本区域中的 WordPress SQL 命令
【发布时间】:2017-06-02 08:25:11
【问题描述】:

假设我有一个在帖子中生成以下内容的表单:

$title = sanitize_text_field($_POST['title']);
$text = esc_textarea($_POST['$text']);

然后我使用准备语句在数据库中插入值,但我有一个问题。我有这一行将值发送到数据库:

$wpdb->prepare("INSERT INTO $table_emails VALUES('', %s, %s)", $title, $text);

可以说这样可以防止人们插入SELECT * FROM table_name之类的内容吗?

【问题讨论】:

    标签: php mysql wordpress prepared-statement


    【解决方案1】:

    准备好的语句“注入”值并将您的查询包装在“标签”和其他东西中。我不是 MySQL 专家,因为这些天我依赖查询构建器,但准备好的语句的一般目的是避免注入。

    上面应该输出类似

    INSERT INTO `$table_emails` VALUES ('','title', 'text');
    

    如果有人试图在上面插入一个语句,我很确定(大约 6 年没有使用 wordpress)它看起来像这样:

    INSERT INTO `$table_emails` VALUES ('', '\';SELECT * FROM blah;\'', '');
    

    请注意,现在注射只是我年轻的学徒的一根绳子。

    但是是的,准备好的语句是老板防止 bobby drop 表进入的方式。

    【讨论】:

    • 感谢@sourRaspberri =) 的回答,这样安全吗?我已经做了一个测试,并且将 sql 作为一个简单的字符串插入。没有伤害。
    • 是的,你会没事的,但要考虑的一件事是 html 和 javascript 注入。不确定 wordpress 是否涵盖了这一点,但请检查在显示您的数据时(无论插入的数据显示在您网站上的何处)使用 htmlentites() 这将导致在您的页面上出现一个与 html 相对的字符串! php.net/manual/en/function.htmlentities.php
    • 对于我在 wordpress 法典中读到的内容,sanitize_text_field() 和 sanitize_textarea_field() 都会处理这个问题。 (只需将 esc_textarea() 更改为 sanitize_textarea_field() ),谢谢 =)
    • 没关系!不过,你应该看看 laravel ;) 太好了:D
    猜你喜欢
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多