prevenir la inyección SQL en php
Si la entrada del usuario no se procesa correctamente y se inserta en una consulta SQL, se produce una vulnerabilidad de inyección SQL. Para comprender este riesgo, considere el siguiente ejemplo:
$unsafe_variable = $_POST['user_input'];
mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
En este escenario, si el usuario ingresa maliciosamente un valor similar a valor ');
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
Mezcle técnicas:
Las prácticas de seguridad recomendadas para evitar la inyección de SQL son para separar los datos de SQL, independientemente de la base de datos que esté utilizando. Esto significa garantizar que los datos se traten como datos y nunca interpreten como un comando por el analizador SQL. La forma más eficiente de lograr esto es utilizar declaraciones de preprocesamiento y consultas parametrizadas.
Preprocessing declaraciones y consultas parametrizadas:]]
La declaración de preprocesamiento implica enviar consultas y parámetros SQL al servidor de la base de datos por separado, lo que permite que la base de datos procese su combinación. Esto evita que los intentos de inyección de SQL maliciosas aseguren que los datos no sean analizados por PHP antes de la transferencia.
opciones de implementación:
Hay dos métodos principales para implementar declaraciones de preprocesamiento:
PDO (objeto de datos php):
Este es un enfoque común que funciona con todos los controladores de base de datos compatibles. Aquí hay un ejemplo de su uso:
$ stmt = $ pdo-> preparar ('select * de empleados donde name =: name'); $ stmt-> ejecute (['name' => $ name]); foreach ($ stmt as $ row) { // Línea de procesamiento }
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute([ 'name' => $name ]);
foreach ($stmt as $row) {
// 处理行
}
mysqli (mysql extensión mejorada): Para bases de datos MySQL, puede usar mysqli. Comenzando en PHP 8.2, puede usar el método execute_query () para preparar, unir los parámetros y ejecutar las declaraciones SQL en un solo paso:
$ result = $ db-> execute_query ('select * de los empleados donde name =?', [$ name]);
while ($ row = $ result-> fetch_assoc ()) {
// Línea de procesamiento
}
$result = $db->execute_query('SELECT * FROM employees WHERE name = ?', [$name]);
while ($row = $result->fetch_assoc()) {
// 处理行
}
$ stmt = $ db-> preparar ('select * de los empleados donde nombre =?');
$ stmt-> bind_param ('s', $ name);
$ stmt-> ejecute ();
$ result = $ stmt-> get_result ();
while ($ row = $ result-> fetch_assoc ()) {
// Línea de procesamiento
}
$stmt = $db->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name); // 's' 表示'字符串'变量类型
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
// 处理行
}
pg_prepare () ] de Postgresql.
Configuración de conexión correcta:
Al establecer una conexión, es importante deshabilitar la simulación de declaraciones de preprocesamiento para mejorar el rendimiento y la seguridad.
PDO Connection:
$ dbconnection = new PDO ('mysql: dbname = dbtest; host = 127.0.0.1; charset = utf8mb4', 'user', 'contraseña'); $ dbconnection-> setAttribute (pdo :: att_emulate_prepares, falso); $ dbconnection-> setattribute (pdo :: attr_errmode, pdo :: errmode_exception);
$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8mb4', 'user', 'password');
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
mysqli_report (mysqli_report_error | mysqli_report_strict); $ dbconnection = new MySqli ('127.0.0.1', 'UserName', 'contraseña', 'prueba'); $ dbconnection-> set_charset ('utf8mb4');
en conclusión:mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // 错误报告
$dbConnection = new mysqli('127.0.0.1', 'username', 'password', 'test');
$dbConnection->set_charset('utf8mb4'); // 字符集
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3