防止SQL注入

可能重复:
防止PHP中的SQL注入的最佳方法

我刚刚发现我的网站很可靠。

由于它连接到一个数据库,并具有如下功能:注册,更改密码,通知等...和SUPOSING它是完全脆弱的。

为了开始安全,我应该在代码中寻找什么?

我的意思是,我做了一些研究,到处都是,每个人都说不同的安全问题。

“使用PDO”。

“使用mysql_real_escape_string。”

“使用addslashes。”

我究竟应该寻找什么?

"$_POST" and "$_GET" variables??
"$_SESSION" variables?

SQL查询?

$sql = "select * from user";
$sql = "update user set user="new_user_name";
$sql = "insert into user (user) values ('userid')";

我应该在每种情况下做什么? 请帮助我知道我必须去哪些地方。

谢谢。


以下是安全的PHP应用程序要考虑的要点。

  • 使用PDO或mysqli
  • 不要相信任何输入。 考虑每个变量即$ _POST,$ _GET,$ _COOKIE,$ _SESSION,$ _SERVER,就好像它们被污染一样。 对这些变量使用适当的过滤措施。
  • 为避免XSS攻击,在将用户输入数据插入数据库时​​,使用php的内置函数htmlentities,strip_tags等。
  • 在PHP.INI中禁用注册全局
  • 在PHP.INI中禁用“allow_url_fopen”
  • 不要让用户输入超出要求的数据。 验证输入以允许最大字符数。 同时验证每个字段的相关数据类型。
  • 开发阶段后禁用错误报告。 它可能会提供对黑客有用的数据库信息。
  • 发布表单时使用一次性标记。 如果令牌存在并且匹配表单帖子有效,否则无效。
  • 使用参数化数据库查询
  • 使用存储过程
  • 你可以谷歌每个点的更多细节。 希望这可以帮助


    你应该寻找什么:从客户端/用户发送的任何数据。 清理/转义这些数据。

    PDO可以清理查询(使用PDO :: prepare)并支持多个SQL系统。

    对于MySQL,使用MySQLi。 如果您使用MySQL, mysqli_real_escape_string是用于mysqli_real_escape_string数据的函数。


    您提供的SQL查询都不容易受到SQL注入的影响。

    SQL注入漏洞发生是因为SQL输入未正确转义。

    例如:

    $sql = "select * from users where user_id ="  . $_GET['user_id'];
    

    考虑我是否通过了以下内容:

    http://some_server.com/some_page.php?user_id=123%20or%201=1
    

    该查询在执行时最终会是:

    select * from users where user_id = 123 or 1=1
    

    要解决这个问题,请使用参数化查询:

    $query = "select * from users where user_id = ?"
    

    将user_id值绑定到查询时,数据访问层将正确地转义输入字符串,并执行以下操作:

    select * from users where user_id = '123 or 1=1' which would not return any rows, preventing the injection
    

    如果使用PHP和MySQL扩展:

    $sql = "select * from users where user_id = '" . mysql_real_escape_string($_GET['user_id']) . "'";
    

    请记住,您需要转义进入SQL查询的所有输入:

    $sql = "select id_column from some_table where id = 1";
    $stmt = mysqli_query($conn, $sql);
    if($stmt === false) die(mysqli_error($conn) . "n");
    while($row = mysqli_fetch_assoc($conn, $stmt) {
        $sql = "update some_other_table set some_value = 'new value' where some_column = '" . mysqli_real_escape_string($conn, $row['id_column']) . "'";
        ....
    }
    

    这是因为您从数据库中选择的值可能包含在SQL语句中不可安全执行的字符,如名称“O'Hara”或示例。 }

    链接地址: http://www.djcxy.com/p/16747.html

    上一篇: Secure against SQL Injection

    下一篇: Make this query safe?