在SQLite3中避免SQL注入

我正在试图找出一种避免SQL注入的简单方法,到目前为止我只能够 想出两个想法:</ p>


  • Base64编码用户输入(不要真的想这样做)</ li>
  • 使用正则表达式 删除不需要的字符 (目前正在使用它,不确定它是否100%安全)</ li>
    </ ul>

    这是我当前的代码:</ p>

       &lt;?php 
    $ hash = $ _GET ['file'];

    if if(isset($ hash))
    {
    $ db = new SQLite3(“Files.db”);
    \ n if($ db!= null)
    {
    $ hash = preg_replace('/ [^ A-Za-z0-9 。\ - + =] /','',$ hash);

    if($ response = $ db-&gt; query(“SELECT [FILE] FROM'$ hash'”))
    {
    echo $ response-&gt; fetchArray()[0]; //如果成功则返回文件名。
    }
    }
    }
    ?&gt;
    </ code> </ pre>

    我的问题是我是否正确行事 方式或有没有更好的方法来做到这一点?</ p>
    </ div>

展开原文

原文

I'm trying to figure out a good easy way to avoid SQL Injection and so far I've only been able to come up with two ideas:

  • Base64 encode the user input (Don't really want to do this)
  • Use regex to remove unwanted characters. (Currently using this, not sure if it's 100% safe)

Here is my current code:

    <?php
        $hash = $_GET['file'];

        if (isset($hash))
        {
            $db = new SQLite3("Files.db");

            if ($db != null)
            {
                $hash = preg_replace('/[^A-Za-z0-9 _.\-+=]/', '_', $hash);

                if ($response = $db->query("SELECT [FILE] FROM '$hash'"))
                {
                    echo $response->fetchArray()[0]; // File name is returned if successful.
                }
            }
        }
    ?>

My question is am I going about this the right way or are there any better ways to do this?

doubaisui2526
doubaisui2526 可能的重复如何在PHP中阻止SQL注入?
6 年多之前 回复
dongqichang7988
dongqichang7988 将PDO与参数化查询一起使用。
6 年多之前 回复

2个回答

Get your database library to do it for you. The PHP Sqlite3 library supports prepared statements:

$stmt = $db->prepare('SELECT bar FROM foo WHERE id=:id');
$stmt->bindValue(':id', 1, SQLITE3_INTEGER);
donglu1472
donglu1472 +1学习使用参数是个好主意。 它比将PHP变量复制到SQL字符串更安全,更容易。
6 年多之前 回复
du3669
du3669 too long
6 年多之前 回复



防止SQL注入的常见建议是使用准备好的查询并使用参数将动态内容组合到SQL表达式中。</ p >

但这仅适用于使用动态内容代替单个标量值,如数字或带引号的字符串或日期文字。</ p>

在您的 例如,您显示一个PHP变量替换FROM子句中的表名。 您无法使用参数进行此用法。 实际上,您显示的用法在任何情况下都不起作用,因为您使用单引号引用表名,就好像它是一个字符串文字。 我不认为SQLite支持这一点。</ p>

为了防止动态表名的SQL注入,最佳做法是使用白名单</ em>。 也就是说,将输入与已知有效表名列表进行比较,如果用户尝试输入不在该列表中的任何内容,请拒绝它。</ p>

 &lt;?php  

$ valid_tables = array('table1','table2','table3');

$ hash = $ _GET ['file'];

if(array_search($ hash,$ valid_tables) ){
...执行您的查询...
}其他{
...发出错误或其他默认行为...
}
</ code> </ pre>
\ n

你可以通过硬编码,读取配置文件来创建 $ valid_tables </ code>数组,或者你可以在SQLite数据库中查询所有当前存在的表。</ p>
</ div>

展开原文

原文

The common advice to protect against SQL injection is to use prepared queries and use parameters to combine dynamic content into your SQL expressions.

But this only works if you use the dynamic content in place of a single scalar value, like a number or a quoted string or date literal.

In your case, you show a PHP variable replacing a table name in the FROM clause. You can't use a parameter for this usage. In fact, you show a usage that won't work in any case, because you're quoting the table name with single-quotes, as if it's a string literal. I don't think SQLite supports this.

To help protect against SQL injection for a dynamic table name, the best practice is to use whitelisting. That is, compare the input against a list of known valid table names, and if the user tries to enter anything that's not in that list, reject it.

<?php

$valid_tables = array('table1', 'table2', 'table3');

$hash = $_GET['file'];

if (array_search($hash, $valid_tables)) {
    ...do your query...
} else {
    ...issue an error or else some default behavior...
}

You may create the $valid_tables array by hard-coding it, reading a config file, or you may query your SQLite database for all the currently existing tables.

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐