【问题标题】:Secure php and sql when selecting and inserting data选择和插入数据时保护 php 和 sql
【发布时间】:2017-04-22 15:35:02
【问题描述】:

我有一个应用程序,它从 MySQL 数据库中获取数据并将数据插入其中(用户正在写入要插入的数据),老实说,我对 php 很陌生,对安全和清理知之甚少字符串, 我想让 php 文件更安全,我不知道要查找什么才能执行此操作,如果有人可以发送教程,那就太好了。

这里是选择和插入代码

    <?php
header('Content-Type: text/html; charset=utf-8');

    $db = "*********";
    $username = "*********";
    $password = "*******";
    $host = "************";

$sql = "select * from sample;";


$conn = mysqli_connect($host,$username,$password,$db);

$conn->set_charset('utf8');




$result = mysqli_query($conn,$sql);

$response = array();

while($row = mysqli_fetch_array($result))
{
    array_push($response,array($row[0],$row[1],$row[2]));
}
$str = json_encode(array($response),JSON_UNESCAPED_UNICODE);
$str = clean($str);
echo $str;
mysqli_close($conn);


function clean($string) {
    $string = str_replace(' ', ' ', $string);
    $string = preg_replace('/[^a-zA-Z0-9,×-×–, : . -]/', '', $string);
    return preg_replace('/-+/', '-', $string);
}

?>

和插入:

<?php

    $db = "*********";
    $username = "*********";
    $password = "*******";
    $host = "************";
$conn = mysqli_connect($server_name,$mysql_username,$mysql_password,$db_name);


$name =$_POST["name"];
$publisher=$_POST["publisher"];
$date=$_POST["date"];


$sql_query = "insert into sample(name,publisher,date)
             values('$name','$publisher','$date');";

if(mysqli_query($conn,$sql_query))
{
echo "data inserted";
}
else
{
echo "error";
}
?>

【问题讨论】:

标签: php mysql sql security sanitize


【解决方案1】:

尽可能使用准备好的语句:

$sql_query = "insert into sample(name,publisher,date) values(?,?,?);";

$stmt = mysqli_prepare($conn,$sql_query);

mysqli_stmt_bind_param( $stmt , "sss" , $name,$publisher,$date);

mysqli_stmt_execute($stmt);

并尝试仅使用对象样式,而不是 mysqli 扩展的程序。

你在这里混合了两者:

$conn = mysqli_connect($host,$username,$password,$db);//procedural style

$conn->set_charset('utf8');//oject style

【讨论】:

    【解决方案2】:

    您可以使用 PDO。构建安全的 SELECT 和 INSERT 查询非常简单。不过,您必须小心一些命令,例如 ORDER BY。

    <?php
    
    $pdo = new PDO('mysql:host=localhost;dbname=databasename;charset=utf8', 'username', 'password');
    $statement = $pdo->prepare("SELECT * FROM users WHERE firstname = :firstname AND lastname = :lastname");
    $statement->execute(array(':firstname' => 'Max', ':lastname' =>  'Mustermann'));  
    
    if( $statement->rowCount() > 0 ) { 
       $row = $statement->fetch();
       echo "Hello " . $row['firstname'];
    }
    
    ?>
    

    Mysqli 也可以使用,但请查看 mysqli_real_escape_string。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-22
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 2014-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多