Maison >développement back-end >tutoriel php >Partager un moyen simple et efficace de se défendre contre l'injection SQL en PHP
La sécurité WEB a toujours été un sujet très sérieux. L'injection SQL est une méthode d'attaque courante. Souvent, notre code est conçu pour traiter des données non conformes et empêcher l'injection. Mais en tant que langage faiblement typé, PHP comporte toujours des risques que nous ne prenons pas en compte. Cet article partage une méthode simple mais efficace pour empêcher l’injection SQL !
Je me souviens d'une phrase que j'ai vue dire il y a longtemps par un grand expert Dans un programme, 60% du code devrait être destiné à diverses défenses.
En fait, en y regardant maintenant, empêcher l'injection SQL ne nécessite pas réellement de filtrage de divers paramètres. Le mode d'information sèche sera activé ci-dessous !
PHP5.x a commencé à introduire une nouvelle méthode d'opération mysql ----- mysqli Il existe également une méthode d'opération correspondante en PHP appelée prétraitement PHP. L'approche orientée objet est utilisée pour effectuer des opérations de liaison paramétrées. En raison des différents pilotes de mode pour les opérations de base de données, elle peut être très efficace pour empêcher l'injection SQL.
Tout d'abord, jetons un coup d'œil à un exemple de code
<!--?php $root = "root"; $pwd = "root"; $host = "localhost"; $database = "database"; $conn = new mysqli($host,$root,$pwd,$database);//面向对象的方式实例化一个对象 $keywords = $_GET['keywords']; $search_sql = "select content from mykey where title = ? ";//其中的?是一个占位符 $search_action = $conn --->prepare($search_sql);//进行预处理操作 $search_action ->bind_param("s",$keywords);//绑定参数,第一个参数表示为上面预处理的的占位符的数量和每一个参数的数据类型,s为字符串,i为整形,d为双精度小数,有几个参数,就写几个s或d或i,比如说iiii,ssss,sidi这样的。然后后面就是有几个参数就写几个要绑定的变量,比如bind_param('sss',$username,$password,$code); $search_action ->bind_result($content);//将结果绑定在相对应的变量上,比如你select了username,password,你就可以写bind_result($usernmae,$password); $search_action ->execute();//执行sql操作 while($search_action ->fetch()){ echo $content.'<br>'; } $search_action ->free_result();//释放内存 $search_action ->close();//结束这个实例化 ?>
Ce qui précède est un exemple très simple de prétraitement PHP. Ses autres fonctions intégrées peuvent faciliter notre vitesse de développement, puis Après. En voyant cela, beaucoup de gens ne comprendront peut-être toujours pas. Certains voudront peut-être demander : êtes-vous toujours en train d'assembler des instructions SQL avec ce paramètre de liaison ? Si l'instruction est reconstituée, cela ne provoquerait-il pas une injection ?
Cela doit être expliqué à partir de son principe de fonctionnement. En fait, lors de l'opération de préparation, l'instruction a déjà été exécutée dans la base de données, et ultérieurement. La définition des paramètres et l'exécution sont simplement une question de transmission de données, elles ne seront donc pas du tout associées aux instructions SQL et, par conséquent, le code dangereux ne sera pas exécuté. Par conséquent, l’injection SQL peut être défendue efficacement dans ce mode.
Il existe de nombreuses opérations utiles dans la classe de prétraitement PHP. Je résumerai pour vous certaines instructions de développement de prétraitement PHP couramment utilisées dans les prochains articles.
Recommandations associées :
injection php sql et analyse de cas classique anti-injection_Tutoriel PHP
Attaque par injection SQL php et notes de prévention
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!