【问题标题】:How to query database in MediaWiki?如何在 MediaWiki 中查询数据库?
【发布时间】:2015-09-11 08:46:11
【问题描述】:

我第一次处理自定义扩展/特殊页面。我正在尝试创建一个简单的页面来查询数据库并在页面上显示结果。我得到了以下代码:

class SpecialBuildRating extends SpecialPage {

function __construct() {
    parent::__construct( 'BuildRating' );
}

function execute( $par ) {

    if(isset($_GET['id'])){

        $buildId = $_GET['id'];

        $db = wfGetDB( DB_SLAVE );

        $res = $db->select(
            'build_rating',
            array('article_id', 'user_id', 'vote', 'comment', 'date'),
            'article_id = 1485', //BuildId instead of 1485
            __METHOD__,
            array( 'ORDER BY' => 'date ASC' )
        );
    }

    $request = $this->getRequest();
    $output = $this->getOutput();
    $this->setHeaders();

    # Get request data from, e.g.
    $param = $request->getText( 'param' );

    # Do stuff
    # ...
    $wikitext = 'Hello world!';
    $output->addWikiText( $wikitext );

    $outP = '<table style="width:100%">
                <tr>
                    <td>article_id</td>
                    <td>user_id</td>
                    <td>vote</td>
                    <td>comment</td>
                    <td>date</td>
                </tr>
            ';

    if ($res != null) {
        foreach( $res as $row ) {
            $outP .= '<td>' . $row->article_id . '</td><td>' . $row->user_id . '</td><td>' . $row->vote . '</td><td>' . $row->comment . '</td><td>' . $row->date . '</td>';
        }
    }

    $output->addWikiText( $outP );
    }
}

如何以防止注入的安全方式将$buildId 传递给WHERE 语句而不是1485

另一个我认为不是问题的问题是$output-&gt;addWikiText($var); 输出调用,有没有更简单/更有效的方法?

【问题讨论】:

    标签: php mediawiki mediawiki-extensions


    【解决方案1】:
    $res = $db->select(
        'build_rating',
        array('article_id', 'user_id', 'vote', 'comment', 'date'),
        array( 'article_id' => $buildId ),
        __METHOD__,
        array( 'ORDER BY' => 'date ASC' )
    );
    

    详情请见https://www.mediawiki.org/wiki/Manual:Database_access

    在输出时,请使用$output-&gt;addHTML(),但在这种情况下,您需要对preventing XSS 负责。

    另外一点,在 MediaWiki 中建议使用 $this-&gt;getRequest()-&gt;getInt( 'name', $defaultValue ) 而不是直接访问请求全局变量。

    【讨论】:

    • 好的,那么在 select 调用中传递变量是否安全?另外,如果我坚持我现在的$output-&gt;addWikiText($var);,我就不用担心注入和XSS?
    • 是的,只要您依赖 MW 原语就可以了。但是在"article_id &gt; $buildId"等非标准用法的情况下,您必须手动转义。
    • addWikiText() 通过不允许任何非安全 HTML 的 MW 解析器处理其输入。就像在编辑期间添加到页面一样。
    猜你喜欢
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 2014-11-01
    相关资源
    最近更新 更多