【问题标题】:Slim framework - php - how prevent injections?Slim 框架 - php - 如何防止注入?
【发布时间】:2015-01-28 23:21:22
【问题描述】:

作为一名 android 开发人员,我想为我的服务器准备来自 android 应用程序的请求。第一个目标是创建将项目添加到数据库的请求链接。所以我在 Slim 框架的 php 文件中创建了类似下面的内容。

我的问题是:有没有机会通过调用/addEntry 来注入“坏文本”,这会导致数据库丢失或做一些不那么糟糕的事情?我怎样才能防止这种情况发生?

p.s 我希望你按照我的意思说。

<?php

require 'Slim/Slim.php';
\Slim\Slim::registerAutoloader(); 

$app = new \Slim\Slim();

$app->get(
    '/',
    function () {
        echo "working";
    }
);

ini_set('display_startup_errors', 1);
ini_set('display_errors', 1);
error_reporting(-1);

$username = ;
$password = ;
$hostname = ;
$database = ;

$dbhandle = mysql_connect($hostname, $username, $password) or die("Unable to connect to MySQL");

if (!mysql_select_db($database)) {
    die("not connected");
}

//#addEntry
$app->post(
    '/addEntry',
    function () {
        $app = \Slim\Slim::getInstance();
        $cat_id = $app->request()->post('cat_id');
        $ent_name = $app->request()->post('ent_name');
        $ent_description = $app->request()->post('ent_description');

        if ($cat_id == NULL || $ent_name == NULL) {
            $app->halt(400);
        }

        mysql_query('SET CHARACTER SET utf8');
        mysql_query("insert into t_entries VALUES(NULL, '" . $ent_name . "', " 
                . (empty($ent_description) ? "NULL" : "'". $ent_description ."'")
                . "," . $cat_id . ", '0' );");

        return;
    }
);

$app->run();

$app->run();

【问题讨论】:

  • 如果您使用的框架没有内置这种保护,您应该转义用户输入。阅读有关 sql injections 的信息,有很多示例。不推荐使用 mysql 函数。
  • 查找mysql_real_escape_string() 作为权宜之计,直到您可以切换库。如果你通过这个函数传递所有将被注入 SQL 的用户输入,你会没事的。参数绑定仍然是要走的路!
  • 旁白:为什么要给$app-&gt;run()打两次电话?

标签: php android security sql-injection slim


【解决方案1】:

我建议您使用一些现有的 ORM,例如 Doctrine 或 Eloquent。这样您就不必太担心用户输入,因为他们正在为您做所有艰苦的工作。

如果您仍想使用原生 php 函数,请不要使用 mysql_connect(),因为它已被弃用。请改用mysqli_connect()。为防止 sql 注入,请使用mysqli_prepare() 准备 SQL 查询。

另外,您不必这样做:

$app->post('/addEntry',function () {
    $app = \Slim\Slim::getInstance();

您可以使用 use 关键字将变量传递给闭包,如下所示:

$app->post('/addEntry',function () use ($app) {

【讨论】:

    【解决方案2】:

    我建议使用 php 函数 filter_var 来清理输入值。除此之外,我建议使用 ORM,例如 RedBean 或 Eloquent 或 Doctrine。如果您想更轻松,请尝试使用一些库,例如 DabbleMedoo。最后,我建议不要使用 php 原生函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      • 2017-12-12
      • 1970-01-01
      • 2018-03-23
      • 1970-01-01
      相关资源
      最近更新 更多