 Bonsoir Montréal-Piton! Good evening Montreal-Python and welcome to Montreal-Python 96! You can hear Kayak, Kayak you can hear. Regardez-moi ça, c'est beau paysage-là de l'ac majesture du Yukon, sur lequel on a vraiment envie d'aller se déplacer en Kayak. Je vous invite à vous joindre à nous, soit vous pouvez rester sur YouTube et poser vos interpellations. Dans le chat de YouTube, mais si vous voulez vous joindre à nous sur Slack, vous pouvez suivre le lien qui est ici. Il est aussi dans la description du vidéo YouTube et puis on est dans le canal Meeting. Et comme toujours, on a un code de conduct à Montréal-Python qui dit en gros, soyez excellent les uns envers les autres. Si vous voyez quelque chose qui vous semble pas excellent, trouvez-moi, je suis Yannick ou Duc qui s'appelle Duc dans Slack et puis disait-nous-le, puis on va régler ça pour que ça reste excellent avec tout le monde. Donc, tout le monde, vous joignez nous si vous voulez. Sur Slack, vous pouvez aussi chat avec nous dans les commentaires YouTube, c'est parfaitement bien. Mais si vous joignez nous sur Slack, le lien est ici, c'est aussi dans la description du YouTube. Et nous sommes dans le chaîne Meeting. Nous avons un code de conduct à Montréal-Python, qui dit en gros, s'il vous plaît, soyez excellent entre l'un et l'autre. Si vous voyez quelque chose qui vous semble pas excellent, trouvez-moi, je suis Yannick ou Duc, qui est Duc. Sur Slack, dites-nous et nous allons résoudre la situation la meilleure que nous pouvons. Et ce que vous voyez ici, c'est un code de conduct à Montréal-Python Youkhan, fait par les pays 1ères Nations, et ils ont fait leur kayak au lieu de la hall de la salle rède, plutôt que d'assembler ça, avec le park bourge, comme vous le savez plus, comme nous le faisons ici au Québec. Ok, pour notre agenda pour aujourd'hui, on va être moi ramblant pendant un couple de plus de minutes Et puis, Israel is going to tell us about how to use typing to achieve better software security. Follow that, we're going to have Edith, who's going to tell us about managing our SS feeds with feedgen, and then, we're going to have our virtual happy hour on Jyotsy, where we're just going to bring everyone in the same video conferencing room, grab our favorite beverage, and chat about whatever we want. Alors notre programme pour ce soir, ça ne sera pas d'aller se promener sur un lac majestueux dans un kayak ou un canot de cèdre rouge, mais ça va être plutôt d'écouter Israël Hallé qui va nous parler du typage pour avoir plus de sécurité en logiciel. Ensuite, Edith va nous parler de gestion de flux RSS avec Fidgen, et puis après ça, on va avoir entre 5 à 7 virtuels en vidéo conférence. Autre chose à mentionner. Ah, j'avais une deuxième image ici que je voulais vous montrer. Je vais essayer de la récupérer là, des canots you-connais absolument fantastiques. Donc, lundi prochain, à 19 heures, on va avoir une soirée de programmation. Donc si vous n'avez jamais vu nos soirées de programmation, on se ramasse tout le monde ensemble. On ouvre un document partagé, et puis on programme. On va programmer lundi prochain sur le web scraping, l'agrégation web, comment fabriquer notre propre engin de recherche pour les pages web. Et puis on va faire une révision des concepts de base. Il y a Python 3.11 qui vient de sortir. Donc la version finale de Python 3.11 devrait sortir d'une semaine à l'autre. Si quelqu'un veut jeter un coup d'œil là-dessus et nous faire une présentation sur les nouveautés de Python 3.11, je pense que ça serait fantastique. Faites-nous signe sur Slack ou notre courriel dans la description de ce vidéo là sur YouTube. Il y a le Python Packaging Survey, le lien est dans la description de ce vidéo sur YouTube, qui nous demande comment on utilise les outils de packaging pour Python. Très intéressant, très intéressant, sondage. Donc je vous invite à jeter un coup d'œil, partager vos opinions, vous pouvez influencer comment on va avoir nos outils de packaging pour Python. Et puis on a le cantrier des événements 2022 de Montréal-Python. Let me repeat this in English. So upcoming events, we have our programming night next Monday at 7 p.m. And our programming nights are basically a bunch of Pythonistas getting together in the same video conference call, in a shared document and typing the night away. So the topics of typing next Monday is going to be web scraping and we're going to review the Python basic concepts, probably in two different groups because it's kind of hard to get introduced to the Python basic concepts with something as hands on as web scraping. Python 3.11 RST2 has just been released and that means that we're going to have the final version of Python 3.11 very soon. So if you would like to take a look at what's new in Python 3.11 and tell us about that next month, that would be great. So we're really looking for someone to give us an overview of what's awesome in Python 3.11. You can find us in Slack or our email is in the description of this video on YouTube. So find us and tell us if you would like to present. There is the Python packaging survey that is out until the end of the month and it's basically the Python core developers would like to know better how you use the Python packaging tool, what direction should those tools go. So please take a look at this survey. It takes less than 10 minutes to fill. The link is in the description of this video. And then there is our calendar of events until the end of the year. And with that, that's all I had to say. I'm going to say thank you to FJNR who is hosting our happy hour. And also thank you to all these organizations who put together beautiful pictures of Yukonir Kayaks. And with that, I think it's time to talk more technical. So I'm going to bring in Israel. Israel, how are you doing? Doing good, thank you. Excellent. So Israel, if you would like to share your screen and don't see it here, you can go ahead. I'm sorry, I would need to reboot Chrome because macOS. I know these things happen. Don't worry, I can totally... I will be right back. Yes, I will entertain our crew here probably by looking for that picture of Kayak that I thought was absolutely fantastic. Let me take a look if I can get to it real quick. And if not, that's okay. I'm going to talk about something interesting. I'm not sure what, but I will find it. Oh, Israel is already back. His computer is quite fast to reboot. Welcome back. Okay. Oh, you... Is it working? Yeah. I see it. Yes. Perfect. Oh, I'm just not at the right... There we go. Excellent. So as I mentioned earlier, Israel is going to tell us how to use type hints to achieve better software security. Israel, the stage is yours. Thank you. So thank you for having me tonight. It's been quite a while that I did a talk in front of people. So I'm a bit nervous, but hopefully it's going to be smooth and it's going well. So my subject tonight I want to talk with you is typing a win to safety in Python with my files. It's kind of a cross between typing, cyber security and coding. This concept applied to Python right now, but you can probably apply them to other type language. So first of all, a bit about me. So I'm Israel Alley. You can always reach me through my work email at israel.all at Flirida System. You can also find me on GitHub to my Common Ender, which is Israel 17. I have a bunch of open source projects, mostly about security and reverse engineering. So I am a co-founder and chief architect at First Systems, a company that I started five years ago already. So for those that are not aware of it, it's a server security product built in Montreal. So we are still hiring. We just come out from a funding round. So we are looking for a great talent engineer. We are mostly working in Python. We do have a bit of a software engineer we're looking for. So JavaScript type script. But at the end of the day, we are looking for people that want to do data engineering, the cyber security and just like that sort of thing. I am also, so my background is, I have a strong background in security. So I used to be a reverse engineer. I do some availability research as well. So just like finding bugs and application and explaining them. So my really, I specialize into binaries. So just out of memory. I actually found a few bugs and embedded rubies. So like from Ruby to actually like on x86. It's actually quite fun because it involves like having a deep understanding of all these language work and all the customer machine behind them work as well. So I have a, I love to understand all things work so I can break them better after work. I'm like, I did Python for quite a long time and I love like all the Python advanced feature. Lately I've been working a lot with typing, which is one of my subject tonight. But maybe in the future, I might want to share a lot of work I did with async.io and things like that. And finally, I will define myself as a climber. I climb a lot. So if you want to talk about climbing, I'm always a guy. So let's go back to my talk. I'm not there to talk about me tonight. So like from the title, like let's just, like Python isn't safe. That's what I'm saying, right? And that's saying it's not safe per se. I'm just saying, like, not because Python is dynamic language without memory and all that kind of thing. It doesn't make it like safe or everything. So if you look at the OS, like all the items applied to Python, just as much as applied to C and C++ application. So we're talking about configuration management, authentication, authorization. So, yeah, Python helps you with a few things, but it's just so many ways to shoot yourself in the feet if you're not careful. So we can argue that, like, Python is safer than some alternatives. So, like, you at least do not have to deal with the memory corruption and the many ways to, like, white code that looks good, but it's totally broken. So, like, that's a quick example of how to run CAC on Windows. You just, like, read any content from user into a limited size buffer. And with the creative attacker, you just end up correcting the call stack and then the CPU end up executing arbitrary code. And you can make this arbitrary code to just, like, run some execution of process that end up pretty much running CAC on Windows. Just like a quick note, like, CAC, for those a bit less in cybersecurity, like, CAC, on Windows, kind of the way to say, like, Ipong machine, I may be able to run an application. So, at least Python makes us why this kind of code much harder. But Python doesn't prevent you to encrypt that with a wiki, like any encryption library that any, but, like, most of them will take any key, give it, like, you can use md5 to hash password. Python won't prevent you to do that. It won't prevent you to just execute any SQL query that comes from user. It won't prevent you from inserting a data provided by user into HTML. And then we end up with XSS so the attacker can still use a session and then to do action under their own profile. Like, it doesn't prevent you from let user run an admin task if you don't check if the user isn't admin. So, Python is safer, but it's still not safe for everything. You have to think. But can Python be more helpful? Like, so how can it help us to be safer? So, first of all, there's always a good interface. So, my example with that is, like, the difference between using something like PostgreSQL library, Psycog, or using SQL Kimmy. So, when you use Psycog, it's easy to just, like, build SQL with strings and then you pass it to SQL Execute and you end up dumping the whole database because you didn't check for user query input. While SQL Kimmy, the way you build query, usually, it's much harder to just use, like, a user-provided input and put it in query build for SQL Kimmy. It's going to give you a lot of abstraction that makes it harder to do this kind of thing. There's also the linting tool. So, a thing like SAMCREP, which is very common. This tool, we kind of look for pattern in your code. Maybe, like, these allow some functions, like, you just not allow to call systems and more, or to use the cursor that executes SQL. Like, it will ask you to use good interface instead. And finally, there's the formal verification. So, like, I have a way to prove that this code is safe by checking at what are the possible values that can be passed to this function. And how can I prevent any case of passing bad value to the function. So, actually, in my case, I will see that typing is kind of, it's formal verification. Like, when you use mypy, mypy will be able to verify that when you call this function, the type that you're using makes sense for the function. And the contract always being valued pretty much. So, like, I'm going to build my presentation around a very simple use case, not necessarily the most common. Like, nowadays, I feel people are not using your system and more. There are much better interface, like sub process. So, like sub process, that call will take an array of parameters. So, it's a bit harder for an attacker to escape these limitations. There are still a way depending on how we do it, but anyway. So, but in that case, I'm just going to use system because it's very, it goes straight to the point. So, for those that are not familiar with system, system is a simple function. It takes a string as a parameter. And this string is executed as a shell command. So, you can, like, I don't know if you want to list the file in the home directory. You can just, like, use LSTL as a system parameter. And it's going to print in the LSTL out the list of file in your home folder. And the return value is the return code of the program. So, zero mean success. Anything else is a failure. So, in that case, like, system takes a string of bytes because of the US, but that's the important thing for us. So, one reason we want to use system in actually application is, and this one is very common. If you look at the CVE over time, like, there's so many around that. So, I have an API, like, user can upload images. And I want to be able to resize these images to some fixed size. So, I want, like, an icon of 64 by 64. So, a common use case, I'm going to use, like, image magic, which is a tool, a command line tool that allows to do many operations on image. And it's quite common from a language like Python, or Ruby, or things like that, to use, to call the shell command with image magic with the input, and then some user-provided parameters, and then have my operation done in some image. So, in this use case, I will have this API that just, like, resize some image from a user-provided size. The issue is that we use the size as is, and we just use it in the command. And that's completely insecure because if one of my users is, like, insert a semicolon in the size, and then use any command, the semicolon is going to end the command. So, I have... Yeah, so, the semicolon is going to end the command after resize and then start a new command, which would be, like, calc, and then the DI's at the end would just, like, comment everything else. So, like, this size will end up running calc, which is never wrong. It can actually be used in a safe way. So, if I use, like, the S-H-L-E-X, the quote, it's going to put quote around my string that I provide, and it's going to, like, escape any quote in the user part of the value as well. So, like, I'm sure that any return value of that can be safe, can be used safely in a command without any side effect. So, in that case, now, if I will run this code, it's just no way for a user to run calc, pretty much. So, that's all it looks like. So, if a user runs the same command it used before, and now it's going to call resize, but it's going to add double quote around the user provided value. So, of course, it won't be able to resize. Like, it's still not a valid size, but at least we just have an error instead of letting the user run a betrayed code on the machine, which is quite an improvement, if you're asking me. So, I'm just going to take a very short break to go, like, to a very simplified theory about type systems. So, I want to talk about, like, kind of two types of typing. So, this trick short typing, which, like, is kind of all around the same, like, if it looks like a duck, swims like a duck and quacks like a duck, then it's probably a duck, right? So, it's commonly, like, called duckling, and that's kind of the theory behind Python typing. So, Python, like, you can, if I have a function that takes some dictionary that expects a key to be named ID, just know, I don't need to have, like, a specific type for this dictionary. You can just pass any provided dictionary and user provided dictionary and it's going to work. Or, the same can be said, actually, for class. Like, if I have an ID attribute in a class, it's going to be able, like, any function that just expects a class with an ID is going to work. So, that's very common in dynamic language, right? So, Python, Ruby, JavaScript, they're all the... An event, MyPy, is built around stretch-all typing. So, it's providing, like, the protocol, which is literally made for duck typing. So, you just, like, say, all my objects have to be shaped. And as long as you provide a type that respect the shape, it's okay. And it's a bit unlike the interface. Like, an interface, usually, you have to type as to implement explicitly the interface to work. So, stretch-all typing, just, like, if it looks like the interface, it's going to be the interface. It's kind of in a position to nominal typing. So, nominal typing is more like, if it's certified to be a duck, then it's definitely a duck. However, like, certification is more work. You have to be explicit about them. So, that's why it's a bit less used in language like Python. Like, we want to just, like, write script quickly and run them quickly. So, it's a bit less common. But it's much more common in static typing in language like Rust, C++, Java. So, like, in Rust, if you have, like, a function that takes a user type, even if you have some other type that looks like a user, you won't be able to use it in a user type function. You have to actually use interface and implement this interface and things like that. So, my point is now that security is not always structural. So, as we see before, system takes in string, but the string doesn't tell you about if it's safe to run. There's no attribute about safety in it. So, the same string that can be used to log something can be used to run arbitrary command, which is a bit annoying. So, one way to do that is to just use nominal typing to be able to add semantic type. So, we can select this type. It's safe to execute. And the simplest way to do that, actually, with my Py right now, is to pass a system with literal. So, the literal type is just a generic type that you give the value of the type. So, the literal LS, the only value valid for this literal LS is LS. So, in that case, the function would just hold the signature error. It's very safe. A system can execute LS and ID and there's no way a user will be able to pass any other value. However, it's a bit limited. If I want to run my convert command that I showed earlier, now it doesn't work. Or if I want to pass any user code input, it doesn't work. So, I will need to know in advance all the command I want to run before being able to check them. So, what I might want to try to at least run any literal would be to just not pass a value to the literal, but my Py doesn't support that as of now. And just a quick note about that is they are in the code. So, a code reviewer has been able to see the code and say this command is safe because as a reviewer, I won't let someone commit code like rm slash and just wipe the old disk of the machine. So, we can assume that any literal is safe. However, so that's actually a release note of Python 3.11. Python 3.11 comes with a new type which is literal string that is built around security pretty much like the use case I want to support is the SQL execute function that want to be able to just dysfunction the type it takes is only literal string. So, we cannot put any variable as part of it like it has to be string that is known when my Py run. So, now by using that it's much more flexible. So, now system could run like convert input output maybe with some static size we could not run the resize function with the user provided size. So, let's try to keep going and find a way to do that. So, that's an example. Even if I quote my size so I have a safe size my Py won't let me validate this code because it's still not a literal, it's coming from a variable. So, the way we can do it is by using the nominal typing I'm just going to drink a bit. So, by using the nominal typing it just creates a whole new type and say like this type is safe. So, my Py as a small yet per call new type and the nice thing with it is that you give like the name of the new type first and then you give the type it just extends. So, this way, I don't want to have to implement a whole new class with like attribute and then I need to implement system or whatever. There's a bit different just by the name. And actually like this code it's pretty much the same as creating a new class that in a read from string. The only difference is that on runtime there's no there's no overhead on runtime if you use a new type. So, on runtime the variable of shell call string is going to actually be a string but on my Py run it's going to have like two different types. So, the nice thing with that is that we when we create this new type the new type is the old. So, like a shell call string is a string but not the other way around. So, a string is not a shell call string. It's kind of the same with like the classic animal and dog. So, like dog in a read from animal. So, if I have a function that takes a dog I can pass like a dog but I cannot pass an animal. But if I have a function that takes an animal then I can pass a dog or a cat but I cannot do the other way around. So, in our case now we have this new type but we have no way like if your string it won't work. So, what we can do is create this function that kind of convert the unsafe type to the safe type. So, in our case the unsafe. We can consider all string to be unsafe. Like if it's a string we don't know if it's been provided by user we don't know where it's coming from, it's dirty. So, we want to clean it. So, that's where we can create our own call function that takes a string and then the call function knows what to do to convert a string to a good string. So, that disimplementation could just reuse the hlx.crollt so this function that called the string pretty much. So, the nice thing is that now if I write a code that want to execute a command I don't need to review like to track back all the code I just need to review two function pretty much I need to review my system function like is it taking safe string in and then I just need to review the call function like when I convert a bad string to a good string, am I doing it the right way so that reduce so much the context that if you need to know like is this code gonna, is this code safe or not safe. So, now if I want to get a safe size I just need to run the call function on my input size and the type of safe size is gonna be a safe type. So, like my pie is gonna be able to formally check that this safe type is being used where it should be using, where it should be used. And the nice thing is that as I said earlier, like a dog is an animal but an animal is not necessarily a dog. So, we can use our safe string everywhere an unsafe string is expected. So, like if I want to log something I can pass my safe string like it's fine, my safe string can be using unsafe context. But the other way is not true so I cannot create a safe string from just any unsafe variable. So, it's quite a just I guess, going back to my backside. Like the nice thing about that is that it's very easy to create this new type and like don't have to rewrite all the code everywhere. Like my login code I don't need to like I want to get the value of my safe string. I can pass my safe string as is and don't need to do anything else. So, going back to my system function so now we have like these two kind of type categories. We have the literal string and if our user probably the value we have the shell quoted string. So, I can create an union of both like a shell string. So, my shell string is what I will accept as an input for system. So, it's pretty neat now like if I want to call system and run mypy and mypy to accept this code. I can either use literal so like my whole thing I convert and put output as a string or I can pass quoted string. So, like this string that has been where the type is pretty safe. And if I try to use my system function just like any arbitrary string then I get an error from mypy. It will tell me like you try to use a string where you expect a shell string. Please fix it. All right, we still have the issue right now that if I try to call my system function to the format string, even if I use like a quoted string inside of it it's not going to work. So, all the operation and like when I create this new type all the function in this new type so like the dot format or the concatenate string so even if I have my safe string I call appended to another safe string it's going to return a string not a safe string. So, it kind of makes sense because my safe nest properties like they don't necessarily hold when I do operation on this string so like if I add to a quoted string together, like the quote might like cancel each other in some very specific case. So, that's why it's actually a good thing. So, we have to like be explicit about what operation on this string are going to return like safe string again. So, in our case, we will like just define a new function in this shell format. So, this shell format, we know that like if my format string is a literal so it has been reviewed, it's like it's been we know what it's going to end up with and then all the parameters of my format string are like safe string then I know that if I just like run format on that it's obviously like if my format string will take any string of just literal string then it will not be safe because like I could pass a user provided from a shell format, format string, sorry, and the shell format string could just like item slash and I might probably still be happy with that. So, now we are able to use like this type together to like build some very nice pattern. So, now I can use this function in this way so instead of using the f or the string.format function I can just like use my function that I made but I still use the same parameter format so that code will be accessed by mypy and if I and if I didn't use code and mypy would give me an error so it would tell me you're not allowed, like we expect a quote a save value a shell string. So, now that's there's still like some edge case so like the quick example I show you actually has a way to shoot yourself in the feet. So, if you add the quote in the format string mypy, like it's the literal string, it's good however the quote function is going to like cancel the quote in the format string so that's something that like comes back to good interface right so if we add a good interface it should not be possible to do this kind of thing. Otherwise, like even at runtime because all I have to do is make sure that shell format is safe so I could actually write shell format in a way that I check for quote around the insertion of the format and this way, like even if I did this use case I could just like not I could remove the quote, I could not quote the substring, things like that and the nice thing is that that's the only code I need to review to be sure it's safe, I need to make sure that shell format is safe once it's been like probably safe all the code I use it will be safe by default so that's a small edge case but again that's something that the code reviewer could try to like catch up and just need to check this thing so that's kind of a I think we can use typing to be safer and like this pattern as I again like they can be applied all over the place like the SQL queries or the Psycog that execute like you can so Psycog that execute allow you to use like the percent s and then pass the parameter as parameter of the function but it doesn't prevent you from just like appending string and building like the string and then using as the first parameter so that by using typing or more strict typing you can disallow to just use like any user provide input as the first parameter same for like HTML so like flash the flash view allow you to by default escape HTML when let's say a user avatar URL you want to put it in a flash under view it's gonna like escape it as HTML first but you can use like the pipes say for some I don't know it's been a long time say the flash but I know there's like a filter to mark a value as like don't escape that as HTML then you can introduce excesses because of that so with proper typing actually it would be a bit harder cause it's not like Python code or that. In any case there should be a way to say this string is safe to be using HTML and this one is not. I know we be on rails as some concept of like safe string and unsafe string that prevent you from using or just auto escape actually so if you try to put a safe string in HTML it's gonna auto escape or something like that. And just some like more deep case I will say is like pickle and PyML so I will argue there should be no user generator use of pickle and PyML like pickle is very easy to just like run arbitrary Python code if you are able to control some of the payload PyML is the same like it has ways to load any class as Python and like PyML is actually a use case a very bad safe interface so like the function everyone will look first like yml.load but actually this function is very unsafe if you use it with the user provided value just like the alternative is yml.safeload but like why it's not the default it's very making me doubt about the security minded people that made this choice but like I feel we can still use typing for these use case right so if like a scenario that is kind of common is to pass data for the user so the user can give it back to you later. A common way to do it is like using things like the gson sign token or GWT so in like gbrt is exactly that so we might like serialize a user session into some gson blood and then add a cryptographic signature from a secret key with it so when I give it to the user the user give it back to me so it's kind of user provided value but I'm going to check the signature first to ensure that it's valid and then once I validate the signature I know it's a safe string so there might be a way to have this YAML load function or just a pickle function that can pickle any string as long as it's been validated with the signature so like the signature validation string could return a new type that is a signed string so the signed string can be used everywhere because you know it's been signed by you not by the user so that's pretty much the end of my quick presentation so I hope you learn a few things again like if you want to talk feel free to reach out to me we are hiring a first system like if you like modern python you look for a big challenge of distributed computing that are analyzing at that we have exciting problem to work on Thank you Israel I'm going to bring in Duk who is going to be moderating our questions RQ&A for this session Thank you Yannick Thank you Israel So we invite everybody to ask your question via YouTube or if you want you can use Slack channel in meeting you can ask your question there but I want everyone to ask your question your question si vous en avez et Israel part français aussi pour poser votre question en français aussi si vous voulez so I have a first question not really a question but because I know nothing about security and all kind of thing do you have the like tutorial how did you if I don't know anything about security in python where should I start can you yeah I guess a good start for security in python in general it's just like I would say look at the OS 10 like these all the OS 10 is very valuable just because these are so common they are still common and as I say like the top 10 of the OS apply to python as much as that apply to see all the language and like it gave very good example and like other than that just like I guess the best way to get into cybersecurity is like get active in the Montreal community there's a lot of event and conference like there's a north side conference that is very very good especially for beginner as much as expert as well ah ok thank you I think we have a first question ok non juste ici ok ok je pense je pense qu'on a une question ici une question sous-stack j'ai vu qu'il y a une question sous-stack mais j'ai vu ah ok c'est moi qui a manfait mon travail je suis surdu de savoir si il y a des implications au niveau de la sécurité sur le papier ok ça c'est qu'une papier ça je sais pas comment je peux t'envoyer ça je t'envoie le papier ici tu peux peut-être ticker dessus et regarder vite fait j'ai j'ai vu le papier en fait passé j'ai pas lu mais en fait comme j'ai j'imagine comment que ça a été fait là pis je pense c'est pas un peu en sécurité parce que comme le python piping il est incompli mais ça implique d'évaluer du python qui a été typé donc le scénario que comme un satur externe veut exécuter du code sur ton serveur, sur ta machine si il n'est pas en mesure de donner, de fournir des types à ton serveur lui-même il n'y a pas vraiment d'attaque normalement possible en général on fait comme si t'es rendu c'est un de tes traits modèles et d'évaluer des types que tu ne trust pas comme avant ça il y a juste le code python en général qui est pas trustable il n'y a pas un moyen d'exécuter du python de manière sécuritaire si tu ne trust pas la personne qui écrit code je dirais que le typing c'est un peu pareil, comme si tu ne trust pas la personne qui écrit les types, tu devrais juste même pas essayer de rouler quoi que ce soit par rapport à ça ok, merci j'ai aussi une autre question qui vient de rentrer je l'ai affiché ici c'est en anglais c'est très curieux c'est une bonne question je dirais donc on commence à typer notre code base environ 3 ans j'ai commencé le projet j'avais beaucoup de codes ce n'était pas typé et à un point on pouvait faire le type c'est un très bon blog il y a beaucoup de référents comme tous les types avec des millions de codes d'utilisation de types c'est une bonne chose avec ma pie c'est qu'ils ont des outils de utilisation ils savent que pas tous les projets ont commencé de scratch après ma pie c'était créé c'est assez facile d'adverir le type juste vérifier le type si tu n'as pas un type, je ne vais pas vérifier et puis d'enforcer je pense que c'était c'était pas facile parce que je suis un co-founder technique donc j'ai beaucoup de choses à dire mais même je me sens que c'est facile quand tu vois tout le bénéfice que nous avons fait et que tout le monde que j'utilise ma pie peut s'assurer que le Python est bien d'avoir un petit projet et d'y aller avec le temps c'est un point très difficile d'effectuer même si tu as de bones tests tu n'as toujours pas de valeur parce que je n'ai pas de valeur que je pouvais mettre une option donc ma pie t'aimera beaucoup quand tu commences juste pour faire un nouvel code base que tu n'aimes pas tu vois ces arguments et tu n'as pas d'idée de ce type c'est quand tu as une information d'informations c'est que le modèle de user n'est pas un dictionnaire ou un un saison ou pas un saison et tous mes projets j'ai commencé à les mettre sur les modules parce que ces bénéfices sont en train de faire un nouvel code pour le premier temps ok ok ok la personne te remercie je pense qu'on a le temps pour une autre question en français ici comment déconne ça va toujours dépendre en fait je peux le lire la question c'est comment découvrir des vulnérabilités et de sécurité dans une application puis donc exister les outils je pense justement c'est le principe qu'il y a plein d'outils qui regardent des choses différentes il y a Benzith qui va regarder des patterns tu vois Sengrep qui a des grosses libérées extensives qui ont développé le temps qui vont trouver ces patterns d'utiliser une variable utilisateur à telle fonction mais après c'est ce qui marche bien tous ces outils-là ensemble t'as les outils d'analyse dynamique aussi dans le fond que les scanners avec un API juste de scanner cet API avec des payloads préfets ça peut tout le temps trouver des petits trucs il y a une grosse partie en général dans nos pentes c'est des trucs que les outils ne pourraient pas trouver souvent les bols de sécurité sont plus graves ce sont des problèmes de design plus que de gestion de code c'est un peu plus dur à trouver mais c'est juste des fois de prendre le temps de lire le code et de regarder les choses encore une fois comme le OS 10 tu regardes check-temp et tu essayes de comment ou est-ce que ça pourrait toucher mon code et comment je peux faire la trache un peu en arrière la réponse il y a beaucoup de choses ok est-ce que ok, encore une autre premièrement les questions viennent de Claude Coulomb et il a aussi demandé est-ce que tu sais pas si tu connais cet outil-là, avec une ethics non, je sais pas oui, puis aussi on va prendre une dernière question c'est que peut-on imaginer une pipeline qui recoupe plus de ces outils oui mais en fait je pense qu'il commence à avoir des entreprises qui vendent des produits surtout avec comme de plus en plus de Montice Docker des trucs c'est-à-dire un container c'est-à-dire un Docker, puis l'outil va partir le container, puis il va tout rouler ces outils dans le container ça simplifie puis je pense avec le concept de CI-CD c'est-à-dire que dans le temps CI-CD c'est pas juste rouler des tests maintenant c'est aussi rouler les outils de scanning de fin et de sécurité d'avoir ton sain-cred qui roule d'avoir ton bandit qui roule puis comme c'est tout que tu trouves des choses c'est juste d'avoir un check-in de quelqu'un de sécurité qui peut valider c'est vraiment un faux positif donc on va l'acheter dans les exceptions c'est bon je pense qu'on n'a plus de temps pour des questions si je comprends bien Yannick on est comme pas mal de toute façon on n'a plus de questions mais je vais juste faire un petit tour oui c'est ça on n'a plus de questions pour ceux qui veulent toujours continuer après notre 5 à 7 tantôt ouais ouais j'ai resté dans l'environnement ok cool c'est bon vous pouvez poser une question Yannick en va aller en 5 à 7 super bien merci beaucoup merci beaucoup et on va passer à notre prochaine présentation donc je vais inviter Edith qui va nous parler de Flu RSS avec Fijen merci Yannick donc on va relaxer un peu on va prendre avec du Flu RSS à tombe après cette présentation pointue sur la sécurité et le type page en pitton donc je vais parler du Flu RSS ou à tombe avec Fijen qui est une bibliothèque qui est écrite en pitton pour générer des pages html peut-être juste des pages html mais bon on va se contrôler de ces pages html pour les bienfaits de cette présentation pointe et puis donc on est lundi le 17 je m'appelle Edith Villaud et annoncez et la présentation on peut vous prononcer c'est bon donc les Flu RSS à quoi ça sert c'est utile pour se tenir au courant de la mise à jour de cette web en ordre chronologique donc d'une certaine façon c'est pour échapper aux algorithmes de recommandation des réseaux sociaux qui nous donnent une nouvelle par ordre de façon optimisée et différente donc ça peut être utile pour des blogs des sites de nouvelles et des sites internet de façon générale c'est une gimme gimme vieille technologie c'est pas si on voit sur le repo de github de Fidgen on voit que la dernière mise à jour date 17-3 ans mais la librairie fonctionne encore moi j'ai pas rencontré le problème en tout cas si vous en avez rencontré je suis curieuse en entendant parler du fait que les spécifications d'RSS à tombe sont stables je vais faire une petite démo de générations d'un fil pour un site web de démonstration avec quel algorithme Fidgen donc on va commencer par montrer le site web que j'ai créé pour les bienfaits de la présentation on va faire la création du fil avec Fidgen dans son scriptiton on va ajouter des entrées sur le fil et on va publier tout ça sur github en fait ça a déjà été publié sur github je vais sauter cet état mais on pourra regarder le résultat donc allons-y sans plus tarder désolé je vais prétendre ça et je vais aller chercher donc commençons par le début donc j'ai un file html index.html qui recense mes billets de blog qui sont nommés avec beaucoup de renaltés billets1 qui est mon premier billet billets2 qui est mon deuxième billet et billets3 qui est mon troisième billet on peut on peut prendre ça ressemble à ça j'ai pas mis de CSS rien j'utilise Firefox et puis ça finit là donc ça c'est mes 3 billets maintenant ce qu'on va faire ce c'est pour la partie site web de base ce que je vais vouloir faire c'est que je vais vouloir déambuler dans le dossier site internet puis ajouter une entrée sur mon file rss ou atom par billets de blog que j'ai créé en html je vais faire ça avec génération fil.py qui est ici on va regarder brièvement le code ensemble c'est j'ai écrit pour que ça ça se laisse bien il y a probablement des meilleures façons de rédiger le même code pour le rendre réutilisable etc mais pour les bienfaits de la présentation c'est suffisant donc on va commencer par importer l'abrierie de celles d'exploitation qui quand même est interfacée avec le système d'exploitation on va aller chercher Daytime pour tout ce qui est date et temps et heure Daytutile.z pour les time zones et fous au horaire on va utiliser BeautifulSoup pour aller chercher des informations en codé dans les fichiers html on va utiliser Fidgen pour générer le file comme tel par la suite on va créer une variable qui va être le chemin vers le site web ou pas tout web site en anglais et qui va s'appeler site internet puisque c'est le nom de mon dossier ici, c'est internet et on va créer une instance de feed generator qu'on va appeler sans originalité FG pour feed generator on va lui dire d'utiliser l'extension de base qui selon la documentation ne fait rien sauf rendre accessible de l'ensemble des méthodes nécessaires sauf fournir c'est le nom que je cherchais et puis ensuite on donne les informations méthodes sur le file donc un ID un titre, un sous-titre des informations sur l'autrice dans ce cas-ci le lien vers vers le file comme tel, la page d'accueil disons et la langue du file vous savez qu'une des différences entre RSS et ATOM il y a des petites différences c'est que pour les files RSS on peut sélectionner, on choisit la langue on paramétrisera la langue pour l'ensemble du file alors que pour les files ATOM on peut aller sélectionner une langue différente pour chacun des entrées maintenant on va déambuler dans le répertoire dans l'adresse c'est dans la variable pas tout web site une entrée par page HTML trouvé donc avec oswalk on va déambuler dans pas tout web site et puis pour chaque fichier ou sous dossier vont être emmagasinés dans subfolders et files comme on n'a pas de subfolders on peut lire les fichiers directement donc pour f pour files dans file j'aurais pu l'appeler file c'est un mot réservé c'est pour ça qu'on ne peut pas faire ça donc j'ai réside les joueurs du direct on veut juste les billets pour la page avec HTML donc si le nom du fichier n'est pas index.html je préfère un dictionary je pourrais aller faire différents trucs ici pour filtrer les pages indésirables ou indésirées je vais générer pas que toi HTML qui va venir compléter pas tout web site avec le nom du fichier concerné je vais venir parser comme on dit le fichier HTML créé avec beautiful soup juste pour extraire le titre et puis ensuite je vais générer une nouvelle entrée que je vais appeler FE pour feed entry avec le ID qui est l'adresse du site web plus pas toi HTML le titre que j'ai été généré que j'ai été chercher avec beautiful soup le lien qui est la même que l'indulance mais ça pourrait être autre chose et la dernière date de mise à jour que j'ai été chercher sur la date de mise à jour du fichier concerné avec come time zone America New York et ensuite je génère mon fichier à tombe, je génère mon fichier à recess et c'est ce qui conclut la partie présentation du code donc on va confirmer que j'ai bel et bien généré mes files on va commencer par effacer les anciens files et puis là on va prendre un petit risque de faire du live fil à tombe tiens et ça génère mon fil en format mon fil à tombe en format XML je peux aller chercher le fil à recess en format XML on voit que c'est pas exactement pareil il y a des petites différences et puis c'est ce qui conclut la démo le reste est publié sur l'ensemble de la présentation de l'adresse dans le Slack plus tard donc continuons donc publication maintenant comme on a un fil on peut utiliser un lecteur de file à recess pour suivre les files à recess par sur, par catégorie, manuellement et pour recevoir les mises à jour automatiques dans le code sur Ubuntu il y a plus à faire la recess sur plusieurs types de systèmes d'exploitation j'ai juste à cliquer sur ajouter de nouveau flux vers une URL et puis et puis je vais entrer l'url donc l'adresse du fichier XML ici pour l'ajouter on peut le faire est ce que j'ai je veux le c'est l'url c'est la version publiée donc je vais faire ajouter et puis là on voit les 3 entrées qui ont été publiées avec la dernière date de mise à jour du fichier HTML comme j'ai pas mis à jour les fichiers j'ai pas poussé sur GitHub non plus on voit que c'est la date de création de la présentation comme telle donc ça conclut ça je veux la présentation qui est cachée donc on va pouvoir ressort les mises à jour automatiquement déterminer qu'est-ce qui est élu qu'est-ce qui n'est pas élu et tout ça en ordre chronologique maintenant peut-être que certaines certains entre vous savaient que j'ai une pratique artistique en ordre numérique donc peut-être que vous avez vu cette table positive là arriver un peu plus tôt donc protocole de communication le point de vue des arts une des raisons pour lesquelles je m'intéresse au file RSS c'est oui pour des raisons d'avoir de poursuivre des sites en ordre chronologique de façon plus plus structurée que de simplement les visiter à chaque jour ou à chaque x semaine mais aussi parce que je m'intéresse au file RSS en tant que médium et puis là je vais juste discuter très brièvement de quelques références donc la phrase bien connue de médium et de message de Marshall McLuhan qui porte la réflexion justement sur quand on parle de protocole de communication c'est quoi les différentes affordances les différentes possibilités données par différents médiums en quoi un message télévisé va être différent d'un message radiophonique par exemple il y a différents cours artistiques qui se posent à la question des questions sur le protocole de communication puis qui visent à se réinventer ou à se réapproprier donc entre autres le courriel ou le fax afin de se réapproprier et de détourner le protocole à des faits artistiques j'ai j'ai ajouté des références je vais en parler brièvement mais je pense que ça va être tout pour cette très brève présentation sur les files RSS donc merci pour votre attention et puis le code sur GitHub j'ai pas acheté de licence pour le moment mais ça ne serait tardé mon bus c'est pas mon bus c'est de partager ce mini script de générations de file RSS c'est que vous en inspirez pour créer vos propres sites j'ai ajouté quelques références donc le site web de Fidgen le request for comments sur internet engineering taskforce sur les files à tombe plusieurs références artistiques et puis c'est ce qui conclut ma présentation donc merci de m'avoir écouté merci beaucoup Edith je réinvite Duc qui va moderner nos questions j'en profite pour mentionner Copcom de Tébrièvement mentionné au passage beautiful soup qui veulent en savoir plus sur beautiful soup cette partie mystérieuse en plein milieu de la présentation d'Edith on va finir notre folie de programmation la semaine prochaine on va se concentrer sur beautiful soup je pense la parole à Duc merci Yannick merci Edith pour la présentation j'ai manqué tout un coup mon son a coupé j'ai démarré mon ordinateur j'ai manqué un peu à la fin mais ok j'ai envie tout le monde à poser votre question encore sous youtube ou sous notre meetup sous notre Slack dans le channel meeting on invite tout le monde à poser vos questions sur Youtube ou sur Slack channel via channel meeting Edith explique aussi l'anglais vous pouvez poser votre question en anglais moi j'ai j'ai manqué un peu mais est ce que comme j'ai entendu le feu RSS il n'est pas très est ce qu'on peut s'effapper quelque chose pour que s'il y a un changement quelque part et que je reçois le courriel ou peut-être quelque chose comme ça si je comprends je pense que de comprendre ce que tu veux dire c'est pas ce que j'ai dit un peu à la fin c'est que si je comprends bien c'est que quand il y a un changement sous une page web je peux reçois la notification oui comme moi ma méthode est beaucoup plus automatique c'est manuel il faut que j'aie mis à jour mon feu RSS ok je comprends c'est un framework de génération de sites web statiques ou un autre framework de génération de sites web front-end mais souvent ils vont générer automatiquement les updates à chaque fois c'est un changement ok parce que moi je suis plus axé sur le contrôle minutieux le contrôle minutieux de l'information qui est diffusée ok merci je regarde si on a pas d'autres questions ici ça ok je vais afficher la question c'est c'est afflux tiré afflux tiré je peux sûre de comprendre ta question je suis désolé je sais pas ce que tu veux dire par tiré exactement on va lui laisser tendre répondre pour que le meilleur moment pour cette discussion ça va être à 5 à 7 justement est-ce que tu vas rester un peu pour qu'on puisse discuter ok sinon je n'ai pas d'autres questions ici à-dessus des recommandations de clients attendre en général de mon expérience si c'est un client qui fonctionne pour RSS il va aussi fonctionner pour attendre je comment dire peut-être que c'est parce que je suis pas assez de ful à RSS que je vais dire ça mais pour le vrai le flux qui vient avec Ubuntu pour moi c'est suffisant mais c'est peut-être parce que j'en suis pas assez que je dis ça donc voilà ok je pense qu'on a plus de questions mais de toute façon on va aller à 5 à 7 on va continuer la discussion c'est bon merci Edith merci toi merci Edith donc avant qu'on passe au 5 à 7 j'avais quelque chose à ajouter que ça va manquer au début de la présentation vous avez promis une autre image de magnifique canon Yukon Air et la voici ah donc pas des kayaks mais de la la la ligne qui sépare les kayaks et les canaux est très immense probablement que ça ne pourrait pas être comme des kayaks mais bon, des beaux canaux Yukon Air avec les motifs Klingit que je trouve très agréables à regarder donc c'est tout pour les canaux, on va se concentrer maintenant sur le 5 à 7 qui est lui un réel de ce 5 à 7 et dans la description de ce vidéo sur Youtube et si vous regardez pas sur Youtube avec d'ici pymtlmid.evgenard.com .ca MP96 est-ce qu'on a d'autres choses à mentionner Yukon ben on cherche toujours quelqu'un qui veut t'es venu collaborer avec nous qui va nous aider à organiser des événements, qui va nous aider dans tout c'est ça c'est tout c'est tellement bien mentionné Duc, parce que c'est vrai il y a Alexandre qui nous mentionnait qu'on oublie de mettre le blog à jour pour parler de la présentation de ce soir et c'est exactement qu'est ce que Duc nous mentionne à l'instant c'est parce qu'on est seulement deux et puis d'un point on oublie de faire des choses donc si vous êtes mieux organisé que moi et Duc ben venez vous joindre à notre équipe pour avoir un blog beaucoup plus à jour mais sur ce on va arrêter de parler de blog puis on va commencer à boire de la bière on vous attend pour le 5 à 7 on fait ça, merci tout le monde bonne soirée